我有以下代码:
\documentclass{article}
\newcommand*{\ident}[1]{\texttt{\small #1}}
\makeatletter
\newcommand\ci[1]{%
\def\citmp{}%
\@for\reserved:=#1\do{%
\protected@edef\citmp{\citmp\ifx\citmp\empty\else,\fi\ident{\reserved}}%
}%
\{\citmp\}%
}
\makeatother
\begin{document}
$\ci{a,b,c}$ % (1)
$\ci{a, b, c}$ % (2)
$\{\ident{a}, \ident{b}, \ident{c} \}$ % (3)
\end{document}
(该代码\ci
取自该网站的一个答案;不过,我现在找不到 URL。)
这包含两个问题:
行由 jfbu 解决,谢谢!)(1)
并(2)
报告这些警告,而行(3)
应该(至少据我所知)与行相同,但(1)
事实并非如此:(LaTeX Font Warning: Command \relax \GenericWarning {(Font) }{LaTeX Font Warning: Command \relax \GenericWarning {(Font) }{LaTeX Font Warning: Command \relax \fontsize {9}{11}\selectfont \abovedisplayskip 8.5\p@ plus3\p@ minus4\p@ \abovedisplayshortskip \z@ plus2\p@ \belowdisplayshortskip 4 \p@ plus2\p@ minus2\p@ \def \leftmargin \leftmargini \parsep 4\p@ plus2\p@ minu s\p@ \topsep 8\p@ plus2\p@ minus4\p@ \itemsep 4\p@ plus2\p@ minus\p@ {\leftmarg in \leftmargini \topsep 4\p@ plus2\p@ minus2\p@ \parsep 2\p@ plus\p@ minus\p@ itemsep \parsep }\belowdisplayskip \abovedisplayskip invalid in math mode}\font size {9}{11}\selectfont \abovedisplayskip 8.5\p@ plus3\p@ minus4\p@ \abovedispl ayshortskip \z@ plus2\p@ \belowdisplayshortskip 4\p@ plus2\p@ minus2\p@ \def \l eftmargin \leftmargini \parsep 4\p@ plus2\p@ minus\p@ \topsep 8\p@ plus2\p@ min us4\p@ \itemsep 4\p@ plus2\p@ minus\p@ {\leftmargin \leftmargini \topsep 4\p@ p lus2\p@ minus2\p@ \parsep 2\p@ plus\p@ minus\p@ \itemsep \parsep }\belowdisplay skip \abovedisplayskip invalid in math mode}\fontsize {9}{11}\selectfont \above displayskip 8.5\p@ plus3\p@ minus4\p@ \abovedisplayshortskip \z@ plus2\p@ \belo wdisplayshortskip 4\p@ plus2\p@ minus2\p@ \def \leftmargin \leftmargini \parsep 4\p@ plus2\p@ minus\p@ \topsep 8\p@ plus2\p@ minus4\p@ \itemsep 4\p@ plus2\p@ minus\p@ {\leftmargin \leftmargini \topsep 4\p@ plus2\p@ minus2\p@ \parsep 2\p@ plus\p@ minus\p@ \itemsep \parsep }\belowdisplayskip \abovedisplayskip invalid in math mode on input line 17. LaTeX Font Warning: Command \relax \GenericWarning {(Font) }{LaTeX Font Warning: Command \relax \fontsize {9}{11}\selectfont \abovedisplayskip 8. 5\p@ plus3\p@ minus4\p@ \abovedisplayshortskip \z@ plus2\p@ \belowdisplayshorts kip 4\p@ plus2\p@ minus2\p@ \def \leftmargin \leftmargini \parsep 4\p@ plus2\p@ minus\p@ \topsep 8\p@ plus2\p@ minus4\p@ \itemsep 4\p@ plus2\p@ minus\p@ {\lef tmargin \leftmargini \topsep 4\p@ plus2\p@ minus2\p@ \parsep 2\p@ plus\p@ minus \p@ \itemsep \parsep }\belowdisplayskip \abovedisplayskip invalid in math mode} \fontsize {9}{11}\selectfont \abovedisplayskip 8.5\p@ plus3\p@ minus4\p@ \above displayshortskip \z@ plus2\p@ \belowdisplayshortskip 4\p@ plus2\p@ minus2\p@ \d ef \leftmargin \leftmargini \parsep 4\p@ plus2\p@ minus\p@ \topsep 8\p@ plus2\p @ minus4\p@ \itemsep 4\p@ plus2\p@ minus\p@ {\leftmargin \leftmargini \topsep 4 \p@ plus2\p@ minus2\p@ \parsep 2\p@ plus\p@ minus\p@ \itemsep \parsep }\belowdi splayskip \abovedisplayskip invalid in math mode on input line 17. LaTeX Font Warning: Command \relax \fontsize {9}{11}\selectfont \abovedisplaysk ip 8.5\p@ plus3\p@ minus4\p@ \abovedisplayshortskip \z@ plus2\p@ \belowdisplays hortskip 4\p@ plus2\p@ minus2\p@ \def \leftmargin \leftmargini \parsep 4\p@ plu s2\p@ minus\p@ \topsep 8\p@ plus2\p@ minus4\p@ \itemsep 4\p@ plus2\p@ minus\p@ {\leftmargin \leftmargini \topsep 4\p@ plus2\p@ minus2\p@ \parsep 2\p@ plus\p@ minus\p@ \itemsep \parsep }\belowdisplayskip \abovedisplayskip invalid in math mode on input line 17.
另一条线路也重复出现相同的警告。
行 的
(2)
格式与 行(1)
和不同(见下文)(3)
,因为逗号和元素之间的空格被复制到输出而不是被忽略。这还不算太糟,因为我总是可以使用 行 中的版本(1)
,但我想知道是否有办法简单地忽略空格。
答案1
问题1.
源于您的\ident
宏没有受到扩展保护(并且在没有有效退出数学模式时\small
从内部执行,因此出现第一个错误)。使用\ident
\texttt
\DeclareRobustCommand*{\ident}etc...
而不是
\newcommand*{\ident}
将指示\protected@edef
不要扩张(太多)\ident
。
第二个问题2.
可以通过使用\ignorespaces
在之前出现不需要的空格来处理,这里逗号后面的空格最终位于\reserved
:里面,所以\ignorespaces #1
在定义中,\ident
或者更确切地说,正如您在评论中提到的\ignorespaces\reserved
那样\ci
。