マクロツイーター

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

\pdfstrcmp のお話 (3/3)

\pdfstrcmp 等の LuaTeX で削除された pdfTeX の機能を LuaLaTeX で使うためのパッケージ((LaTeX 以外のフォーマットでも \input で読み込めば使用できる。))が pdftexcmds パッケージ(Heiko Oberdiek 氏制作)である。これを読み込むと \pdf@strcmp という名前で \pdfstrcmp の機能が提供される。


\documentclass[a4paper]{article}
\usepackage{pdftexcmds}
\makeatletter
\edef\result{\pdf@strcmp{\string \relax\space$}{\relax \expandafter\@gobble\string\$}}
\makeatother
\begin{document}
\result
\end{document}

このパッケージの目的は、エンジン間でのインタフェースの差異を吸収するために共通の制御綴(\pdf@sttrcmp を与える((pdftexcmds は「パッケージ開発者のためのパッケージ」なので、「公開される命令」の制御綴が @ を含んでいる。)))ことであり、\pdfstrcmp 自体をこの名前で他エンジンで使えるようにすることではない。上記のサンプルは pdfLaTeX/XeLaTeX/LuaLaTeX のいずれでもコンパイル可能で、「0」が出力される(さらに e-(u)pLaTeX でも大丈夫である)。

\pdfstrcmp 自体を模倣できた方が都合がよいと考える人もあろうが、実はそれは不可能であり、その理由は「マクロを使う限り結果を 1 回の展開で得られない」からである。プリミティブである \(pdf)strcmp は 1 回の展開で結果(「-1」「0」「1」のいずれかの文字列)に辿り着く。対してマクロではそうはならない。pdftexcmds での LuaTeX 用の \pdf@strcmp の実装は以前の記事に挙げたものと同等である。\directlua の実行は 1 展開で行われるので、このマクロは「最小回数」である 2 回で結果に辿り着くが、1 回にはなり得ないのである。