我的一位同事遇到了一个与 LaTeX 相关的问题,但我不知道该问题的具体原因。我总结了一个最小工作示例来说明这个问题。
原来我的同事有几个文件,使用\include
方式如下:
主.tex 文件:testi.tex:
\documentclass{article}
\usepackage{graphics}
\makeatletter
\newcommand{\test@}{test}
\makeatother
\begin{document}
\scalebox{0.8}{
\input{testii}
}
\end{document}
包含的.tex 文件:testii.tex:
\makeatletter
\test@
\makeatother
这样做没有任何问题(此表单中包含的构造源自自动生成的注释 .pdf 图像的代码)。然后,我的同事尝试制作一个 *.tex 文件。因此,他\input
通过将 testii.tex 的内容包含在 testi.tex 中来替换该命令:
单文件 testi.tex: testd.tex:
\documentclass{article}
\usepackage{graphics}
\makeatletter
\newcommand{\test@}{test}
\makeatother
\begin{document}
\scalebox{0.8}{
\makeatletter
\test@
\makeatother
}
\end{document}
但是,文件 testd.tex 无法编译:错误消息是:
! Undefined control sequence.
<argument> \makeatletter \test
因此:LaTeX 读取命令\test
而不是\test@
,根据构造,应该读取\makeatletter
。我们找到了一种解决问题的方法(通过放置\scalebox
在\makeatletter
/\makeatother
对内),但我仍然想知道内联 LaTeX 代码和 -ed LaTeX 代码之间的行为差异的原因(错误?)\input
是什么。
答案1
这与 无关\input
(或与 的细节无关\scalebox
)
在
\scalebox{0.8}{
\makeatletter
\test@
\makeatother
}
该参数已被解析并标记为\test
@
前它被执行,所以没有效果。这是你不能在另一个命令的参数中\makeatletter
使用的原因。你需要\verb
\makeatletter
\scalebox{0.8}{%< don't forget this
\test@
}
\makeatother