数学模式间距设置

数学模式间距设置

在输入文章时,我需要输入许多公式,例如

$ \left( a, b,c,d | e,f,g,h \right) $.

由于它们太紧,我应该使用\,命令添加空格来获取

$ \left( a, \, b, \, c, \, d | e, \, f, \, g, \, h \right) $.

但我的问题是这样的公式太多了。有没有命令可以改变数学模式下字符之间的默认间距?

答案1

假设您不需要下标或上标中的内容,最简单的方法是退出数学模式,将 加倍\thinmuskip,重新进入数学模式,排版列表并返回。

\documentclass{article}
\usepackage{amsmath}

\newcommand{\cls}[2]{%
  \mathord{\mbox{%
    \thinmuskip=2\thinmuskip
    $(#1\mid#2)$%
  }}%
}

\begin{document}

$( a, b,c,d \mid e,f,g,h)$

$(a,\, b,\, c,\, d \mid e,\, f,\, g,\, h)$

$\cls{a,b,c,d}{e,f,g,h}$

\end{document}

在此处输入图片描述

另一种解决方案允许像平常一样调整用 定义的命令的括号大小\DeclarePairedDelimiter,请参阅示例。它还具有更友好的语法。

\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}

\AtBeginDocument{\mathchardef\clscomma=\mathcode`, }

\ExplSyntaxOn
\NewDocumentCommand{\cls}{som}
 {
  \group_begin:
  \IfBooleanTF{#1}
   {
    \hs_cls_auto:n { #3 }
   }
   {
    \hs_cls_manual:nn { #2 } { #3 }
   }
  \group_end:
 }

\cs_new_protected:Nn \hs_cls_auto:n
 {
  \__hs_cls_activate_comma:
  \__hs_cls_activate_bar:n { \;\middle\vert\; }
  \left( #1 \right)
 }

\cs_new_protected:Nn \hs_cls_manual:nn
 {
  \__hs_cls_activate_comma:
  \__hs_cls_activate_bar:n { \__hs_cls_mid:n {#1} }
  \__hs_cls_open:n {#1} #2 \__hs_cls_close:n {#1}
 }

\cs_new_protected:Nn \__hs_cls_activate_comma:
 {
  \char_set_active_eq:nN { `, } \__hs_cls_comma:
  \mathcode`,="8000 \scan_stop:
 }

\cs_new_protected:Nn \__hs_cls_comma: { \clscomma\, }

\cs_new_protected:Nn \__hs_cls_activate_bar:n
 {
  \cs_set_protected:Nn \__hs_cls_bar: { #1 }
  \char_set_active_eq:nN { `| } \__hs_cls_bar:
  \mathcode`|="8000 \scan_stop:
 }

\cs_new_protected:Nn \__hs_cls_open:n
 {
  \tl_if_novalue:nTF { #1 } { ( } { \mathopen{#1(} }
 }
\cs_new_protected:Nn \__hs_cls_mid:n
 {
  \tl_if_novalue:nTF { #1 } { \mid } { \mathrel{#1\vert} }
 }
\cs_new_protected:Nn \__hs_cls_close:n
 {
  \tl_if_novalue:nTF { #1 } { ) } { \mathclose{#1)} }
 }
\ExplSyntaxOff

\begin{document}

$( a, b,c,d \mid e,f,g,h)$

$(a,\, b,\, c,\, d \mid e,\, f,\, g,\, h)$

$\cls{a,b,c,d|e,f,g,h}$

$\cls[\Big]{a,b,c,d|e,f,g,h}$

$\cls*{\dfrac{a}{2},b,c,d|e,f,g,h}$

\end{document}

在此处输入图片描述

答案2

您可以使用以下方法处理两个列表(左和右)etoolbox和一个狡猾的分隔符技巧

在此处输入图片描述

\documentclass{article}

\usepackage{etoolbox}

% https://tex.stackexchange.com/a/89187/5764
\newcommand{\printlist}[2][,]{%
  \def\itemdelim{\def\itemdelim{#1}}% Item delimiter delayed by one cycle
  \renewcommand*{\do}[1]{\itemdelim##1}% How each item is processed
  \docsvlist{#2}}% Process CSV list

\makeatletter
\def\@LandR#1|#2\relax{\def\leftlist{#1}\def\rightlist{#2}}%
\def\LandR#1{%
  \@LandR#1\relax
  \left( % Left bracket
  \edef\x{\noexpand\printlist[,\,]{\leftlist}}\x
  \,\middle|\, % Middle divider
  \edef\x{\noexpand\printlist[,\,]{\rightlist}}\x
  \right) % Right bracket
}
\makeatother

\begin{document}

$\left( a, b, c, d | e, f, g, h \right)$

$\LandR{a, b, c, d | e, f, g, h}$

\end{document}

每个列表都使用 打印,它会在每个分隔符 后\printlist[,\,]添加一个小空格。您可以调整左/右括号和中间分隔符的布局。\,,

如果你希望包含更大的结构,你可能需要使用\noexpand,例如

\LandR{\noexpand\frac{a}{b}, c, d, e | f, g, h, \noexpand\frac{i}{j}}

相关内容