为什么在 \newcommand 中使用 @ 会出现“未定义的控制序列”错误?

为什么在 \newcommand 中使用 @ 会出现“未定义的控制序列”错误?

我正在尝试创建一个命令来临时更改 的大小lstinline,以便我可以在脚注中正确使用它。以下命令似乎可以正常工作:

\makeatletter
\lst@AddToHook{TextStyle}{\let\lst@basicstyle=\footnotesize}
\makeatother

但是,如果我尝试将它们添加到 a 上newcommand然后使用它:

\newcommand{\testcmm}{
    \makeatletter
    \lst@AddToHook{TextStyle}{\let\lst@basicstyle=\footnotesize}
    \makeatother
}
\testcmm

我收到以下错误:

! Undefined control sequence.\testcmm -> \makeatletter \lst@AddToHook{TextStyle}{\let \lst @basicstyle=n... \testcmm

我知道这个错误通常是在命令未定义时发生的,例如,当您忘记添加包含它的库时。但是在这种情况下,它只发生在 内部\newcommand。为什么?


梅威瑟:

\documentclass{article}
\usepackage{listings}

\newcommand{\testcmm}{
    \makeatletter
    \lst@AddToHook{TextStyle}{\let\lst@basicstyle=\footnotesize}
    \makeatother
}

\begin{document}
\testcmm
\end{document}

答案1

你得到的错误是

! Undefined control sequence.
\testcmm ->\makeatletter \lst
                              @AddToHook{TextStyle}{\let \lst @basicstyle=\f...
l.12 \testcmm

因为 TeX 已经吸收了定义文本,\makeatletter所以不是有效,因此它已经存储

\lst@AddToHook

共 11 个标记\lst•@•A•d•d•T•o•H•o•o•k

您希望在替换文本中将其@视为字母,因此

\documentclass{article}
\usepackage{listings}

\makeatletter
\newcommand{\testcmm}{%
    \lst@AddToHook{TextStyle}{\let\lst@basicstyle=\footnotesize}%
}
\makeatother

\begin{document}

\testcmm

\end{document}

不要忘记保护端线。

相关内容