刚刚注意到一个有点奇怪的行为,当试图展示内部 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
,我得到了这个:
...然而,我原本期望的是这样的:
test
AAA
here AAA
有人能解释一下为什么当将宏作为其中的一部分放入时,它不会被调用/执行\newcommand
,而直接从主体调用看起来没问题吗?(换句话说,我能否将其输出作为\newcommand
其中的一部分?)
答案1
TeX 在第一次读取字符时会将其转换为 token。因此,当你这样做时
\newcommand{\mytest}{
\makeatletter
\c@something
\makeatother
}
TeX 将其视为@
“其他”字符,其定义\mytest
如下:
%
一个空格(因为在开头之后有一个没有的新行{
)- 代币
\makeatletter
- 代币
\c
- “其他”角色
@
- “字母”表示“某物”(每个字母独立)
- 代币
\makeatother
你想要的是
\makeatletter
\newcommand{\mytest}{%
\c@somecommand
}
\makeatother
在这种情况下, 的定义\mytest
是单个标记\c@somecommand
,与 的\def
情况完全一样。