18 日目の ZR さんのネタはこちら。
- TikZ で“インラインな”図を描く(Qiita)
こちらの記事の方は、最近 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、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の場合
先程は対話入力の先頭行の話であったが、実はファイルからの入力についても先頭行には特別な機能がある。次のように、先頭行を %&
で始めたとする。
%&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
(続く)