我花了两天时间阅读了很多资料,\relax
但无法处理以下问题。
为什么\romanNumber
没有问题但\romanNumberX
不起作用?\relax
必须停止\romannumeral
而不是\csname
。请纠正我对 TeX 的看法。
\documentclass{article}
\newcommand{\romanNumber}[1]{\romannumeral #1}
\newcommand{\romanNumberX}[1]{\romannumeral #1\relax}
\begin{document}
\expandafter\def\csname name\romanNumber{2}\endcsname{Must do!\\}
\nameii%OK, no problem here
%The following line generate error "missing \endcsname"
\expandafter\def\csname nameX\romanNumberX{2}\endcsname{Also must do!\\}%
\nameXii%Does not work, :(
\end{document}
多谢!
答案1
\newcommand{\romanNumber}[1]{\romannumeral #1}
\romanumeral
将提前解析并消耗<number>
so的任何有效部分
\romanNumber{1}1
将转换 11 产生xi
不转换 1 因此扩展为i1
解析会在任何不允许的不可扩展标记处停止,因此<number>
您可以使用\relax
但然后
\newcommand{\romanNumber}[1]{\romannumeral #1\relax}
\romanNumber{1}1
扩展到i\relax 1
csname 中不允许的内容。
如果停止数字的不可扩展标记是空格,则不是更换,这样你就可以
\newcommand{\romanNumber}[1]{\romannumeral #1 }
然后
\romanNumber{1}1
扩展为i1
但\newcount\foo \foo=1
\romanNumber{\foo}1
扩展为i 1
因为\foo
终止数字本身所以不需要空间所以不会消耗空间。
使用 e-tex 您可以使用
\newcommand{\romanNumber}[1]{\romannumeral\numexpr#1\relax}