マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

TeXのプリミティブで展開可能なやつ(1)

まとめてみた。

注意事項

  • 多くのプリミティブは展開結果が必ず\the-文字列になる。そうでないものについて注意のため印を付けている。
    • 無印:(状態変化無しで)展開結果が必ず\the-文字列になる。
    • ★印:(状態変化無しで)展開結果が\the-文字列以外になりえる。
    • ☆印:展開に付随して内部状態が変化し、展開結果が必ず空になる。
    • ◇印:展開に付随して内部状態が変化し、展開結果が非空になりえる。
  • 各項目の説明には「そのプリミティブの一回展開結果のトークン列が何か」を記した。ただし☆・◇印のものは“動作”を記した。
  • 展開結果の記述に関する注意:
    • 展開結果が“文字列”として述べられている場合、それは実際には\the-文字列*1を指す。
    • 数値・寸法・グルー値を\the-文字列として表す場合の書式は「そのデータ型のパラメタを\theで出力する場合」と同じである。※例えば寸法値10ptは10.0ptという\the-文字列で表される。
  • 引数の記述に関する注意:
    • 角括弧 [ ] は省略可能であることを示す。角括弧自体は入力しない。
    • 引数が“文字列”として述べられている場合、それは「与えられたトークン列を完全展開して脱トークン化した結果の文字列」が使われることを示す。
    • 引数に現れる“フォント”は「fontdefトークン」「\font」「\textfont‹整数›」「\scriptfont‹整数›」「\scriptscriptfont‹整数›」の何れか*2を指す。

元祖TeXのやつ

  • “条件トークン”☆:TeXの内部の「条件判断に関する内部状態」を変化させる。

    • “条件トークン”とは「if-トークン」「\else」「\or」「\fi」を指す。元祖TeXがもつif-トークンは以下の通り:
      • \if‹トークン1›‹トークン2›
      • \ifcase‹整数›
      • \ifcat‹トークン1›‹トークン2›
      • \ifdim‹寸法比較›
      • \ifeof‹整数:ストリーム番号›
      • \iffalse
      • \ifhbox‹整数:ボックス番号›
      • \ifhmode
      • \ifinner
      • \ifmmode
      • \ifnum‹整数比較›
      • \ifodd‹整数›
      • \iftrue
      • \ifvbox‹整数:ボックス番号›
      • \ifvmode
      • \ifvoid‹整数:ボックス番号›
      • \ifx‹トークン1›‹トークン2›
    • 詳細は以下の記事を参照。
  • “マーク変数” ★:現在の状況で(各々のマーク変数の機能に即して)該当するマークのトークン列。

    • ここで“マーク変数”は以下のものを指す:
      • \botmark
      • \firstmark
      • \splitbotmark
      • \splitfirstmark
      • \topmark
  • \csname‹トークン列›\endcsname ◇:「‹トークン列›を完全展開して得られる文字トークン列を脱トークン化した文字列を名前とする制御綴」のトークンに展開される。

    • 当該の制御綴が未定義の場合は、「その制御綴がローカルに\relaxに等値される」という副作用をもつ。
    • 完全展開の結果に制御綴が含まれる場合はエラーになる。
    • \endcsname自体は展開不能である。
  • \endinput ☆:現在のファイルからの読込を「既に読んだ行」までで停止する。

  • \expandafter‹トークン1›‹トークン2›… ★:‹トークン1›の後に「‹トークン2›以降のトークン列を一回展開した結果」を続けたトークン列。

  • \fontname‹フォント›:そのフォントの定義を表す文字列。

    • 書式は「‹TFM名› at ‹寸法:使用サイズ›」だが、使用サイズがデザインサイズに等しい場合は「‹TFM名›」のみになる。
  • \input‹ファイル名› ☆:以降は指定のファイルから入力を読むようになる。

    • 引数の‹ファイル名›は空白トークン(これは吸収される)または展開不能の制御綴で終結する。引数が終結するまで完全展開が起こる。
    • ただし最近の処理系だと文字列をクオートする("…"で囲う)ことで「空白を含むファイル名」を引数にとれる(参照)
    • もっと最近の処理系だと\input{‹ファイル名›}のように引数を波括弧で囲う書式も可能である。この場合は「引数のトークン列を完全展開した結果(制御綴を含んでもよい)を脱トークン化した文字列」がファイル名として用いられる。
  • \jobname:ジョブ名の文字列。

    • 「ジョブ名」はコマンドオプションの-jobnameの値。既定値はシステム依存だが、多くの場合は「最初に読んだファイルのベース名」になる。
  • \meaning‹トークン›:そのトークンの意味を説明した文字列。

    • 例えば、\meaning$は「math shift character $」、\meaning\quadは「macro:->\hskip 1em\relax」に展開される。
  • \noexpand‹トークン› ★:引数のトークンを展開不能にしたトークン。

    • 通常は展開限定文脈において「引数のトークン自身に展開されそれ以上展開されない」という挙動のために用いられる。
    • 引数のトークンが元々展開不能だった場合は単純にそれ自身になる。展開可能だった場合は「一時的に意味を\relaxに置き換えた」トークン(なので、展開限定文脈外においてそれが実行されたとしても何も起こらない)になる。厳密な仕様は結構ヤヤコシイ。
  • \number‹整数›:その整数の(典型の)十進表記の文字列。

  • \romannumeral‹整数›:その整数の小文字ローマ数字表記の文字列。ゼロ以下の場合は空になる。

  • \string‹トークン›トークンが文字トークンの場合は、その文字。制御綴の場合はそれを文字列化したもの(後続の空白は無し)。

    • 「制御綴の文字列化」は、制御綴名の前に\escapecharの文字を前置した形の文字列。ただし\escapecharが(欧文)文字コードの範囲外の値の場合は何も前置されない。
  • \the‹内部値›:その内部値(レジスタ・パラメタ)の現在の値を表すトークン列。普通は\the-文字列であるが、以下の場合は例外となる:

    • \the‹トークン列レジスタ・パラメタ› ★:そのレジスタ・パラメタが現在保持するトークン列そのもの。※展開限定文脈である場合はそれ以上展開されない。
    • \the‹フォント› ★:そのフォントを選択するためのfontdefトークン。
      • ここで生じるトークンの“外形”については少しヤヤコシイことになっている。

e-TeXのやつ

  • e-TeX拡張のif-トークン ☆:

    • \ifdefined‹トークン›
    • \ifcsname‹トークン列›\endcsname
      \csnameと異なり“\relax化”の副作用を決して起こさない。
    • \iffontchar‹フォント›‹整数:文字コード›
  • e-TeX拡張の“マーク変数”★:

    • \botmarks‹整数:マーク番号›
    • \firstmarks‹整数:マーク番号›
    • \splitbotmarks‹整数:マーク番号›
    • \splitfirstmarks‹整数:マーク番号›
    • \topmarks‹整数:マーク番号›
  • \detokenize{‹トークン列›}:引数のトークン列を(展開せずに)脱トークン化した結果の文字列。

    • 結果は\the-文字列であることに注意。実質的に「(字句解析前の)文字列に戻す」働きをもつのは\scantokensの方である。
  • \eTeXrevision:e-TeXのリビジョン番号の文字列。

    • なお\eTeXversionは読取専用整数パラメタである。
  • \scantokens{‹トークン列›} ☆:「引数のトークン列を(展開せずに)脱トークン化した結果の文字列」を内容とする仮想的な入力ファイルを作って、以降はこの仮想的なファイルから読み込むようにする。

  • \unexpanded{‹トークン列›} ★:引数のトークン列自身。※展開限定文脈である場合はそれ以上展開されない。

    • 展開限定文脈以外では普通に展開される。\the‹トークン列レジスタ・パラメタ›の展開と同じ規則である。
  • \unless‹ifトークン›… ☆:後続の条件部の真偽を反転させた条件文を開始する。

    • \unlessの直後に真偽型のif-トークンそのものが続く必要がある。条件部を含めて一回で展開されることに注意。

(続く)

*1:「\the-文字列」は「TeXの文字トークン列によって文字列を表現する」際の規約で、ASCII空白(文字コード32)についてはカテゴリコード10、それ以外の文字についてはカテゴリコード12の文字トークンを用いる。

*2:\textfont・\scriptfont・\scriptscriptfontの引数の整数は数式ファミリ番号を指す。