我尝试\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
它是内部使用的,你不应该依赖它的定义不变。