(前回の続き)
対処法
これに対処する方法であるが、挿入されるトークン列の方に細工を施して、そちら側で先読み処理をする、という方法も考えられるが、元々の挿入トークン列の性質によっては困難な可能性がある。恐らく、\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 パッケージをどうするかはもう少し考えさせてください……