![如何防止 amsmath 的 \dots 向自定义 \set 宏添加额外空间?](https://linux22.com/image/465536/%E5%A6%82%E4%BD%95%E9%98%B2%E6%AD%A2%20amsmath%20%E7%9A%84%20%5Cdots%20%E5%90%91%E8%87%AA%E5%AE%9A%E4%B9%89%20%5Cset%20%E5%AE%8F%E6%B7%BB%E5%8A%A0%E9%A2%9D%E5%A4%96%E7%A9%BA%E9%97%B4%EF%BC%9F.png)
我编写了一个自定义\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
会增加一些额外的空间,例如,就可以了)。\dots
amsmath
\dots
\set{1, \dots, n}
常规 LaTeX:
和amsmath
:
在检查amsmath.sty
并阅读很少 问题在这里,我知道amsmath
版本\dots
会检查下一个标记来决定使用哪种点,但我不知道为什么在这种情况下它会增加额外的空间。
\set
有一种方法可以防止这种情况,在: 末尾使用其他内容,\dots\relax
并且\mathellipsis
有效,但
\dots{}
和\dotsc
无效(这不是很直观,我认为人们会期望所有这四个都能起作用)。
所以,有没有办法让用户amsmath
只需输入\dots
,而不会占用额外的空间?
答案1
因为您所显示的尾随\relax
已经足够,所以您可以提供一个,它不会影响除此前瞻之外的任何东西。
\parseset{#3\relax}%
%%%%%%