マクロツイーター

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

次世代の pTeX に関する何か (1)

2014/12/01 〜 2014/12/25

TeX & LaTeX Advent Calendar

TeX で騒げ、TeX で笑え〜
TeX & LaTeX アドベントカレンダー 2014

18 日目の ZR さんのネタはこちら。

*  *  *

こちらの記事の方は、最近 TeX Forum などでチョット話題になっている新エンジン pTeX-ng についての何かである。特に注意すべき、既存の TeX エンジンとの相違点を中心に解説する。(念のため注意しておくと、“普通の LaTeX ユーザ”が pTeX-ng エンジンを“普通に”利用できる環境はまだ整っていない。)

※この記事は飽くまで現時点での状態を述べたものである。

[2015-01-20 補足] 最新の pTeX-ng [2015-01-04] に合わせて修正。

コマンドインタフェースの相違点

pTeX-ng は嘗ての Y & Y 社による C 言語版の TeX 実装を基にしている。そのため、普段使っている“普通の”TeX エンジン(Web2C 実装)と比べると、(言語処理系でなく)コマンドインタフェース部分に色々と相違があり、例えばオプションの体系は丸っきり異なる。今回はその辺りを開設する。

なお、コマンドインタフェース仕様については、そもそも“普通の TeX エンジン”についても、ほとんどの人が詳しい仕様を知らないと思う。従って、普通のエンジンと pTeX-ng の仕様を対比する形で解説を進めることにする。

コマンドライン書式: 普通のTeXの場合

“普通の” TeX コマンド(tex、pdftex、platex 等)は次のようなコマンドライン書式をもつ。

tex [-<オプション>]... [&<フォーマット>] [<ソースファイル名>] [<TeXコード>]...

基本的に、この順番に従って、オプション(‘-’で始まる)でもフォーマット指定(‘&’で始まる)でもない一番初めの引数が(あれば)ソースファイル名となり、次の引数からが<TeXコード> であると解釈される。例外として、もし当該の引数が ‘\’で始まっている場合は、ソースファイル名は指定無しと見做され、その部分から <TeXコード> であると解釈される。何れにしても、このコマンドラインで次の動作が行われる。

  • 指定のオプションに従った設定で、エンジンを起動する。
  • 指定のフォーマットファイルを読む。例えば、「pdftex &latex」であれば latex.fmt が読み込まれる。((フォーマットファイルはエンジンに依存する。例えば、platex.fmt は e-pTeX エンジン(eptex)専用なので、「pdftex &platex」を実行すると致命的エラーで終了する。))もしフォーマット指定(&...)がない場合は、起動コマンド名をフォーマット名とみなす。例えば、「pdftex」であれば pdftex.fmt を読み込む。((実際には、 -fmt というオプションもあり、この指定が一番優先される。))
  • 指定のソースファイル(拡張子省略の場合は .tex が補われる)を読み、そこに書かれたコードを実行する。
  • まだエンジンの実行が終了していない(\end プリミティブ((LaTeX\end とは別物。))が呼ばれていない)場合は、コマンドライン引数の <TeXコード> の部分のコードを実行する。
  • まだエンジンの実行が終了していない場合は、対話モードに移行する。

例えば、

eptex -syntex=1 &platex null \stop

というコマンドラインを実行する*1と、e-pTeX のエンジンが syncTeX 有効で起動し、platex.fmt を読み(つまり“pLaTeX が起動する”)、検索パス上にある null.tex *2を読み込み、(まだ終わらないので)次に \stop*3が実行されてそこで終了する。

pTeX-ng の場合は

コマンドラインの書式は以下のようになっている。

ptex-ng [-<オプション>]... [+<フォーマット>] [<ソースファイル名> [<TeXコード>]...]
  • フォーマット指定の接頭辞は ‘+’ である。(ただし普通のエンジンと同じ ‘&’も使えるらしい。)
  • 先に述べた、「ファイル名に相当する引数が ‘\’ で始まる場合」の例外規則がない。Windows 環境で「ptex-ng \relax」とすると “\relax.tex” を読み込もうとする。
  • 「ソースファイル名の後ろにコードを書く」ことは pTeX-ng でも有効である。*4ただし、その場合はソースファイル名を省略できない。*5
  • オプションの体系は普通の TeX と全く異なる。(「euptex --help」と「ptex-ng --help」の出力を見比べてほしい。)
  • 先に示した動作の手順については特に違いがないようである。

対話モードの先頭行: 普通のTeXの場合

TeX エンジンの対話モードでは、通常は ‘*’ のプロンプトが表示されている。しかし、オプション以外の引数を与えずにコマンドを起動した場合、次のように ‘**’ のプロンプトが現れる。

C>eptex
This is e-pTeX, Version 3.14159265-p3.5-141210-2.6 (sjis) (TeX Live 2014/W32TeX)
 (preloaded format=eptex)
 restricted \write18 enabled.
**

この状態では、先に示したコマンドライン引数のうち、オプションより後にあるものを(同じ書式で)入力できる。つまり、オプション以外の引数は「起動時でなく、起動直後にも指定できる」ということである。ただし、既に述べた「引数の解釈の規則」に従うと、ここでの入力の先頭が ‘\’ である場合は、(普通の‘*’プロンプトの時と同じく)それ全体が TeX コードと解釈される。

pTeX-ng の場合は

「‘**’ プロンプト」に関しては、pTeX-ng でもほぼ同様の仕様になっているようである。この場合もフォーマット指定の文字は ‘+’ (または ‘&’)である。

また、コマンドラインでの入力と異なり、‘**’ プロンプトの入力では「\ で始まるものはソースファイル名とみなさない」の規則が有効である、ようである。

先頭行パージング: 普通のTeXの場合

先程は対話入力の先頭行の話であったが、実はファイルからの入力についても先頭行には特別な機能がある。次のように、先頭行を %& で始めたとする。

[source.tex]
%&platex

すると、「eptex source 」は「eptex &platex source」と等価になる。すなわち、 source.texコンパイルした場合にはフォーマットとして platex.fmt が指定される。この機能のことを「先頭行パージング(first-line parsing)」と呼ぶ。((なお、先頭行パージングは、texnf.cnf の設定およびオプション -no-parse-first-line により無効化できる。))

pTeX-ng の場合は

どうやら、pTeX-ng は、先頭行パージングをサポートしていないようである。

補助機能の相違点

次にコマンドラインで制御する機能についての違いを挙げる。主だったところでは、pTeX-ng は以下の点が “普通の” TeX と異なっている(ように見える)。

  • shell escape(\write18)をサポートしていない。
  • 入出力文字コードUTF-8、内部漢字コードは Unicode(upTeX の既定と同じ)に固定されている。
  • source special および SyncTeX 機能をサポートしていない。※2015-01-04 での改訂で SyncTeX のサポートが追加された。
  • 起動時の対話モードの設定(-interaction-halt-on-error に相当するもの)がサポートされていない。
  • e-TeX 拡張は常に有効である。((INI モードで先頭行を入力すると無条件に拡張が有効化される。先頭に ‘*’ があった場合、それは吸収される。))

pTeX-ng が独自で持っている面白い機能としては、「f-リガチャの抑止」がある。起動時に -suppressfligs オプションを与えると、fi、ffl 等の「f-リガチャ」が無効になる。(その他の〈''〉や〈---〉等のリガチャには影響しない。)*6

[f-リガチャ有効]
[f-リガチャ無効]

(続く)

*1:実際にコマンドシェルで実行する場合は、シェルの特殊文字を適切に扱う必要がある。

*2:TeX Live の場合、実質空っぽのファイル null.tex が検索パス上に配置されている。

*3:コンパイルを強制終了させる LaTeX の命令。

*4:ヘルプ出力には書いてないけど。

*5:もちろん、先ほど紹介した null.tex やヌルデバイスを利用すれば、それと同等のことができる。

*6:つまり、TFM で設定されたリガチャのうち、左端が〈f〉(0x66)であるもののみ無効化される。