鉴于:
\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 内核有点僵化,在这么多年后改变这种行为会带来大问题。使用\NewDocumentCommand
from the xparse
package,您可以摆脱此限制:
\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