![如何使下括号标签文本在括号宽度处换行?](https://linux22.com/image/315736/%E5%A6%82%E4%BD%95%E4%BD%BF%E4%B8%8B%E6%8B%AC%E5%8F%B7%E6%A0%87%E7%AD%BE%E6%96%87%E6%9C%AC%E5%9C%A8%E6%8B%AC%E5%8F%B7%E5%AE%BD%E5%BA%A6%E5%A4%84%E6%8D%A2%E8%A1%8C%EF%BC%9F.png)
有没有办法让下括号标签文本自动按照下括号宽度换行,最好还能自动分音节?
括号标签文本超出下括号宽度的示例:
$\underbrace{f(x) = a^2 + 2ab + b^2}_\text{This is some pretty long label for a rather short formula}$
答案1
如果你想改变全局的行为,\underbrace
你可以说
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\let\ams@underbrace=\underbrace
\def\underbrace#1_#2{%
\setbox0=\hbox{$\displaystyle#1$}%
\ams@underbrace{#1}_{\parbox[t]{\the\wd0}{#2}}%
}
\makeatother
\begin{document}
$\underbrace{f(x) = a^2 + 2ab + b^2}_{This is some pretty long label for a rather short formula}$
\end{document}
无论如何,您还可以使用相同的参数解析和几乎相同的替换来创建自定义下括号宏(在这种情况下,无需先存储原始宏) - 即\def\myunderbrace#1_#2{\setbox...\underbrace...}
- 将此黑客的影响限制在您希望它实际发生的地方。
现在,可以通过在 parbox 中添加不同的对齐来改进输出(感谢@barbarabeeton!),即
...\parbox[t]{\the\wd0}{\centering#2}...% or
% \parbox[t]{\the\wd0}{\raggedright#2}
得出以下结果:
(第一种情况)
(第二种情况)
为了更加灵活,您可以向命令添加一个可选参数\underbrace
,指定下括号标签的对齐方式\underbrace[c]{Some maths}_{Some text}
,例如。以下代码允许以下对齐规范:
- C-- 居中
- 升- 左边
- r- 正确的
- F-- 模糊
完整代码
\documentclass{article}
\usepackage{amsmath}
\makeatletter
\let\ams@underbrace=\underbrace
\def\underbrace{\kernel@ifnextchar[{\underbrace@}{\underbrace@[l]}}% default value: l
\def\underbrace@[#1]#2_#3{%
\ifx#1c\relax
\let\ubr@align\centering%
\else
\ifx#1l\relax
\let\ubr@align\raggedright%
\else
\ifx#1r\relax
\let\ubr@align\raggedleft%
\else
\ifx#1f\relax
\let\ubr@align\relax%
\else
\message{`#1' isn't a valid alignment specification for the underbrace command}%
\fi
\fi
\fi
\fi
\setbox0=\hbox{$\displaystyle#2$}%
\ams@underbrace{#2}_{\parbox[t]{\the\wd0}{\ubr@align#3}}%
}
\let\ubr@align\relax
\makeatother
\begin{document}
$\underbrace[c]{f(x) = a^2 + 2ab + b^2}_{This is some pretty long label for a rather short formula}$
\end{document}
答案2
在此代码中,我定义了一个\parunderbrace
带有两个参数的命令,它会自动调整到公式的宽度:
\documentclass{article}
\usepackage{mathtools}
\usepackage{ragged2e}
\newlength\ubwidth
\newcommand\parunderbrace[2]{\settowidth\ubwidth{$#1$}\underbrace{#1}_{\parbox{\ubwidth}{\scriptsize\RaggedRight#2}}}
\begin{document}
\[ \parunderbrace{f(x) = a^2 + 2ab + b^2}{This is some pretty long label for a rather short formula} \]
\end{document}