关于宏定义错误的问题

关于宏定义错误的问题

鉴于:

\documentclass{minimal}
\newcommand{\emrule}[1]{\rule[4pt]{#1em}{0.2pt}}
\newcommand{\endash}{\emrule{.5}}
\begin{document}
2000\endash2013
\end{document}

我得到:

! LaTeX Error: Command \endash already defined.
               Or name \end... illegal, see p.192 of the manual.

See the LaTeX manual or LaTeX Companion for explanation.
Type  H <return>  for immediate help.
 ...                                              

l.3 \newcommand{\endash}{\emrule{.5}}

? 

所以我的第一个问题是手册--- see p.192 of the manual.?通过实验,我相信这里发生的是名称冲突。处理器看到\end后踩刹车,并出现错误消息。例如\EMdash\enrule两者都正常工作而没有错误。由于我缺乏足够的宏,有比我更了解的人可以解释一下吗?顺便说一句,如果我注释掉它的定义,则会失败并显示有关未定义的\endash消息:\endash

! Undefined control sequence.
l.5 2000\endash
               2013
? 

这让我回到我的论点:这只是一个名称冲突\end

答案1

\newcommand明确拒绝定义名称以 开头的宏end。这可能是一个有争议的设计决定,但 LaTeX 内核有点僵化,在这么多年后改变这种行为会带来大问题。使用\NewDocumentCommandfrom the xparsepackage,您可以摆脱此限制:

\usepackage{xparse}
\NewDocumentCommand{\endash}{}{\emrule{.5}}

另一种方法是用不同的方式测试该命令是否已经存在:

\unless\ifdefined\endash
  \def\endash{\emrule{.5}}
\fi

依赖于较低级别的 TeX 构造。

这有什么问题吗?是的,有问题。如果你稍后说

\newenvironment{ash}
 {something maybe related to cricket at the start}
 {something else at the end}

你会发现自己陷入了大麻烦,因为这个声明会默默地重新定义你的\endash命令:环境确实在开始和结束时ash使用了\ash和。\endash

相关内容