確かどこかの誰かが「LaTeX ユーザを大切にしよう!」とか言っていた気がするので、今回は TeX パズルでなく LaTeX パズルを出題してみる。
以下の条件の下で、「枠付きの verbatim」を実現する方法を考えよ。
- パッケージを全く読み込まず、標準の LaTeX の機能のみを用いる。
- 以下の 3 つの部分に(固定の) LaTeX コードを書くことで実現する。
「枠付きの verbatim」は文書内で何度も使うことができて、その場合は、各 verbatim 部分の前後に (2) と (3) を記述する。(従って、(2) と (3) はなるべく短いことが望ましい。)
- (1) プレアンブル部分。(変数・命令・環境などを定義する)
- (2) 本体中の、「枠付きの verbatim」にすべきテキストの直前。
- (3) 本体中の、「枠付きの verbatim」にすべきテキストの直後。
- 文書クラスは article と jsarticle のみに対応すればよい。
- 枠の横幅は、その外側で有効な行幅より少し小さくする。(LaTeX だからこの辺はあまり細かく設定できないかも知れない。)
- 枠の縦幅は、verbatim 部分の縦幅に応じて適切に調整する。
- ただし、枠が改ページを跨ぐことは全く考慮しなくてよい。
以下のような書き方ができればよい。
\documentclass[a4paper,twocolumn]{jsarticle} %%%% (1)のコード \begin{document} この処理をPerlで非常に解りやすく書くと 以下のようなコードになるであろう。 %%%% (2)のコード @out = map { $a = $_; [ map { $in[$_][$a] } (0 .. $#in) ] } (0 .. $#{$in[0]}); %%%% (3)のコード うんたらかんたら。 \end{document}
一般的に、LaTeX である程度の長さのテキストにマークアップを施すための最も「自然な」仕様は
\begin{framedverbatim} ... \end{framedverbatim}
のような「(ユーザ定義の)環境」の形にすることだろう。しかし、周知の通り、中身が verbatim の環境は特殊な存在であり、ユーザが \newenvironment
で(あるいはその他の標準 LaTeX の機能を用いて)作ることはできない。従って、(2)/(3) のコードは「環境の開始/終了」よりは複雑なものにする必要があるだろう。
ところで、LaTeX (の \makeatother
の状態)で使える制御綴のうちどこまでが「標準 LaTeX の命令・機能」であるかの正確なところは私もよく知らないのだが、参考資料として、latex2e-help-texinfo を挙げておく。