オプションの有無で挙動が切り替わるマクロ

TeX言語における条件分岐

TeXには(たぶん)論理式や論理演算子がない(らしい)ので,普通のプログラミング言語と異なる条件分岐の仕方をする.

texwiki.texjp.org

例えば,ある文字トークンAと文字トークンBが同じである時に挙動Aを行いたい場合には,

\ifx<文字トークンA><文字トークンB><挙動A>

ある数値Aが特定の値より大きい場合に挙動Bを行い,そうでない場合には挙動Cを行いたい場合には,

\ifnum<数値A>><特定の値><挙動B>\else<挙動C>\fi

わかりにくいが,<数値A>の後の>は不等号である.

これらは例えば,\ifxが関数で,第一引数と第二引数を所定の仕方で比較し,所定の関係にあるならば第三引数の処理を実行する,という形式と見ることができる.

このほか,条件として使いたい値などの種類によってさまざまな「ifのようなもの」が用意されていて,使い分けないといけない.

具体例

たとえば,オプション引数をとるマクロにおいて,オプションがある時にはオプションに指定した文字列を表示し,なければ何も表示しないというものを定義する.
環境といいつつ,単に文字列を表示するだけのものである.

\newenvironment{test}[1][]{%
\ifx#1\relax
\relax
\else
#1
\fi
}{}

なお\newenvironmentにおいて,ふたつめの角括弧にはオプション引数のデフォルト値を指定する(角括弧自体がなければオプションなし).つまり,ふたつめの角括弧をつけることでオプション引数をとる環境を定義できる.
ちなみに\newenvironmentで設定できるオプションは通常はひとつだけ(だと思う).複数指定しようとすると以下のようなエラーが出る.

! You can't use `macro parameter character #' in vertical mode.

このエラーを回避しようとして,単純にvertical modeを脱するだけなら\leavevmodeというプリミティブがあるが,結果は同様(verticalがhorizontalになるだけ)である.オプションを複数指定する仕方はわからない.