自适应 \ldots 无 ("...") 间距

自适应 \ldots 无 ("...") 间距

由于我习惯的排版传统,我更喜欢\ldots在行间不留空格,理想情况下与文本中的空格量完全相同。在数学模式下,我希望写出类似的东西,\(1, 2, \ldots, n\)并使空格具有自适应性:

  • 如果下一个字符是逗号,那么我希望后面跟着一些非常细的字符\kern .08333em(即半个\thinspace);
  • 如果点前有左括号(“(”、“[”、“{”...)或点后有右括号(“)”、“]”、“}”...),则不应有或仅应有微小的额外间距(即小于\kern .08333em);
  • 以及太空的其他任何适应性大约 \ldots或者\dots通常由 (La)TeX 生成;
  • 请随意添加其他想法

\ldots为了这些目的,重新定义的最佳方法是什么?

答案1

\ldots用于\mathellipsis表示点。可以重新定义它以使用文本版本,但混合使用文本和数学字体可能并不总是一个好主意。 \mathellipsis本身使用三个点作为标点符号。这意味着,点之间有额外的细小空间。可以通过将它们放入子公式中来改变这一点,然后将它们视为\mathord没有额外空间的原子。

\documentclass[12pt]{article}
\usepackage{amsmath}
\renewcommand*{\mathellipsis}{%
  \mathinner{{\ldotp}{\ldotp}{\ldotp}}%
}
\begin{document}
$1,2,\ldots,3$
$(1,2,\ldots)$
\end{document}

结果

较小的空间

通常,薄空间是数学模式中最小的空间,但在某种程度上\ldots可以适用于更小的空间:

\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{letltxmacro}
\renewcommand*{\mathellipsis}{%
  \mathinner{{\ldotp}{\ldotp}{\ldotp}}%
}
\makeatletter
\@ifdefinable{\org@ldots}{%
  \LetLtxMacro\org@ldots\ldots
  \DeclareRobustCommand*{\ldots}{%
    \ifmmode
      \expandafter\my@ldots
    \else
      \expandafter\textellipsis
    \fi
  }%
}
\newcommand*{\neghalfmskip}{%
  \nonscript\mskip-.5\muexpr\thinmuskip\relax%
}
\newcommand*{\my@ldots}{%
  \mathellipsis
  \@ifnextchar,\neghalfmskip{%
  \@ifnextchar:\neghalfmskip{%
  \@ifnextchar;\neghalfmskip{%
  \@ifnextchar.\neghalfmskip{%
  \@ifnextchar!\neghalfmskip{%
  \@ifnextchar?\neghalfmskip{%
  \@ifnextchar){\mskip-.5\muexpr\thinmuskip\relax}{% negative kerning
  }}}}}}}%
}
\makeatother

\begin{document}
\noindent
$1,2,\ldots,3_{1,2,\ldots,3}$ (ldots)\\
$1,2,\mathellipsis,3_{1,2,\mathellipsis,3}$ (mathellipsis)\\
$(1,2,\ldots)_{(1,2,\ldots)}$ (ldots)\\
$(1,2,\mathellipsis)_{(1,2,\mathellipsis)}$ (mathellipsis)
\end{document}

结果

TeX 仅在显示和文本样式中在内部原子和标点符号之间设置了一个细小的空格,因此使用\nonscript。在关闭 的情况下没有空格),但由于字符形状,您可能希望使用负字距,这适用于所有数学样式。

更通用的结束分隔符检测

该示例使用了 Andrew 的提示\rightdelim@

\documentclass[12pt]{article}
\usepackage{amsmath}
\usepackage{letltxmacro}
\renewcommand*{\mathellipsis}{%
  \mathinner{{\ldotp}{\ldotp}{\ldotp}}%
}
\makeatletter
\@ifdefinable{\org@ldots}{%
  \LetLtxMacro\org@ldots\ldots
  \DeclareRobustCommand*{\ldots}{%
    \ifmmode
      \expandafter\my@ldots
    \else
      \expandafter\textellipsis
    \fi
  }%
}
\newcommand*{\neghalfmskip}{%
  \nonscript\mskip-.5\muexpr\thinmuskip\relax%
}
\newcommand*{\my@ldots}{%
  \mathellipsis
  \@ifnextchar,\neghalfmskip{%
  \@ifnextchar:\neghalfmskip{%
  \@ifnextchar;\neghalfmskip{%
  \@ifnextchar.\neghalfmskip{%
  \@ifnextchar!\neghalfmskip{%
  \@ifnextchar?\neghalfmskip{%
    \rightdelim@
    \ifgtest@
      \mskip-.5\muexpr\thinmuskip\relax% negative kerning
    \fi
  }}}}}}%
}
\makeatother

\begin{document}
\noindent
$1,2,\ldots,3_{1,2,\ldots,3}$ (ldots)\\
$1,2,\mathellipsis,3_{1,2,\mathellipsis,3}$ (mathellipsis)\\
$(\neghalfmskip\ldots)_{(\neghalfmskip\ldots)}$ (neghalfmskip + ldots)\\
$(\ldots)_{(\ldots)}$ (ldots)\\
$(\mathellipsis)_{(\mathellipsis)}$ (mathellipsis)\\
$\{\ldots\}_{\{\ldots\}}$ (ldots)\\
$\{\mathellipsis\}_{\{\mathellipsis\}}$ (mathellipsis)
\end{document}

结果

但对于检测之前的开始分隔符,我找不到任何方法。没有“” \lastmathatom。可以手动应用空格校正,如示例文件所示\neghalfmskip

相关内容