マクロツイーター

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

LaTeX 上で色々と実装してみる話(ナベアツ編-3)

前回の続き)

今までは「TeX で実装された言語」を扱った。ここからは、既存の言語処理系(またはそのエンジン)と TeX 処理系の連携で動作するものを紹介する。

LuaTeX(+ luacode パッケージ)
(参照:アレ

みなさんご存じの LuaTeX。これは TeX 処理系に Lua 言語のエンジンを組み込んだものなので、1 つのプロセスの中で TeXLua の連携が完成する形になっている。

LaTeX 文書の中に Lua コードを支障なく書けるように luacode パッケージを利用している。

[nabeazz-luatex.tex]
\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
(つづけ)

*1:Windows 版の TeX Live には Perl の処理系も含まれていてそれを利用するので。