\scalebox、\makeatletter 和 \input 的问题

\scalebox、\makeatletter 和 \input 的问题

我的一位同事遇到了一个与 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

相关内容