自适应大小的分隔符不超过 \bigl 和 \bigr 的大小

自适应大小的分隔符不超过 \bigl 和 \bigr 的大小

我希望分隔符的大小可以自适应,但最大只能达到\bigl/\bigr大小。也就是说,只在普通/正常大小和大一号大小之间有变化。

\documentclass{article}
\usepackage{amsmath}

\newcommand*{\abs}[1]{\left\lvert#1\right\rvert}


\begin{document}

\(\abs{M} + \abs{M^2} + \abs{\abs{M^2}^2}\)
  % the outer delimiters on the right are of the size of \Bigl and \Bigr
  % (i.e. the next larger size after that of \bigl and \bigr)

\(\abs{M} + \abs{M^2} + \bigl\lvert \abs{M^2}^2 \bigr\rvert\)

\end{document}

我该如何实现这一点?对于上面的代码,这相当于\abs以一种使两行看起来相同的方式进行定义。

\left(这里和的默认行为\right(即缩放到\bigl/ \bigr)看起来更好,但我试图保持示例简短;我必须加载很多包来证明我的个人需要。另外,一个简单的原因是我需要在段落文本中嵌入某些公式。)

答案1

以下示例测量带有 / 和带有 / 的公式\abs\left如果\right/\bigl版本较大\bigr,则使用带有/ 的版本。\left\right\bigl\bigr

\documentclass{article}
\usepackage{amsmath}
\usepackage{mleftright}

\makeatletter
\newcommand*{\abs}[1]{%
  \mathpalette\@abs{#1}%
}
% Version with the horizontal spacing of `\left` and `\right` in all cases:
% \newcommand*{\abs}[1]{%
%   \mathinner{\mathpalette\@abs{#1}}%
% }
\newcommand*{\@abs}[2]{%
  \sbox0{$\m@th#1\mleft\lvert#2\mright\rvert$}%
  \sbox2{$\m@th#1\bigl\lvert#2\bigr\rvert$}%   
  \ifdim\wd0>\wd2 %
    \bigl\lvert#2\bigr\rvert
  \else
    \ifdim\ht0>\ht2 %
      \bigl\lvert#2\bigr\rvert
    \else
      \ifdim\dp0>\dp2 %
        \bigl\lvert#2\bigr\rvert
      \else
        \mleft\lvert#2\mright\rvert
      \fi
    \fi
  \fi
}
\makeatother

\begin{document}

\(\abs{M} + \abs{M^2} + \abs{\abs{M^2}^2}\)

\(\abs{M} + \abs{M^2} + \bigl\lvert \abs{M^2}^2 \bigr\rvert\)

\end{document}

结果

评论:

  • 而不是使用包中的\left/\right\mleft/来避免/的额外间距。\mrightmleftright\left\right

  • 该方法并非“万无一失”。它做出以下假设。如果\mleft和选择的分隔\mright符大于 和 的版本\bigl\bigr则只有当宽度、高度或深度至少增加时才能检测到这种情况。对于宽度保持不变的情况,较大的分隔符需要略大于公式,否则公式会隐藏分隔符的高度/深度。我还没有分析所有可调整大小的分隔符,但我认为,通常分隔符的宽度会变得更大,容易被检测到。

第二种方法

该方法根据 DE Knuth 的《The TeXbook》“附录 G:从公式生成框”第“19”项实现了最小分隔符大小的算法:

如果数学列表以边界项开始和结束,则计算最大高度H和深度d数学列表翻译中的框 [...]。让A=σ22为轴高,设δ= 最大(H-Ad+A) 是公式从轴延伸的量。用高度加深度至少为 max(⎣δ/500⎦) 的分隔符替换边界项F, 2δ-), 在哪里F\delimiterfactor是个\delimitershortfall。 [...]

它可以正确处理像这样的表达式M^{2^{2^2}}_{f_{f_f}},该表达式违反了关于分隔符维度的假设,从而破坏了第一种方法。

示例文件:

\documentclass{article}
\usepackage{amsmath}
\usepackage{mleftright}

\makeatletter
\newcommand*{\abs}[1]{%
  \mathpalette\@abs{#1}%
}
% Version with the horizontal spacing of `\left` and `\right` in all cases:
% \newcommand*{\abs}[1]{%
%   \mathinner{\mathpalette\@abs{#1}}%
% }
\newcommand*{\@abs}[2]{%
  % a := math axis height -> \dimen0
  \sbox0{$#1\vcenter{}$}%
  \dimen0=\ht0 %
  % formula without delimiters -> \box0
  % h := height of formula -> \ht0
  % d := depth of formula -> \dp0
  \sbox0{$#1#2$}%
  % delta := max(h-a, d+a) -> \dimen2
  \dimen2=\dimexpr\ht0-\dimen0\relax
  \dimen4=\dimexpr\dp0+\dimen0\relax
  \ifdim\dimen4>\dimen2 %
    \dimen2=\dimen4 %
  \fi
  % delimiter's total height >= max(floor(delta/500)*f, 2*delta - l)
  %   -> \dimen4
  % f := \delimiterfactor
  % l := \delimitershortfall
  \dimen4 = \dimen2 %
  \divide\dimen4 by 500 %
  \dimen4=\delimiterfactor\dimen4 %
  \dimen6=\dimexpr 2\dimen2 - \delimitershortfall\relax
  \ifdim\dimen6>\dimen4 %
    \dimen4=\dimen6 %
  \fi
  % formula with \bigl/\bigr
  \sbox0{$#1\bigl\lvert\bigr\rvert$}%
  % comparison: Use \mleft/\mright, if \bigl/\bigr is larger than needed
  \ifdim\dimexpr\ht0+\dp0\relax>\dimen4 %
    % Case 1: \bigl/\bigr is larger than the minimum needed height.
    %   This means that either (\lvert,\rvert) or (\bigl\lvert,\bigr\rvert)
    %   provide the smallest delimiter size that meet the minimum height requirement.
    %   Consequently we can have \mleft/\mright choose (they won't pick anything
    %   larger than \bigl/\bigr).
    \mleft\lvert#2\mright\rvert
  \else
    % Case 2: \bigl/\bigr is exactly right or smaller than the required minimum height
    %   => use \bigl\bigr
    \bigl\lvert#2\bigr\rvert
  \fi
}
\makeatother

\begin{document}

\(\abs{M} + \abs{M^2} + \abs{\abs{M^2}^2}\)

\(\abs{M} + \abs{M^2} + \bigl\lvert \abs{M^2}^2 \bigr\rvert\)

\( \abs{M^{2^{2^2}}_{f_{f_f}}} \)

\end{document}

结果

相关内容