19:26:29)追加された行はこの色です。削除された行はこの色です。特徴の一つにマクロが作成できることが挙げられます。マクロを活用することによって、ミスの少ない仕上がりや作業効率の向上などの効果が期待できます。実用的な面を持つだけではなく、知的な趣味としても愉しむことができます。マクロの作成技術を身につけるにあたって必要な基本知識を列挙しておきましょう。これらの事柄を調べてゆくと自ずとマクロ作成技術が身に付くことでしょう。入門レベルの解説書では触れられていないことが多いです。『TeXブック』には当然解説されていますが、入手は困難なようです。[#i84d9f01](注意)この節の内容には、初学者にとっての理解のしやすさを優先するため、不正確な記述が含まれています。従って、リファレンスマニュアルとしての使用に堪えるものとはなっていません。読み込むファイルはテキストファイルであり、文字コードの羅列です。そこから様々な命令を読み取って動作します。平方根を組み立てる命令であることを読み取って,根号の中に2を収めたものを出力します。いう一塊のものとして認識されます。とって意味のある,それ以上分解できない一塊のものがトークンです。いう4つのトークンとして把握される(文字列をトークンに変換している)ことになります。ような名前によって区別されるトークンである「コントロールシークエンストークン」があります。コントロールシークエンストークンのことを単にコントロールシークエンスともいいます。このような解説文でコントロールシークエンスを記述する場合、例えば『TeXbook』などでは四角囲みの中にトークン名を収めて表しています。ここでは括弧で括って[sqrt]のように表してもいいかもしれません(ソースファイル中の“\sqrt”という文字列に対応するコントロールシークエンストークンの名前は“sqrt”であると考えます)。文字コードの羅列をトークンに変換してゆくプロセスは概ね次の規則に従います。あれば続く文字列から名前を読み取ってコントロールシークエンスに変換する。サブセクションで解説してみます。なければ,その1文字を単独の文字トークンとして読み取るここで「英文字」とは何かという問題がありますが,これについては次項「カテゴリーコード」を参照してください。ここではpTeXで使える日本語を含むコントロールシークエンストークンは考えません.コントロールシークエンスには二種類存在します.ひとつは上記の1のiに相当する,“\”のあとに英文字が続くものでこれをコントロールワードといいます.例えば,“\alpha”によって生成される[alpha]はコントロールワードです.もうひとつは上記の1のiiに相当する,“\”のあとに英文字以外の1文字が続くもので,これをコントロールシンボルといいます.例えば,\!によって生成される[!]はコントロールシンボルです.(注意)上の規則で“\”という文字を使いましたが、より正確には、カテゴリーコードが0である文字といったほうがよいでしょう。カテゴリーコードについては後の解説を参照してください。[#ta414729]さて、ここでコントロールワード[small]に続いて英文字の文字トークン“a”を置くことを考えて見ましょう。本文中で小さな文字を使って“a”という活字を印字したいという場面です。“\smalla”でしょうか?これでは駄目ですね。よって続く限りの英文字が取られて[smalla]というコントロールワードになってしまい、意図とは違ってしまいます。英文字以外のものを“\small”の後におけばよいのですから“\small:a”などとしてみます。今度は[small],“:”,“a”となってしまい間に余計な文字トークンが入ってしまいます。このように、コントロールワードに続けて英文字トークンを置きたい場合にはなにか区切りになるものが必要ですが、その区切り自体が余計なトークンになってしまうなら、困る場合も出てきます。そこで、区切り文字として空白文字を使った場合には例外的に、コントロールワードの名前の終わりを表す区切りとして認識したあとで、その空白文字を読み飛ばします。a”と入力することで解決されるわけです。空白文字の読み飛ばしについては、他にも考慮すべき例外ルールがあります。[#mef7a198]前節で触れた、「英文字」とは何か、という問題に答えるのがこの節です。TeXで処理するソースファイルはテキストファイルで、われわれの目には文字列のように見えていますが、その実体は文字コードの羅列です。一文字に8ビットのコードを割り当てるシステムでは文字コードは0から255までの数です。“a”という文字の文字コードは97となっています。TeXではこれらの文字を「英文字」や「空白文字」などに分類して、その分類を動的に変えられるようになっています。そのための仕組みがカテゴリコードの割り当て表です。“e”として読み込まれます。仕組みを利用して、“@”という文字を「英文字」と見なすように設定しておけば、同じ“\hoge@hoge”という文字列から、[hoge@hoge]というたった一つのコントロールシークエンスが読み取られることになるわけです。コンピュータプログラムなので、「英文字」とか「空白文字」という概念を理解しているわけではなくて、単に11番目のカテゴリーだとか5番目のカテゴリーだとか把握しているのです。「“a”は英文字だ」という代わりに「文字コード97の文字は11番目のカテゴリーの文字だ」という具合です。ある文字コードの文字がどの分類に属するかを記憶しているわけです。よる文字の分類を一覧表にしてみましょう。テキストファイルから文字コードの羅列を読み込んでトークンに変換していくとき、カテゴリーコードが0か否か、および11か否かということは特別な意味を持ちます。カテゴリーコードが0の文字はコントロールシークエンスの始まりを表し、その後にカテゴリーコード11の文字が続く限りそれがコントロールシークエンスの名前になるからです。その他のカテゴリーの文字は単独の文字トークンとなるわけですが、このとき、その文字トークンには対応するカテゴリーコード付与されます。いうプリミティブ命令を使います。\catcode97=12のようにします。個の文字トークンが続いたものとして読み取られることになります。(今日はとりあえずここまで。続きはいつになるか分かりません。おける条件分岐は、他のプログラミング言語の条件分岐とはまったく異なるものです。先入観を持っていると混乱するでしょう。文というものが用意されています。文は、論理演算子を組み合わせた論理式の真偽値を算出して、それに応じて処理を分岐します。論理式はおろか論理演算子というようなものすらもありません。状態を問い合わせるものや、二つのトークンが同じものかどうか比較するものなど、ごく限られたものしかありません。する動作というものは、条件に応じて処理を分岐するのではなく、条件に応じて実行する必要がなくなった部分を読み飛ばすに過ぎません。おける条件分岐は、他のプログラミング言語の条件分岐とはまったく異なるものです。先入観を持っていると混乱するでしょう。文というものが用意されています。文は、論理演算子を組み合わせた論理式の真偽値を算出して、それに応じて処理を分岐します。論理式はおろか論理演算子というようなものすらもありません。状態を問い合わせるものや、二つのトークンが同じものかどうか比較するものなど、ごく限られたものしかありません。する動作というものは、条件に応じて処理を分岐するのではなく、条件に応じて実行する必要がなくなった部分を読み飛ばすに過ぎません。基本的な例を見てみましょう。ついての先入観を招きそうだと考えたためです。$P$\fiこの例は、“P”という文字をいつでも数式イタリック体で印字しようというものです。よってもとのモードに復帰させればよいでしょう。次のようなトークンの列として読み込まれます。プリミティブ命令です。いう名前から推察されるとおりです)。数式モードならば、[else]や[fi]を見つけるまではそのまま処理を続けます。この状態で[else]を見つけたならば、それ以降は[fi]を見つけるまでひとつひとつのトークンを読み飛ばしてゆきます。そのあとに続く処理を続行します。“fi”というのは“if”の逆さつづりで、開き括弧と閉じ括弧が左右逆向きになっているのを連想させるようなしゃれでしょう。いう英単語があるというわけではないようです。現在のモードが数式モードでなかった場合を考えましょう。[ifmmode]のあとに続くトークンを[else]や[fi]を見つけるまでひとつずつ読み飛ばしていきます。この状態で[else]を見つけたならば、読み飛ばすのは止めにして[else]のあとに続くトークンに従って処理を続けてゆきます。そのあとに続く処理を続行します。条件分岐処理は、上の例で[ifmmode]が担っていた条件判断の部分に何種類かのプリミティブ命令が用意されているだけで、あとのトークンの読み飛ばし方や、[else]や[fi]の扱いについては同じです。代わりに使える条件分岐命令を列挙してみましょう。|\ifmmode|現在のモードが数式モードかどうか||\ifhmode|現在のモードが水平モードかどうか||\ifx<トークン1><トークン2>|<トークン1>と<トークン2>が同じトークンかどうか。学習効果が高い、しゃれた問題を作るのは大変そう。『TeXbook』を読めばいいってのは言いっこなし(^^;)いい問題ができたら書き込みましょう。あるなどとはつゆほども思わない読者を想定していました。欠陥問題じゃないかと思うような読者にはぜひ執筆側に回ってもらいましょう(^^)問題によっては解答がコメントとして書かれており,上の「差分」から見ることができます。+余分な空白を嫌って全ての行末に``%''が付加されているが、不要なものもある。“行末%”に関するはじめの問題を書いたものです。図らずも練習問題に含める失敗例としては面白い要素になっていたようですね。上手く発展させていただけたようで、ありがとうございます。二つの問題を統合してしまえればすっきりとしそうです。「入門」の一項目にするのではなく,別途「マクロの作成・応用」のようなページにされた方が良いように思いますが,いかがでしょうか。コンテンツが充実したら構成を見直すということでよろしいかと思います。マクロは自分で読めるようになるという意味では、入門としてはプリミティブの範囲に収まるものとしてもよいような気もします。このページの構成自体についてもいろいろご意見があるようなので、コメント欄を追加してみました。ついでに勝手ながら過去のコメントを表に出してみました。