我发现 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}
输出对我来说看起来不错(原来的在上面,我的在下面):