我希望分隔符的大小可以自适应,但最大只能达到\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
/来避免/的额外间距。\mright
mleftright
\left
\right
该方法并非“万无一失”。它做出以下假设。如果
\mleft
和选择的分隔\mright
符大于 和 的版本\bigl
,\bigr
则只有当宽度、高度或深度至少增加时才能检测到这种情况。对于宽度保持不变的情况,较大的分隔符需要略大于公式,否则公式会隐藏分隔符的高度/深度。我还没有分析所有可调整大小的分隔符,但我认为,通常分隔符的宽度会变得更大,容易被检测到。
第二种方法
该方法根据 DE Knuth 的《The TeXbook》“附录 G:从公式生成框”第“19”项实现了最小分隔符大小的算法:
如果数学列表以边界项开始和结束,则计算最大高度H和深度d数学列表翻译中的框 [...]。让A=σ22为轴高,设δ= 最大(H-A,d+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}