我想为某些具有“有意义”名称的符号定义文档级宏。我想知道在“干净”的 LaTeX3 包中执行此操作的最佳方法是什么。
选项 1a:使用\def
\def\EmptySet{\varnothing}
选项 1b:使用\let
\let\EmptySet\varnothing
选项 2a:\NewDocumentCommand
直接使用
\NewDocumentCommand \EmptySet { } { \varnothing }
选项 2b:使用\NewDocumentCommand
延迟实施
\NewDocumentCommand \EmptySet { } { \mathset_emptyset: }
\cs_new:Nn \mathset_emptyset:
{
\varnothing
}
在 LaTeX3 中定义宏的推荐方法是什么?它们之间是否存在细微的差异,例如,在数学模式下的间距方面?
答案1
那里是细微的差别。假设你的包被调用matthias.sty
,并且它有
\let\NotElement=\notin
(只是一个人为的例子,但是...)。
现在我们来尝试一下。
\documentclass{article}
%% emulate here \usepackage{matthias}
\let\NotElement=\notin
%% another package follows
\usepackage{fourier}
\begin{document}
$x\NotElement X$ and $a\notin A$
\end{document}
你能看出区别吗?还有其他情况下fourier
符号会变得奇怪,这种情况很容易出现。
你\let
在执行时“冻结”含义,但fourier
重新定义 \notin
使用特定的符号,而 LaTeX 内核则是通过在“属于”符号上叠加斜线来实现的。
这不会发生在 中\newcommand{\NotElement}{\notin}
,因为这只是执行替换并使用当前的的定义\notin
。
是否应该使用\NewDocumentCommand
尚有争议。主要区别在于用 定义的命令是\NewDocumentCommand
,\protected
因此它们不会在写入操作中扩展。