如何防止 amsmath 的 \dots 向自定义 \set 宏添加额外空间?

如何防止 amsmath 的 \dots 向自定义 \set 宏添加额外空间?

我编写了一个自定义\set宏来排版集合,允许在每个逗号处换行:

\documentclass{article}
\usepackage[T1]{fontenc}
%\usepackage{amsmath} %<-- (un)comment to toggle the problem


% this is the colon in expressions like {n : n < 10}
\newcommand*{\setgiven}[1][]{%              #1 is discarded
  \nonscript\medspace\mathord:\allowbreak%  medspace? + : + break?
  \nonscript\medspace\mathopen{}%           medspace?
}

% \parseset splits a comma-separated list like
% 1,2,3,4,5
% into a sequence stored in \g_setlist_seq
\ExplSyntaxOn
\seq_new:N \g_setlist_seq
\cs_new_nopar:Npn \parseset #1 {
  \seq_set_split:Nnn \g_setlist_seq { , } { #1 }
}
% \printset prints list \g_setlist_seq with
% each element separated by  ,\allowbreak
\cs_new_nopar:Npn \printset {
  \seq_use:Nnnn \g_setlist_seq {,\allowbreak}{,\allowbreak}{,\allowbreak}
}
\ExplSyntaxOff

\NewDocumentCommand{\set}{s o m}{%
  % \set{1,2,3} => simple set that allows line breaks at commas
  % \set[n]{n<10} => {n : n < 10}
  % the starred versions use \left\{ and \right\} to handle "tall" characters
  \parseset{#3}%
  \IfValueTF{#2}  % WITH optional argument
  {\IfBooleanTF{#1}  % starred: \left and \right
    {\left\lbrace #2\setgiven[\delimsize] \printset \right\rbrace}%
    {\lbrace #2\setgiven[\delimsize] \printset \rbrace}%
  }
  % WITHOUT optional argument
  {\IfBooleanTF{#1}  % starred: \left and \right
    {\left\lbrace \printset \right\rbrace}
    {\lbrace \printset \rbrace}%
  }%
}


\begin{document}

\begin{tabular}{r l}
  With \string\mathellipsis & $\set{1, 2, \mathellipsis}$\\
  With \string\dots & $\set{1, 2, \dots}$\\
  %With \string\dotsc & $\set{1, 2, \dotsc}$\\ %<-- uncomment when using amsmath
  With \string\dots\string\relax & $\set{1, 2, \dots\relax}$\\
  With \string\dots\{\} & $\set{1, 2, \dots{}}$
\end{tabular}

\end{document}

此宏应该可以很好地与 配合使用amsmath,因为它是一个非常常见的包。编写诸如 之类的集合也很常见\set{1, 2, \dots},因此宏\dots在末尾也应该可以很好地与 配合使用。

我发现虽然宏在标准 LaTeX 中是可以的,但是如果你在其他内容中间使用 (,以 结尾\set会增加一些额外的空间,例如,就可以了)。\dotsamsmath\dots\set{1, \dots, n}

常规 LaTeX:

在此处输入图片描述

amsmath

在此处输入图片描述

在检查amsmath.sty并阅读很少 问题在这里,我知道amsmath版本\dots会检查下一个标记来决定使用哪种点,但我不知道为什么在这种情况下它会增加额外的空间。

\set有一种方法可以防止这种情况,在: 末尾使用其他内容,\dots\relax并且\mathellipsis有效,但 \dots{}\dotsc无效(这不是很直观,我认为人们会期望所有这四个都能起作用)。

所以,有没有办法让用户amsmath只需输入\dots,而不会占用额外的空间

答案1

因为您所显示的尾随\relax已经足够,所以您可以提供一个,它不会影响除此前瞻之外的任何东西。

  \parseset{#3\relax}%
              %%%%%% 

相关内容