fixedpoint.jp


C trigraph, digraph, and TeX ^^ convention (2007-05-27)

ANSI C には trigraph という単一の文字を表すための記法があります。この記法が導入された理由は、ASCII のサブセットである ISO 646 invariant 文字セットに収まらなかった9つの文字の存在でした。

これらの3文字からなる文字列を処理するのはプリプロセッサであり、K&R でも書かれている通り、あらゆるプリプロセスに先駆けて trigraph の置換が行われることになっています。

当然ソースファイルに含まれる任意の文字の並びで trigraph を構成するものは優先的に処理されるため、例えば文字列リテラルに '??!' を含めるためには回り道をしなくてはなりません。

この課題が認識されてから制定された最近の標準である C99 では、trigraph に似た digraph が導入されています。digraph は2文字もしくは4文字からなる文字列で1文字もしくは2文字を表します。trigraph と異なり、クオートされた文字列、文字定数、コメントの中では利用できないとされ、trigraph にあった課題がうまく避けられています。

trigraph や digraph のようなプリプロセッサによるマクロに先立った置換処理は、TeX にもあります: ^^ 記法です。2つの文字からなる並び '^^' に1文字もしくは2文字を続けることによって、ASCII の範囲の任意の1文字を表します。

よく登場する例として '^^M' が改行、'^^I' がタブに相当します。

この ^^ 記法は trigraph と比べてさらに「何でもあり」になっています。

したがって ^^ 記法で表された1文字が再び ^^ 記法を構成する文字列の並びになる可能性があります。こうして、下の2つの正しい (La)TeX ソースは全く同じ結果を生みます。

\documentclass{article}
\usepackage{color}
\pagestyle{empty}
\begin{document}
the first band on the moon!
\end{document}
\documentclass{article}
\^^5e^5sepackag^^%{color}
\pagestyle{empty}
\begin{document}
t^^68e first band on the moon^^21
\end{document}

© 2006-2023 fixedpoint.jp