循环遍历元素以在数学模式下更改字体

循环遍历元素以在数学模式下更改字体

我有以下代码:

\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。)

这包含两个问题:

  1. (1)(2)报告这些警告,而行(3)应该(至少据我所知)与行相同,但(1)事实并非如此:(由 jfbu 解决,谢谢!)

    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. 行 的(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

相关内容