命令已定义但未定义

命令已定义但未定义

我曾经\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

解决这个问题的更好方法是根据\NewDocumentCommandxparser 包中附带的或类似的东西来定义事物,这些也随最新的 LaTeX 2ε 版本一起提供。

相关内容