マクロツイーター

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

verbatim な入力を Lua 関数で簡単に扱う件について (3)

[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* 環境がこの面倒を見ている。