\@ifundefinedを使ったら少しだけ楽できた例です。\@ifundefinedは引き数が定義済か未定義かを調べて、挙動を変えるための仕組みです。
\@ifundefined{XXX}{XXXが未定義の場合}{XXXが定義済みの場合}
この仕組を使ってプロラムリストのキーワードをコマンドにして表示できるようにしてみました。
Dim i, j As Integer
という行があったら、
\Dim i, j \As \Integer
とするだけで色の付いた表示になります。
当初は、fancyvrbパッケージで使えるVerbatim環境内で
\textcolor[magenta][Dim] i, j \textcolor[magenta][As] \textcolor[magenta][Integer]
のように、その都度指定しようかと思いましたが、思ったよりキーワードの種類が多く書籍全体では40以上になるし、表示するソースコード数もかなりの量なので挫折しました。無理やり続けていても間違いが入ってしまったでしょう。
各キーワードをコマンド名として定義していこうかとも思いましたが、40以上ダラダラと繰り返すのもなんだか非生産的だし、ということで見つけたのが\@ifundefinedでした。
\@ifundefinedを使って\mkKeywrodを定義し、40以上のキーワードが定義されるように\mkKeywordの引数に入れていきます。定義済みの場合は何もしません。
\newcommand{\mkKeyword}[1]{\@ifundefined{#1}{%
\expandafter\gdef\csname #1\endcsname{\textcolor{magenta}{#1}}}{}}
% キーワードを登録
\mkKeyword{And}
\mkKeyword{As}
\mkKeyword{ByVal}
\mkKeyword{ByRef}
\mkKeyword{Case}
\mkKeyword{Class}
\mkKeyword{Date}
...
続く
これはこれで長々と定義が続いてしまいますが、これ以上追求するのはやめました。
登録したキーワード使ったVerbatim環境です。
\begin{Verbatim}[xleftmargin=5mm,commandchars=\\\[\]]
\Dim i, j \As \Integer
\Private \Sub Button1_Click(\ByVal sender \As System.Object, \ByVal e \As System.EventArgs)
Handles Button1.Click
\Dim n \As \Integer : n = Val(Sample1.Text)
\If n <> 0 \Then
\If n > 0 \Then
i = i + 1
\Else
j = j + 1
\EndIf
Sample2.Text = Sample2.Text & n & " "
\EndIf
\EndSub
\end{Verbatim}
コメント