在输入文章时,我需要输入许多公式,例如
$ \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}}