(前回の続き)
対処法
これに対処する方法であるが、挿入されるトークン列の方に細工を施して、そちら側で先読み処理をする、という方法も考えられるが、元々の挿入トークン列の性質によっては困難な可能性がある。恐らく、\end マクロの方を修正する方が簡単であろう。
前回の最後に述べたように、\csname の前に(展開不能な) \relax が置いてあれば問題が起こらない。なので、次のように、\end の定義本体の先頭に \relax を追加すればよい。
\def\end#1{%
\relax % 追加
\csname end#1\endcsname\@checkend{#1}%
…………}ただし、これだと、\end〜 が実際に定義されている場合にも、その前に展開不能な \relax が入ることになる。これが問題になる事例は思いつかないが、何か不安である。そこで、次のようにして、未定義の場合にのみ \relax を入れることにすればよさそうだ。((なお、ここでは e-TeX 拡張の \ifcsname の使用が必須である。\csname を使ってしまうとそこで「\relax 化」が起こってしまって元も子も無くなる。))
\def\end#1{%
\unless\ifcsname end#1\endcsname\relax\fi % 追加
\csname end#1\endcsname\@checkend{#1}%
…………}とりあえず、この fix をパッケージにしたものを用意しておく。
- zxcjkfix1.sty (Gist/zr-tex8r)
これで、元々の TeX Forum の投稿の例も通るようになる。
\documentclass{article} \usepackage{zxjatype} \usepackage{zxcjkfix1}%fix \setjamainfont{IPAMincho} \begin{document} \begin{Huge}「」\end{Huge} \end{document
ZXjatype パッケージをどうするかはもう少し考えさせてください……