[2012-06-05編集]記事の内容を書き直した。(参照)
BXluatool バンドルの話の続き。
この中の bxluafacade パッケージは、以前の ixbase0 パッケージを再編したもので、bxluafacade + luacode の組み合わせで ixbase0 と大体同じ機能が得られる。bxluatool パッケージは bxlua... の名前のパッケージを一度に読み込む。
テンプレートな環境を実装する
「環境を verbatim に読み込む」の話の続き。
「怯まず Lua で LaTeX してみた」の節『事例 8: テンプレート的 LaTeX』において、「LaTeX 文書に Lua コードを混ぜる」という話をした。つまり、適当なテンプレートエンジンを使うと、LaTeX のコードだけで
\begin{luacode*}templatex[==[ <? for i = 1, 5 do ?> $<?= i ?>^2 = <?= i^2 ?>$; <? end ?> ]==]\end{luacode*}
(execluacodeblock 環境を luacode* に置き換えた)のようなことができるという話である。その際に、入力形式としては、
\begin{templatex} <? for i = 1, 5 do ?> $<?= i ?>^2 = <?= i^2 ?>$; <? end ?> \end{templatex}
と書けるのが望ましいが、これは TeX 言語のコーディングが必要であると述べた。
TeX 言語のコーディングが必要な理由は、中の記述を verbatim に取り扱う必要があるからであり、*1これはまさに bxluavienv が提供する機能である。ということは、このパッケージを併用すれば、「templatex 環境」が LaTeX コードだけで自分で実装できることになる。
実際にやってみよう。以下は、「怯まず…」で挙げた例と同じことを行う。このソースの組版に必テンプレートエンジン ixsst.lua が必要であるが、それは IXbase バンドルに含めておいた。
% このファイルの文字コードは UTF-8 \documentclass[a4paper]{article} \usepackage{bxluavienv,bxluafacade} \directlua{% これは元と同じ ixsst = require "ixsst" function templatex(str) bxlt.print(ixsst.compile(str):exec(_G)) end } % ここで templatex 環境を定義する \DeclareVerbInputEnvironment{templatex}{% \directlua{templatex(\VIEString{#1})}% } \begin{document} % 使用例 \begin{templatex} <? function dsplit(n) return string.format("%.8f", n):gsub("%.", "&.") end ?> \begin{center}\small\begin{tabular}{r|r@{}l|r@{}l} \hline \multicolumn1{c|}{$x$}& \multicolumn2{c|}{$\sqrt{x}$}& \multicolumn2{c}{$\sqrt[3]{x}$} \\\hline <? for n = 1, 30 do local s, c = n ^ (1/2), n ^ (1/3) ?>% <?= n ?> & <?= dsplit(s) ?> & <?= dsplit(c) ?> \\ <? end ?>% \hline \end{tabular}\end{center} \end{templatex} \end{document}
「自分で実装できる」ところが大事なのではあるが、一応この機能自身も有意義だと思われるので、この実装をパッケージにしたもの(templatex パッケージ)も IXbase に入れておいた。
※注意 現在の IXbase バンドルの内容は ixsst.lua、template.sty と旧来の ixbase0.sty である。この記事を最初に書いた時は、BXluatool のパッケージが(ixbase-... という名前で)入っていたが、別のバンドルになっている。
*1:最初のコードでは、luacode* 環境がこの面倒を見ている。