明示的に「意味しない」

if - blob glob
このとき書いたマクロ

\newcommand\Bx[1][-]{\mathbf{x}\if-#1\else^{(#1)}\fi}

だけど、'-'を使ってるのが若干気にくわない。nullというかundefinedというかNoneというか……とにかくそういった、「明示的にどの文字も意味しない」コードというのはTeXでは何だろう?
試しに'-'の代わりに"\char0"を使ってみたところ、

! Double superscript.

などと怒られた。しかしこのエラーは\ifの後の文字を'-'から"{-}"に変えても起こるため、"\char0"が直接的に問題であるというよりは、何らかの文法的な問題だろうと思う。
'-'の代わりに\relaxを使ったところうまくいったが、\relaxはこういう目的で使うものだろうか……?
リファレンスには、

ACCORDING to The TeXbook, ``TeX does nothing'' when it encounters \relax [279]. Actually, \relax may tell TeX, ``This is the end of what you've been doing'' [71]. Or, it may say, ``Be prepared, we're about to change course'' [353].

TeX: Reference and Examples by David Bausum

とある。``This is the end of what you've been doing''とか書かれると、EOF的な意味合いがあるような気がしてしまうが、実際のところそういうわけではない。ドキュメントの途中に\relaxを挟んでも、何も問題ないから。EOFはむしろ\endだろう。
plain TeX - MyTeXpertあたりを見ると、2番目の``Be prepared, we're about to change course''の意味がわかる。ここではデータの入力元を変えるよ、という意味で使っているのだろう。


よくよく考えると、\ifの定義からして、

  • 2つのトークンのキャラクタコードを比較して一致すればtrue
  • コントロールシーケンスはカテゴリコード16、キャラクタコード256

とあるのだから、コントロールシーケンスであれば何でもOKなのだろうか?
試しに

\newcommand\BP[1][\box]{\mathbf{P}\if\relax#1\else^{(#1)}\fi}

とかやってみたら望みどおりの結果が得られてしまった。コントロールシーケンスならなんでもいいらしい。


意味的には\relaxが「なにもするな」だから、これが一番いいのかな。多分、趣味の問題だけど。
この方法を使えば任意の(通常の*1)文字を渡せるようになる。しかし、\mboxとかを渡さないように注意する必要がある。その辺をうまく回避するコードはまた次回検討しよう。そうすれば任意の内容を渡せるようになるはず。

*1:つまりキャラクタコード0〜255の