TeXの記憶(41) — \@ifundefinedを使って新たなコマンドを定義する

\@ifundefinedを使ったら少しだけ楽できた例です。\@ifundefinedは引き数が定義済か未定義かを調べて、挙動を変えるための仕組みです。

\@ifundefined{XXX}{XXXが未定義の場合}{XXXが定義済みの場合}

この仕組を使ってプロラムリストのキーワードをコマンドにして表示できるようにしてみました。

Dim i, j As Integer

という行があったら、

\Dim i, j \As \Integer

とするだけで色の付いた表示になります。

0912

当初は、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}

コメント