嵌套括号的自动大小调整

嵌套括号的自动大小调整

由于我更喜欢​​在嵌套表达式中将外括号变大,所以我经常插入\bigland\bigr及其更大的同类。我一直想知道是否有办法自动完成此操作。

在所有开括号和闭括号之前预防性地插入\left\right并希望它能解决问题,但并非在所有情况下都能奏效,如下所示。

左侧列没有任何大小更改命令。中间列是\left \right每个括号/大括号/方括号的一对,最右侧列显示的是我喜欢的版本。

例子

如第二行和第三行中间一列所示,\leftand\right对有时会使外括号变大,代价是\Prand之间有一个额外的水平空格(。如果左括号真的很大,额外的空格是可以的,但在这里我更喜欢常规间距。

\documentclass{scrartcl}
\usepackage{amsmath}
\usepackage{amsfonts}
\begin{document}
\begin{align*}
&1-(1-F(x))^n&&1-\left(1-F(x)\right)^n&&1-\bigl(1-F(x)\bigr)^n\\
&\Pr(X_{(1)}\le x)&&\Pr\left(X_{(1)}\le x\right)&&\Pr\bigl(X_{(1)}\le x\bigr)\\
&\mathbb{E}[\min\{X_1,X_2\}]&&\mathbb{E}\left[\min\left\{X_1,X_2\right\}\right]&&\mathbb{E}\bigl[\min\left\{X_1,X_2\right\}\bigr]\\
&\left(\pi-\arccos(\frac{y}{r})\right)&&(\pi-\arccos\left(\frac{y}{r}\right))&&\left(\pi-\arccos \left(\frac{y}{r}\right)\right)
\end{align*}
\end{document}

由于数学表达式可以任意复杂,因此可能没有通用的方法可以做到这一点。但我并不是在寻求一般情况的解决方案。在上述简单情况下有效的部分解决方案将大有帮助。简单的规则可能是,括号永远不会缩小到内部对的大小以下。当然,您可以立即想到像\mid条件期望中的扩展一样,它会随着期望括号的大小而增长。

您对嵌套括号的大小有什么偏好?除了\bigl \bigr手动插入之外,有没有更好的方法来实现您喜欢的样式?


编辑:

一位同事向我推荐了 Herbert Voß 的《数学模式文档中,括号的大小问题通过在相关表达式周围的组中使用两个 TeX 参数来解决。这自然导致了 TeXbook 的附录 G,其中解释了\delimitershortfall和的机制。\delimiterfactor

\delimitershortfall指定分隔符未覆盖的最大空间(默认为 5pt), \delimiterfactor是可变分隔符的比率乘以 1000(默认为 901)。

我用它们来实现永远不会缩小到子公式大小以下通过将缺口设置为 0pt 并将比例设置为 1.0,可以实现上述想法。

例子

虽然它在第一行和第三行运行良好,但在第二行和第四行中括号现在变得太大,并且仍然有引入的额外水平空间\left

答案1

nath包装\delimgrowth=1非常接近您喜欢的风格。

\documentclass{article}
\usepackage{amssymb}
\usepackage{nath}
\delimgrowth=1

\begin{document}
  \begin{equation}
     1 - (1-F(x))^n \\
     \Pr(X_{(1)} \le x) \\
     \mathbb{E}[\min\{X_1, X_2\} ] \\
     ( \pi - \arccos (\frac {y}{r}) )
  \end{equation}
\end{document}

在此处输入图片描述

阅读纳特指南了解详细信息,特别是与 不兼容的部分amsmath

答案2

按照以下方式使用,在两个大括号之间留出一个小的负空间:

\documentclass{scrartcl}
\usepackage{amsmath}
\begin{document}
\delimitershortfall=-1pt
\begin{align*}
\left(\pi-\arccos \left(\frac{y}{r}\right)\right)\\
\left(\pi-\arccos \left(\frac{y}{r}\right)\!\right)
\end{align*}
\end{document}

在此处输入图片描述

这里有一个想法,如何使用双((and/or来实现))。也可以使用\left((...( and a 。只有和括号\right))...)的数量必须相互对应\left\right

\documentclass{scrartcl}
\usepackage{amsmath}

\delimitershortfall=-1pt
\let\Right\right
\let\Left\left
\makeatletter
\def\right#1{\Right#1\@ifnextchar){\!\right}{}}
\def\left#1{\Left#1\@ifnextchar({\!\left}{}}
\makeatother
\begin{document}
\begin{align*}
\left(\pi-\arccos \left(\frac{y}{r}\right)\right)\\
\left(\pi-\arccos \left(\frac{y}{r}\right))\\
\left((\pi-\arccos \left(\frac{y}{r}\right)))\\
\left(\left(x + \frac12\right)\arccos(\pi)\right)\\
\left((x + \frac12\right)\arccos(\pi)\right)
\end{align*}
\end{document}

在此处输入图片描述

答案3

您可以不使用外部包来执行此操作,如果解决方案需要在 KaTeX 中工作,这可以简化一些事情。您可以通过在括号内容周围使用不可见的下标来定义自己的“增长括号”命令:

\newcommand{\paren}[1]{\mathopen{}\left( {#1}_{{}_{}}\,\negthickspace\right)\mathclose{}}
\newcommand{\bracket}[1]{\mathopen{}\left[ {#1}_{{}_{}}\,\negthickspace\right]\mathclose{}}

在正确的地方使用时,它会给你你想要的外观(中间一列已被修改):

\begin{aligned}
&1-(1-F(x))^n&&1-\paren{1-F(x)}^n&&1-\bigl(1-F(x)\bigr)^n\\
&\Pr(X_{(1)}\le x)&&\Pr\left(X_{(1)}\le x\right)&&\Pr\bigl(X_{(1)}\le x\bigr)\\
&\mathbb{E}[\min\{X_1,X_2\}]&&\mathbb{E}\bracket{\min\left\{X_1,X_2\right\}}&&\mathbb{E}\bigl[\min\left\{X_1,X_2\right\}\bigr]\\
&\left(\pi-\arccos(\frac{y}{r})\right)&&\left(\pi-\arccos\left(\frac{y}{r}\right)\right)&&\left(\pi-\arccos \left(\frac{y}{r}\right)\right)
\end{aligned}
\[ \paren{\paren{\paren{\paren{\paren{}}}}} \]
\[ \bracket{\bracket{\bracket{\bracket{\bracket{}}}}} \]

对齐

答案4

我所做的是声明一个括号函数,该函数用于\vphantom\raisebox外部定界符添加额外的高度。

解决方案并不完美:

  • 我使用\mathop因为其他方法\vphantom不起作用然后添加负空间来抵消增加的额外空间\mathop

  • 另外,\raisebox您还需要使用\( \)进入数学模式并\displaystyle获得正确的虚拟高度

但它对我有用,你仍然可以调整\delimtershortfall\delimiterfactor满足你的喜好(如果你还调整了 中的增加\raisebox)。你也可以更改 中的值\raisebox来调整分隔符的增长。

\documentclass[12pt,a4paper]{article}
\usepackage{mleftright}


\global\delimitershortfall=5.5pt
\global\delimiterfactor=880
\renewcommand*{\left}{\mleft}
\renewcommand*{\right}{\mright}
\newcommand{\braced}[1]
    { \left( #1 \right) 
        \mskip-1.5mu \vphantom{ \mathop{
           \raisebox{3pt}{ \(\left(\displaystyle #1 \right)\) } } }
    }

\begin{document}
    \[
    \braced{ x + \braced{\braced{ y }} }
    \]
\end{document}

例子

相关内容