仅减少括号内的空间

仅减少括号内的空间

我想减少关系符号周围的间距括号内出现的从 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}

需要从两个方面进行改进:

  1. 到目前为止,它只适用于=。我可以为我使用的所有其他关系符号添加类似的代码,但我更喜欢一种更优雅的解决方案,可以\mathrel自行修改。不过,我没有该命令的默认定义,而且显然我不明白如何使用\show,因为\show\mathrel会产生无信息的结果。
  2. 它与 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提供了另一种方法,专门用于|

相关内容