マクロツイーター

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

ixgrassator パッケージ

LuaTeX でしか草を生やせられないというつまらないパッケージであるが、一応使い方を解説しとおく。

インストール

以下のファイルを「TeX システムから見える場所」に置く。通常の Lua インタプリタでのモジュールの探索場所と異なり、Lua ファイルも TeX 言語で書かれたファイル(*.sty)と同じ扱いになることに注意。

使用法

読込は \usepackage{ixgrassator} で行う。オプションはない。以下の機能が提供される。

  • \begin{execgrass}〈Grassソース〉\end{execgrass} : 中に書かれたプログラムを入力(標準入力から読み込まれるバイト列)を空として実行する。出力(標準出力へ書き出されるバイト列)はそのまま LaTeX への入力(LaTeX ソース)として実行される。
  • \begin{execgrasswithinput}{〈入力〉}〈Grassソース〉\end{execgrasswithinput} : 入力を引数として指定する他は execgrass 環境と同じ。
  • \begin{procgrass}{\制御綴}〈Grassソース〉\end{procgrass} : 「内容のプログラムを実行する」という命令を \制御綴 として定義する。つまり、後で \制御綴{〈入力〉} を実行するとプログラムが実行される。
  • \begin{execgrass*}〈Grassソース〉\end{execgrass*}

    \begin{execgrasswithinput*}{〈入力〉}〈Grassソース〉\end{execgrasswithinput*}

    \begin{procgrass*}{\制御綴}〈Grassソース〉\end{procgrass*}: verbatim 版。 * なしの環境と同様だが、出力は LaTeX ソースではなく単なる文字列と解釈されそのまま出力される。

環境名の grass を homuhomu にした環境も用意されていて、こちらは「ほむほむ」のプログラムを実行する。

補足事項。

  • LuaLaTeX なので、ixgrassator の提供する環境の中身も含めて全て UTF-8 で書くことになる。非 ASCII 文字(全角の〈w〉)とかも正しく認識される。
  • 入出力に関しては、「TeX での文字列」を UTF-8エンコードしたものが「Grass で扱うバイト列」になる。*1
  • 環境の中身は verbatim として扱われる(つまり制御綴を書いてもそのままの文字と解釈される)。「入力を表す引数」は verbatim ではなく、例えばマクロを書くと展開される。*2
  • 「改行」の扱い: 環境の中身(ソース)での「改行」はそのまま「改行」と扱われる。「入力を表す引数」は verbatim でないので、ここにどうしても「改行(= LF *3)」を入れたい場合は ^^J *4と書く。verbatim 版の環境(execgrass* 等)で、出力に「改行」が現れた場合は強制改行を行う。
  • verbatim 版の環境を実行する場合は、フォントを「ASCII がまともに読めるもの」――例えば cmtt にする、T1 エンコーディングにする、Unicode フォントにする――にした方がよいかもしれない。

サンプル

% 文字コードは UTF-8
\documentclass[a4paper]{article}
\usepackage{type1cm} % ナベアツで OT1/cmfr/m/it が要るので
\usepackage[T1]{fontenc} %
\usepackage{lmodern}     % verbatim 対策で T1 にした
\usepackage{ixgrassator} % これで草を生やせる
\begin{document}

% \begin{procgrass}コード\end{procgrass} でコードを即実行する。
\begin{execgrass}
うはwwWWwv
何wwwwWWWwwWwwこれWWWWWWwwwwWwwv
1+1wWWwww計算ってWwwwwWwwwwwwWイミフwwwwwwwww
\end{execgrass}

% \begin{procgrasswithinput}{入力}コード\end{procgrasswithinput} で入力の
% あるコードを実行できる。
\begin{execgrasswithinput}{live saw nametag}
wwWWwWWWwvwwWWwWWWwWWWWwvwWWWwwwwwWwwWWWWwwwwwWWWWWWwWwwwwwwwwwWwwwwWWWWWWWWWwww
wwwwwwWwwwwwwwwwWwwwwwwwwwwwwwWwwwwvWwwwwwwvwwwWwwwWwwwvwwwWWWwWwwwvwwvWWwvwWWWW
WWWWWWWWWwwwwwwWwwwwwwwWwwwWWWWWWWWwwwWwwwwwWWWwWWWWWWWWWWWwwwwwWwwvwwWWWWWwwwww
wwwwwwwwwWWWWWWWwWwwwwwwWWwwwwwwwwWWWWWWWwwwwwWWWwWWWwwWWwwwwwwwWWWWWWWWWWwwwwww
wwwwWWwWwwwwvwwWWWWWWwwwwwwwwwwwwwwwWWWWWWWWwWwwwwwwwWWwwwwwwwwwWWwwwwwWWWWWWWWW
WWWWWWWWWwWWwwwwwwwwwwwwwwwWWWWWWWWWWWWwwwwwwwWWwWWWWWWWWWWWwwwwwwwwwwwWWwWWWWWW
WWwwwwwwwwwwwwWWwvwWWWWWWWWwwwwwwwwwWwwwwwwwWWWWWwwwwwWwwWWWWWWwwwwwwWww
\end{execgrasswithinput}

% execgrass 環境の出力は LaTeX コードとして解釈される。
\begin{execgrass}
wwwWWWwwWWWwwWWwvwwWWwWWWwWWWWwvWWwWWWwWWWWwWWWWwvwWWwwwwwwwwwWwwwwwwwwwwwWWWWWW
wwwwwwwwwwwWwwWWWWWWWWWwwwwwwwwwwwwwWwwWWwWWWWWwWWWWwWWWWWWWWWWWWWWWWWwwwWWWWWWW
WWWWWWWWWWWwwwwwwwWWWWWWWWWWWWWWWWWWWwwwWWWWWWWWWWWWWWWWWWWWwwwwwww
\end{execgrass}

% execgrass* 環境の出力はそのまま出力される。
{\ttfamily\begin{execgrass*}
wwwWWWwwWWWwwWWwvwwWWwWWWwWWWWwvWWwWWWwWWWWwWWWWwvwWWwwwwwwwwwWwwwwwwwwwwwWWWWWW
wwwwwwwwwwwWwwWWWWWWWWWwwwwwwwwwwwwwWwwWWwWWWWWwWWWWwWWWWWWWWWWWWWWWWWwwwWWWWWWW
WWWWWWWWWWWwwwwwwwWWWWWWWWWWWWWWWWWWWwwwWWWWWWWWWWWWWWWWWWWWwwwwwww
\end{execgrass*}}

% \begin{procgrass}{\命令}コード\end{procgrass} は中身のコードを
% LaTeX 命令として定義する。命令の引数にプログラムへの入力を
% 指定することでプログラムを実行する。
\begin{procgrass}{\NabeAzz}
wwwWwwwWwwwvwwwWWWwwWWWWwwwWwwwWWWwvwwwWWWwwWWWWwwwWwwwWWWwWWWWWWwvwWWwWWWWwWWWW
WwWwwwwwwwwwWwwwwwwwwwwwWWWWWWWwwwwwwWWWWWWWWwWWWWWWWWWWwWwwwwwwwwwwwwwwWwwwwwww
wwwwwwwwwWWWWWWwWwWwwwwwwwwwwwwwwwwwwWWwwwwwwwwwwwwwwwWWWwwwwwwwwwwwwwwwwwWWwwww
wWWwWWWWwWWWWwWWWWWwWWWWWWwWWWWWWWWwWWWWWWWWWwWwwwwwwwwwwwWwwwwwwwwwwwwwwwWWWWWW
WWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWwWWWWWWWWWWWWWwWWWWWWWWWWWWWWWwwwWWWW
WWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwWWWWwWwwwwwwwwWWWwWWWWwWWWW
WWWwwwwwWwwwwWWWWWWwwwwwWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwWwwwWW
wWWWWWWWWWWWwWWWWwWWWWWwWWWWWWwWWWWWWWWWWWWWWWWwWWWWWWWWwwWwwWwWwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWwwwwww
wwwwwwwwwwwwwwWWWwwwwwwwwwwwwwwwwwwwWWWWwwwwwwwwwwwwwwwwwwWWWWWwwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWwwwwwwwwwwwwwwWWWWWWWwwwwwwwwwwwwwwwwwww
WWWWWWWWwwwwwwwwwwwwwwWWWWWWWWWwwwwwwwwwwwwwWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwWWWWWW
WWWWWwwwwwwwwwwwwwwwWWWWWWWWWWWWwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWwwwwwwwwwwwwwwwwWW
WWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
wwwwwwWWWwWWWWWwWWWWWWWwWWWWWWWWWwWWWWWWWWWWWwWWWWWWWWWWWWWwWWWWWWWWWWWWWWWwWWWW
WWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWw
WWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWwvwwvWWwvwwwWWWwWwwwvWwwwvwwwWWWwwwwWwwWWWWwWWWWWWwwwwwwwwwwWwwwwwvwwwwwwWwww
wwwWwwwwwwWwwwwwwWwwwwwwWwwwwwwvwWwwwwwwwWwwwwwWwwwwwwwwWWWWWwWwwWwwwWwwwwWwwwww
vwwwwWWWwWwwwwwWWWWWWWWWWWWWWWWWWWwwwWWwWWWWWWwWwwwwwwvwwwwwwwWWWWWWWWwwwwwwwWww
wwwwwWwwwwwwwwwwwwwwWwwwwwWWWWWWWWWWwwwwwwWWWWwWwwwwwwwwwWWWWWWWWWWWWWwwwwwwwwww
WwwwwWwwWWWWWWWWWwWwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwWwwwwWwwWWWW
WWWWWWWWWWwWwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwww
wwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwwwwwwwwwwWww
wwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwww
wwwwwwwwwwwwwwwWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwWwwwwwwwwwwwwwwwWw
wwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwvwwwwwwwWWWWWWwwwwwWWWWWWWww
wwwWwWwwwWWWWWWWWWWwwwwwwwWwWwwwWWWWWWWWWWWWWwwwwwwwwwWwWwwwWWWWWWWWWWWwwwwwwwww
wwwwwwwwWwWwwwvwwwwwwwWWWWWWWwwwwwwwwwwwwwwwwwwwwwwWWWWWWWwwwwwwWwwwwwwwwWwwwWww
wwwwwwwWWWWWWWWWWWwwwwwwwwwWwwwwwWwwWwwwwwwwwwwwwwwWwwwwwwwwwWwwwwwwwwwwwwwwWWWW
WWWWWWWWWWWWWwwwwwwwwwwwwwwWwwwwwWwwWwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwWwwwwww
wwwwwwwwwwwwwWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWwwwwww
wwwwwwwwwwwwvwwWWwwwwwwwwwwWWWwwwwwwwwwwwwwwWWwwwwwwwwwwwwwwWWwwwwwwwwwwwwwwwWWW
WwWWWWwwWWWWWWwWWWWWWwwWWWWWWWWwWWWWWWWWwwWWWWWWWWWWWWWWWwwwwwwWwwwWWWWWWWWWWWWW
wWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwWWWWWWWWWWWWWWWWWWwwwwwwwwwwWwwWWWWwWwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwww
wwwwWwwWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWW
WWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWwWWWWWWWwwwwwWWwWW
WWWWwwwwwwwwwwwwwwwwwvwwwWWWwwWWWwwWWwvwwWWwwwwwwwwwwwwWWWwwwwwwwwwwwwwwwwWWwwwW
WwwwwWWWWwWWWWwwWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWww
wwWWwWWWwwwwwWWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwWWWWWWWWWWWWWWWWwwwww
wwwwwwWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWw
wwwwwwWwwwwwwwWWWwvwwwWWwWWWWwvwwwwwwWWWWWWwwwwwwwwwwwwwwwwwwWWWWWWWwwwwwwwwwwww
wwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWW
WWWWWWWWwwwwwwwWwwwwwWWWwWWWWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwWWWWWW
WWWWWWWWWWwwwwwwwwwwwwwwWWwWwwwwwWWWWWWWWWWWwWWWWWWWWWWWwwWWWWWWWWWWWWWwWwwwwwww
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWwwwwwwwww
wwwwwwwwwWWWWWWwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwwwwww
wwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwWWWwWWWWWwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
WWWWWWWWwwwwwwwWwwvwwWWwwwwwwwwwwwwwwwWWWwwwwwwwwwwwwwwwwwwwWWwwwwwwwwwwwwwwwwww
wWWwwwwwwwwwwwwwwwwwwwwWWWWwWWWWWWWWwwwwwwwWwwwwWwwwWWWWWWWWwwwwwwwwwWWWWWWWWwww
wwwwwwwWWWWWWWWWWWWWWWWWWWWWWWWWWWWwWWWwWwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwW
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWwwwwwwWwwwwwwWwwwvwWWWWWWWWWWWWWWWW
WWWWWWwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwWWWWwwwWwwWWwWWWwWWWWwWWWWWWWWwwwwww
wwwwwwwwwwwwwwwwwwwWwwvwWWWWWWWWWWWWWWWWWWWwWWWWWWWWWWWWWWWWWWwWWWWwWWWWWWWWWWWW
WWWWwwwwwwwwwwwwwwwwwwwwwwwwwwWWWWWWWWWWWWwwwWWWwWwww
\end{procgrass}
% \AhoFont の定義
% (\NabeAzz は 1 2 {\AhoFont 3} 4 ... のように出力するのであった)
\newcommand{\AhoFont}{\usefont{OT1}{cmfr}{m}{it}\LARGE}
\NabeAzz{40}

\end{document}

*1:だから Grass で出力したバイト列が UTF-8 の形式になっていない場合、TeX 側に戻った時にエラーになる。

*2:TeX 言語的にいうと、完全展開して文字列化(detokenize)したものが実際の入力バイト列になる。

*3:慣例的に、Grass で「改行」は LF (符号位置 10)で表される。他の大部分の(普通の)プログラム言語と同じである。

*4:TeX の入力規則で LF を表す。