我想减少关系符号周围的间距括号内出现的从 thickmuskip 到 thinmuskip。以下是我得出的结论:
\documentclass{article}
\usepackage{xcolor}
\usepackage{amsmath}
\usepackage{ifthen}
\newboolean{inpara}
\setboolean{inpara}{false}
\catcode`(=\active
\def({%
\string(%
\setboolean{inpara}{true}%
}
\catcode`)=\active
\def){%
\string)%
\setboolean{inpara}{false}%
}
\catcode`==\active
\def={%
\ifthenelse{\boolean{inpara}}{\,\mathord{\string=}\,}{\string=}%
}
\begin{document}
\[P(U_n) = \int_0^1\rho(c)\cdot P(U_n\mid C=c)\; \text{d}c\]
\end{document}
需要从两个方面进行改进:
- 到目前为止,它只适用于
=
。我可以为我使用的所有其他关系符号添加类似的代码,但我更喜欢一种更优雅的解决方案,可以\mathrel
自行修改。不过,我没有该命令的默认定义,而且显然我不明白如何使用\show
,因为\show\mathrel
会产生无信息的结果。 - 它与 xcolor 包一起生成错误消息。(该包在 MWE 中是多余的,但在实际文档中不是多余的。)
有人能帮忙吗?如果需要更多信息,请告诉我。
答案1
你可以做这样的事情:
\catcode`(=13
\def(#1){%
\string(%
\def\tmp{#1}\checkrightprimitive#1\end\right\end\relax
\hbox{\thickmuskip=\thinmuskip$\tmp$}\doright)%
}
\def\checkrightprimitive#1\right\end#2\relax{%
\ifx\relax#2\relax \def\doright{}\else \def\tmp{#1}\def\doright{\right}\fi
}
$$
a = b + (c=d)
$$
新的内联数学模式在括号之间打开,其中 的\thickmuslip
设置不同。\checkrightprimitive
宏检查 是否)
在 之前,\right
并将其移到 之后\hbox
。这允许构造\left(...\right)
。
该宏不适用于嵌套括号,在这种情况下(...(...)...)
您必须书写。(...{(...)}...)
第二个问题是这个宏不尊重数学风格。但可以使用来解决\matchoice
。
答案2
您无法修改,因为它是一个 TeX 原语,当使用 或另一个关系符号\mathrel
的排版时,它甚至不会进入场景。=
您可能会考虑使=
(数学)活跃并将其定义为问题(使用调整间距的\modifiedmathrel{=}
幻想命令,但遗憾的是,这实际上是不可能的。\modifiedmathrel
此外,如果您需要P(A\mid x=(a+b)c)
,您将遇到嵌套的麻烦。
由于该应用似乎仅限于概率,因此这里有一个建议:
\documentclass{article}
\usepackage{amsmath}
\RenewDocumentCommand{\Pr}{ >{\SplitArgument{1}{|}}r() }{%
P(\makepr#1)%
}
\NewDocumentCommand{\makepr}{mm}{%
\reducespaces{#1}%
\IfValueT{#2}{\,|\,\reducespaces{#2}}%
}
\NewDocumentCommand{\reducespaces}{m}{%
\mathpalette\reducespacesaux{#1}%
}
\NewDocumentCommand{\reducespacesaux}{mm}{%
\mbox{%
\mathsurround=0pt
\thickmuskip=\thinmuskip
\medmuskip=1\thinmuskip minus 1\thinmuskip
$#1#2$%
}%
}
\begin{document}
\[
\Pr(U_n) = \int_0^1\rho(c)\cdot \Pr(U_n | C=c)\,\mathrm{d}c
\]
\[
\Pr(A=B)\quad \Pr(A=B|C<D)\quad \Pr(A|x=(a+b)c)
\]
\end{document}
我更喜欢\Pr{...}
;在这种情况下,魔法代码的第一行应该是
\RenewDocumentCommand{\Pr}{ >{\SplitArgument{1}{|}}m }{%
答案3
尝试使用活动字符执行此操作,正如您所注意到的,会带来一些痛苦和折磨。更好的方法是创建一个宏,设置括号及其内容并调整间距。未经测试的原型:
\newcommand{\pp}[1]{{
\thickmuskip=\thinmuskip
(#1)
}}
\[P(U_n) = \int_0^1\rho(c)\cdot P\pp{U_n\mid C=c}\; \text{d}c\]
更新正如评论中指出的那样,这不会起作用,因为\thickmuskip
每个数学模式都有一个设置。如果你要这样做,你需要使用\mbox
退出数学模式,然后返回数学模式(\mathpalette
如果你需要保留是否处于上标/下标、显示数学等,也许可以使用),然后设置\thickmuskip
内部数学模式。egreg 的解决方案位于https://tex.stackexchange.com/a/594618/202780提供了另一种方法,专门用于|
。