今までは「TeX で実装された言語」を扱った。ここからは、既存の言語処理系(またはそのエンジン)と TeX 処理系の連携で動作するものを紹介する。
LuaTeX(+ luacode パッケージ)
みなさんご存じの LuaTeX。これは TeX 処理系に Lua 言語のエンジンを組み込んだものなので、1 つのプロセスの中で TeX と Lua の連携が完成する形になっている。
LaTeX 文書の中に Lua コードを支障なく書けるように luacode パッケージを利用している。
\documentclass{article} \usepackage{luacode} \usepackage{type1cm} \newcommand*{\AhoFont}[1]{{\usefont{OT1}{cmfr}{m}{it}\LARGE #1}} \newcommand*{\NabeAzz}[1]{\luaexec{nabeazz(#1)}} \begin{luacode*} function nabeazz(n) for i = 1, n do local aho = (i % 3 == 0 or string.find(i, "3")) tex.print(("%s{%d}"):format(aho and "\\AhoFont" or "", i)) end end \end{luacode*} \begin{document} \NabeAzz{40} \end{document}
以下のコマンドでコンパイルできる。
lualatex nabeazz-luatex.tex
PerlTeX (perltex パッケージ)
「LaTeX とプログラミング言語処理系の連携」では古参というべき PerlTeX(パッケージ名は perltex)。\perlnewcommand
という命令で「LaTeX の命令を Perl で直接定義できる」のが特徴。((LuaTeX の \directlua
のように、「コード記述が verbatim でない処理系呼出」を用いれば同様の「LaTeX 命令の直接定義」ができるが、そもそも verbatim でないと長いコードが極めて書きにくい。\perlnewcommand
の引数は verbatim であり、\NabeAzz
命令の引数は「#1
」ではなく $_[0]
で表されることに注意。))Perl スクリプトから TeX を起動した後それと自身のプロセスを並行動作させてプロセス間通信を利用するという形で連携を行っている。((名前付きパイプを用意して、TeX 側が特定の名前のパイプを \input
したら Perl 側が作動するという具合になっている。))
\documentclass{article} \usepackage{perltex} \usepackage{type1cm} \newcommand*{\AhoFont}[1]{{\usefont{OT1}{cmfr}{m}{it}\LARGE #1}} \perlnewcommand*{\NabeAzz}[1]{ return join(' ', map { ($_ % 3 == 0 || /3/) ? "\\AhoFont{$_}" : $_ } (1 .. $_[0])); } \begin{document} \NabeAzz{40} \end{document}
このファイル名を nabeazz.tex とすると、以下のコマンドでコンパイルできる。もちろん、pdflatex
のところを別のエンジンに変えることも可能である。ちなみに、TeX Live では PerlTeX は何も準備しなくてもそのまま使えるようになっている。*1
perltex --latex=pdflatex nabeazz.tex