マクロツイーター

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

標準 LaTeX で枠付き verbatim

確かどこかの誰かが「LaTeX ユーザを大切にしよう!」とか言っていた気がするので、今回は TeX パズルでなく LaTeX パズルを出題してみる。

以下の条件の下で、「枠付きの verbatim」を実現する方法を考えよ。
  • パッケージを全く読み込まず、標準の LaTeX の機能のみを用いる。
  • 以下の 3 つの部分に(固定の) LaTeX コードを書くことで実現する。
    • (1) プレアンブル部分。(変数・命令・環境などを定義する)
    • (2) 本体中の、「枠付きの verbatim」にすべきテキストの直前。
    • (3) 本体中の、「枠付きの verbatim」にすべきテキストの直後。
    「枠付きの verbatim」は文書内で何度も使うことができて、その場合は、各 verbatim 部分の前後に (2) と (3) を記述する。(従って、(2) と (3) はなるべく短いことが望ましい。)
  • 文書クラスは 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 を挙げておく。