通过新命令输出内部 at-macro?

通过新命令输出内部 at-macro?

刚刚注意到一个有点奇怪的行为,当试图展示内部 Latex @ 命令从主文档通过\newcommand

考虑以下 MWE,其中内部宏(\c@something)调用的所有实例都已包装在\makeatletter/ 中\makeatother

\documentclass[10pt]{article}


% define internal at-macro
\makeatletter
\def\c@something{AAA}
\typeout{ == \c@something == }
\makeatother

% define a newcommand calling the at-macro
\newcommand{\mytest}{
\makeatletter
\c@something
\makeatother
}



\begin{document}


test

\mytest{}

\makeatletter
here \c@something
\makeatother


\end{document}

当我用构建上述内容时pdflatex,我得到了这个:

测试.png

...然而,我原本期望的是这样的:

test
AAA
here AAA

有人能解释一下为什么当将宏作为其中的一部分放入时,它不会被调用/执行\newcommand,而直接从主体调用看起来没问题吗?(换句话说,我能否将其输出作为\newcommand其中的一部分?)

答案1

TeX 在第一次读取字符时会将其转换为 token。因此,当你这样做时

\newcommand{\mytest}{
\makeatletter
\c@something
\makeatother
}

TeX 将其视为@“其他”字符,其定义\mytest如下:

  1. %一个空格(因为在开头之后有一个没有的新行{
  2. 代币\makeatletter
  3. 代币\c
  4. “其他”角色@
  5. “字母”表示“某物”(每个字母独立)
  6. 代币\makeatother

你想要的是

\makeatletter
\newcommand{\mytest}{%
  \c@somecommand
}
\makeatother

在这种情况下, 的定义\mytest是单个标记\c@somecommand,与 的\def情况完全一样。

相关内容