我曾经\input{settings.tex}
包含包含的设置文件\newcommand{\ende}{20:00}
。如果我尝试构建项目,我会收到此错误:Command \ende already defined.
如果我尝试使用\renewcommand{\ende}{20:00}
重新定义命令,我会收到错误:Command \ende undefined.
。这里有什么问题?
答案1
你应该读一下所有的错误信息:
! LaTeX Error: Command \ende already defined.
Or name \end... illegal, see p.192 of the manual.
在您的情况下,相关的位是第二行。以 开头的宏\end...
保留用于环境的结束代码:\newcommand
检查 1) 宏是否尚未定义以及 2) 它是否不以 开头\end...
,但不会在随后的错误消息中区分这两种情况。
如果你确实必须使用该名称,你可以使用低级 TeX 构造
\def\ende{20:00}
但我建议选择一个不同的名字
\newcommand*{\Ende}{20:00}
答案2
请注意,在 LaTeX 中,如果宏是“手动”定义的,然后通过 调用,则该宏\ende
将被视为环境的结束宏。e
\e
\begin{e}...\end{e}
目前(2022 年 8 月),您不能执行此命令,\newcommand
但可以\renewcommand
执行名称为“非法”的命令。
如果您坚持定义一个由于以 开头而名称为“非法”的命令,\end...
以便定义的尝试产生与定义\newcommand
名称不是“非法”的命令的尝试相同的行为,您可以尝试这样的事情:
% When you uncomment the next but one line, then \ende is defined and
% the subsequent construct yields an error-message.
%\def\ende{\texttt{\string\ende}\space is defined}
\csname @ifundefined\endcsname{ende}%
{\def\ende{}\csname @firstoftwo\endcsname\renewcommand}{}%
\newcommand\ende{20:00}
如果你想将其作为宏,你可以这样做:
\makeatletter
\newcommand\newcommandwithendallowed{%
\@star@or@long\newcommand@withendallowed
}%
\newcommand\newcommand@withendallowed[1]{%
\begingroup\escapechar=-1
\@ifundefined{\string#1}%
{\endgroup\def#1{}\renew@command}%
{\endgroup\new@command}{#1}%
}%
\makeatother
% When you uncomment the next but one line, then \ende is defined and
% the subsequent construct yields an error-message.
%\def\ende{\texttt{\string\ende}\space is defined}
\newcommandwithendallowed*\ende[0]{20:00}
\show\ende
\stop
解决这个问题的更好方法是根据\NewDocumentCommand
xparser 包中附带的或类似的东西来定义事物,这些也随最新的 LaTeX 2ε 版本一起提供。