マクロツイーター

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

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

前回の続き。今回が最終回で、LuaTeXについて。

\U~の系列についてはXeTeXの記事を参照。

LuaTeX関連の注意事項

※一般の注意事項については初回の記事を参照。

  • だめだ LuaTeXなにもわからない😭

LuaTeXのやつ

  • \begincsname‹トークン列›\endcsname ★:「‹トークン列›を完全展開して得られる文字トークン列を脱トークン化した文字列を名前とする制御綴」について、その制御綴が定義済ならそのトークン、未定義なら空に展開される。

    • \csnameと同様に、完全展開の結果に制御綴が含まれる場合はエラーになる。
    • \csnameと異なり“\relax化”の副作用を決して起こさない。
  • \csstring‹トークン›トークンが文字トークンの場合は、その文字。制御綴の場合はその名前。

    • \stringと異なり制御綴名の前に\escapecharの文字は前置されない
  • \directlua[‹整数:名前番号›]{‹文字列›} ☆:引数の文字列をLuaコードとして実行する。

    • 名前番号を指定した場合は、チャンク名*1lua.name[‹名前番号›]の値が指定される。
    • 実行後、「LuaライブラリのTeXバッファ出力機能によって出力された文字列」を内容とする仮想的な入力ファイルを作って、以降はこの仮想的なファイルから読み込むようにする。
      Luaプログラムを実行する他のプリミティブについても実行後の処理方式は同様である*2
    • LuaライブラリでTeXトークンを出力することも可能なはずだけど、その扱いの詳細については未調査。
    • なお\lateluaは展開不能である。
  • \dvifeedback何これ?

    • 多分\pdffeedbackと同じ使用法だろうが、マニュアルに未記載。
  • \dvivariable何これ?

    • 多分\pdfvariableと同じ使用法だろうが、マニュアルに未記載。。
  • \fontid‹フォント›:そのフォントを一意に指定する番号(整数)。

    • 実装上は\pdffontname(LuaTeXでは\pdffeedback fontname)と同等なのかもしれない。
  • \formatname:使用中のフォーマットについて、フォーマット作成時(ダンプ実行時)の\jobnameの値。

    • INIモードにおいては空になる。
  • \ifcondition:展開しても何も起こらず、また「条件判断に関する内部状態」も変化させないが、「条件不成立による読み飛ばし」の際にはこのプリミティブは「if-トークンの一種である」と見なされる。

    • 要するに「if-均衡を回復させるための\@gobble\if」と同じ役割のはず。
  • \immediateassigned{‹トークン列›} ☆:引数のトークン列に書かれた「TeXの代入文」(複数可)を実行する。

    • つまり普通のTeXの代入を展開限定文脈で実行できる
    • 引数は「TeXの代入文」のみからなる*3必要がある。
    • 代入文の種類には制限がある(例えばボックスの代入は不可)らしい。
  • \immediateassignment‹代入文› ☆:直後に続く単一の「TeXの代入文」を実行する。

    • 実行される代入文が1つであることを除いて\immediateassignedと同じ。
  • \lastnamedcs ★:最後の\csname\ifcsname\begincsnameの実行で生成された制御綴のトークン。

    • \ifcsname\begincsnameを用いて当該制御綴が未定義だった場合は「無効な制御綴を表す特殊なトークン」になる。
    • 従って厳密にいうとLuaTeXでは\ifcsname\begincsnameは副作用をもつ。
  • \luabytecode‹整数› ☆:その番号のLuaバイトコードレジスタが保持するLua関数を実行する。

  • \luaescapestring{‹文字列›}:その文字列に対して「Luaの文字列リテラル」用のエスケープを適用した結果の文字列。

    • 外側のクオート""は付かない。
  • \luafunction‹整数› ☆:Lua関数テーブルのその番号の項目が保持するLua関数を実行する。

    • Lua関数テーブルの値(Lua関数)はフォーマットに保存されない*4
  • \luatexbanner:エンジンのバナー文字列。

  • \luatexrevision:エンジンのリビジョン番号。

    • なお\luatexversionは読取専用整数パラメタである。
    • 例えばバージョン番号が「1.9.2」の場合、\luatexrevision2に展開される(ドットは付かない)。\luatexversionは109になる。
  • \mathstyle:現在の数式スタイルを表す整数。

    • 値:0=D、1=D′、2=T、3=T′、4=S、5=S′、6=SS、7=SS′、-1=数式外。
    • TeXの数式読取の仕組に起因する制限のため、実用するには\Ustackと組み合わせる必要がある(参照)
  • \pdffeedback‹名前›:指定の名前の「PDFフィードバック」の値を返す。

    • 「PDFフィードバック」は何らかの「PDF機能に関する読取専用のパラメタ」を表し、名前によって互いに区別される。
    • これらはpdfTeXにおいては「読取専用のパラメタである」または「値に展開される」ような個別のプリミティブとして提供されていた。例えば、「\pdffeedback creationdate」はpdfTeXの\pdfcreationdateに相当する。
    • \pdffeedbackはその引数を含めて一回の展開で「値を表す文字列」に展開される。例えば、\pdffeedback pageref‹整数›は(pdfTeXの\pdfpageref‹整数›と同じく)一回展開すると整数値の文字列になる。
    • 引数の‹名前›の読取が独特である。
      • \pdffeedbackの後に続くトークン列を順次展開していって、それまでに得た文字トークン列が「有効な名前の一つに一致する」か「有効な名前のどの接頭辞とも一致しなくなる(制御綴に当たった場合も含む)」時点で終結する*5
      • 従ってこの引数については「終結用に吸収されるトークン」という規定が存在せず、直後に続く空白トークンや\relaxは常に有効になる。
  • \pdfvariable‹名前› ★:指定の名前の「PDF変数」を意味とする単一トークン。

    • 「PDF変数」は何らかの「PDF機能に関する読書可のパラメタ」を表し、名前によって互いに区別される。
    • これらはpdfTeXにおいては「読書可のパラメタ」である個別のプリミティブとして提供されていた。例えば、「\pdfvariable compresslevel」はpdfTeXの\pdfcompresslevel(整数パラメタ)に相当する。
    • \pdfvariableを一回展開すると「当該のパラメタ(データ型はPDF変数の種類により異なる)を意味とする単一のトーク*6」になる。例えば「\pdfvariable compresslevel」の一回展開は整数パラメタとなる。
    • 引数の‹名前›の読取の挙動は\pdffeedbackと同じ。
  • \scantextokens{‹トークン列›} ☆:「引数のトークン列を(展開せずに)脱トークン化した結果の文字列」を内容とする仮想的な入力ファイルを作って、以降はこの仮想的なファイルから読み込むようにする。

    • \scantokensの変種で、より「マクロの展開」に近い動作になるようにしたもので、以下の点が異なる:
      • 末尾に\endlincharの文字が付かない。
      • 「入力ファイル境界検査」が抑止される。

*1:Luaチャンク名は、Luaインタプリタからの情報表示の際に用いられる。

*2:つまり厳密にいうと「Luaから吐かれたもの」は展開結果ではない。展開結果は空であることになるので☆印を付けた。

*3:厳密にいうと:普通にトークン列を実行していった際に、展開不能であるトークンは「代入文を開始するもの」でなければならない。

*4:従って通常の(非INIの)使用においては、Luaバイトコードレジスタは「フォーマット作成時(INIモード)に登録された関数」を読み出すのに専ら利用され、それ以外の用途ではLua関数テーブルが利用される。

*5:後者の場合、警告を出した上で、\pdffeedbackを無かったことにして引数として読んだトークン列をバッファに返す。

*6:ここでいう「パラメタを意味とするトークン」というのは\dayや\parindentの類(TeXbookでは“parameter”と呼ばれている)のことであり「パラメタトークン」(TeXbookでは“parameter token”)のことではない。