自动增加括号内的间距

自动增加括号内的间距

我发现 LaTeX 对许多常见数学表达式的自动空格非常丑陋,尤其是括号。例如:

$f(x+a)$并且$\mathbf{P}(x=a)$两者的“x”和“a”都更靠近括号而不是等号。

为了缓解这种情况,我想增加前后(间距) 自动地在所有数学中。我该怎么做?(我绝对不想手动插入\,所有东西以获得更好的间距。)不幸的是,我对 TeX 不够熟悉,不知道如何干预括号之类的原语。

答案1

尽管有评论,但我会在这里使用宏,而且正如本例所示,我认为带有额外空格的第三行比默认布局更糟糕,我更喜欢参数间距更紧密的最终布局。当然,这都是相对主观的,没有对错之分。

在此处输入图片描述

\documentclass{article}


\usepackage{amsmath}
\begin{document}
    

\newcommand\apply[2]{#1(#2)}
\[\apply{f}{x+a} \qquad \apply{\mathbf{P}}{x=a}\]
    
\renewcommand\apply[2]{#1\left(#2\right)}
\[\apply{f}{x+a} \qquad \apply{\mathbf{P}}{x=a}\]

\renewcommand\apply[2]{#1\left(\,#2\,\right)}
\[\apply{f}{x+a} \qquad \apply{\mathbf{P}}{x=a}\]

\renewcommand\apply[2]{#1\left(\hbox{$\thinmuskip=0mu\medmuskip=0mu\thickmuskip=0mu#2$}\right)}
\[\apply{f}{x+a} \qquad \apply{\mathbf{P}}{x=a}\]

\renewcommand\apply[2]{#1\mathopen{}{\left(\hbox{$\thinmuskip=0mu\medmuskip=0mu\thickmuskip=0mu#2$}\right)}\mathclose{}}
\[\apply{f}{x+a} \qquad \apply{\mathbf{P}}{x=a}\]

\end{document}

答案2

我终于找到了一个解决方案,可以自动增加 之后(和 之前的间距)。对于那些\left和修改的人来说,right这很容易:

\renewcommand\left[1]{\mathopen{}\mathclose\bgroup\ifx#1(\originalleft(\,\else\originalleft#1\fi}
\renewcommand\right[1]{\aftergroup\egroup\ifx#1)\,\originalright)\else\originalright#1\fi}

对于普通的括号,我们需要使用让他们活跃起来的技巧.应用这里我们得到:

\begingroup\lccode`~=`(\lowercase{\endgroup\def~}{\oldlbrac\,}
\AtBeginDocument{\mathchardef\oldlbrac=\mathcode`(\mathcode`(="8000}
\begingroup\lccode`~=`)\lowercase{\endgroup\def~}{\,\oldrbrac}
\AtBeginDocument{\mathchardef\oldrbrac=\mathcode`)\mathcode`)="8000}
\makeatletter
\def\resetMathstrut@{%
    \setbox\z@\hbox{%
        \mathchardef\@tempa\mathcode`\[\relax
        \def\@tempb##1"##2##3{\the\textfont"##3\char"}%
        \expandafter\@tempb\meaning\@tempa \relax
    }%
    \ht\Mathstrutbox@\ht\z@ \dp\Mathstrutbox@\dp\z@}
\makeatother

以下是完整的工作示例:

\documentclass{article}
\usepackage{amsmath}
\usepackage{mathtools}
\usepackage[T1]{fontenc}

\newlength\bracskip\setlength{\bracskip}{.04em plus .04em minus .02em}
\newcommand\bracspace{\hspace{\bracskip}}
\begingroup\lccode`~=`(\lowercase{\endgroup\def~}{\oldlbrac\bracspace}
\AtBeginDocument{\mathchardef\oldlbrac=\mathcode`(\mathcode`(="8000}
\begingroup\lccode`~=`)\lowercase{\endgroup\def~}{\bracspace\oldrbrac}
\AtBeginDocument{\mathchardef\oldrbrac=\mathcode`)\mathcode`)="8000}
\let\originalleft\left
\let\originalright\right
\renewcommand\left[1]{\mathopen{}\mathclose\bgroup\ifx#1(\originalleft(\,\else\originalleft#1\fi}
\renewcommand\right[1]{\aftergroup\egroup\ifx#1)\,\originalright)\else\originalright#1\fi}
\makeatletter
\def\resetMathstrut@{%
    \setbox\z@\hbox{%
        \mathchardef\@tempa\mathcode`\[\relax
        \def\@tempb##1"##2##3{\the\textfont"##3\char"}%
        \expandafter\@tempb\meaning\@tempa \relax
    }%
    \ht\Mathstrutbox@\ht\z@ \dp\Mathstrutbox@\dp\z@}
\makeatother

\begin{document}
$f(x+a)$ and $\mathbf{P}\left( y = (f(x)+1)^2 \right)$.
\end{document}

输出对我来说看起来不错(原来的在上面,我的在下面):

括号内间距更佳

相关内容