\relax 的问题

\relax 的问题

我花了两天时间阅读了很多资料,\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 1csname 中不允许的内容。

如果停止数字的不可扩展标记是空格,则不是更换,这样你就可以

   \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}

相关内容