为什么 \newcommand{\do}{do} 不起作用?

为什么 \newcommand{\do}{do} 不起作用?

我尝试\do在 LaTeX 中定义一个命令,但由于某种原因,它没有显示出来。这是为什么?

梅威瑟:

\documentclass{article}
\newcommand{\do}{do} 
\newcommand{\doo}{do} % Dummy command for comparison

\begin{document}
Something prints here: \doo.
But nothing prints here: \do.
\end{document}

(如果加载诸如 之类的包amsmath\do则需要\renewcommand。但是,使用 时仍不会显示任何内容\do)。

答案1

内核或软件包在许多地方使用此命令\do作为循环的临时宏。

如果你添加

\texttt{\meaning\do}

之后\begin{document},你会发现 LaTeX 打印

\noexpand

这意味着在文档开始处执行的一些代码已经完成

\let\do\noexpand

这是该钩子中的最后一次使用,它包含要在文档启动前执行的几个设置。如果您加载其他包, after\do的含义可能会有所不同。\do\begin{document}

你可能会想说

\AtBeginDocument{\renewcommand{\do}{do}}

作为之前的最后一条指令\begin{document},但这也不安全,因为代码文档可能会\do在顶层使用,从而破坏您的定义。

使用不同的名称。

\do 起什么作用?有关 用法 的更多信息\do

答案2

您的定义确实有效,但\do在使用过程中被重新定义,\begin{document}因此使用时定义会丢失。您可以使用 进行检查\show

\documentclass{article}

\newcommand\do{do}
\show\do

\begin{document}

\show\do

Hello World!

\end{document}

日志告诉我们

> \do=\long macro:
->do.
l.4 \show\do
            
(c:/texlive/2022/texmf-dist/tex/latex/l3backend/l3backend-pdftex.def
)
(./test01.aux)
> \do=\noexpand.
l.8 \show\do

也就是说,在 期间\do已被重新定义为。\noexpand\begin{document}

需要注意的是,正如评论中提到的,\do它是内部使用的,你不应该依赖它的定义不变。

相关内容