为现有符号定义文档级命令

为现有符号定义文档级命令

我想为某些具有“有意义”名称的符号定义文档级宏。我想知道在“干净”的 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因此它们不会在写入操作中扩展。

相关内容