答案1
您希望使公式具有相同的高度。这里我使用\mathstrut
,但在可选参数中您可以使用任何\vphantom
。
\documentclass{article}
\usepackage{amsmath}
\newcommand{\ubracetext}[3][\mathstrut]{%
\mathinner{%
\underbrace{#1#2}_{\textrm{\vphantom{X}#3}}%
}%
}
\begin{document}
\begin{equation*}
\ubracetext{Y(z)}{output} =
\ubracetext{z^{-1}}{delay}
\ubracetext{X(z)}{input}
\end{equation*}
\end{document}
如果需要的话你可以做
\ubracetext[\vphantom{<formula>}]{top}{bottom}
请注意,最后一个参数(下标)中的空格是被尊重的;不要仅仅为了保持源代码的对齐而添加它们。
答案2
三个下括号中间没有与其他两个垂直对齐的原因是,关联\underbrace
指令的第一个参数不包含突出于基线以下的材料;相反,第一个和第三个\underbrace
指令的第一个参数包含(
和)
。
为了解决这个问题,我建议您在 旁边插入指令\mathstrut
-- ,其定义为-- 。我还会使用(或) 代替。并且我会使用指令让单词“输出”位于相关括号的左侧和右侧。\vphantom{)}
z^{-1}
\textnormal
\textup
\textrm
\mathclap
并且,为了在排版类中达到最佳效果,在第一个和第三个指令的第二个参数中插入\vphantom{d}
指令(也可以这样做) 。\vphantom{l}
\underbrace
如果您的文档包含大量这些表达式,我会考虑创建一个自定义宏 - 按照给出的行@egreg 的回答——简化和标准化创建这些下括号表达式。
\documentclass{article}
\usepackage{mathtools} % for \mathclap macro
\begin{document}
\[
\underbrace{Y(z)} _{\mathclap{\textnormal{output\vphantom{d}}}} =
\underbrace{z^{-1}\mathstrut} _{\textnormal{delay}}\,
\underbrace{X(z)} _{\textnormal{input}\vphantom{d}}
\]
\end{document}
附录-- 我刚刚注意到原帖者已经修改并简化了他们的查询。因此,上面给出的答案的细节可能不再那么有用。然而,原则建议的调整所依据的规则保持不变。以 OP 的新代码块为例:
\[
\underbrace{(zzz)}_{\textrm{tall}}
\underbrace{zzz}_{\textrm{short}}
\]
请注意,第一\underbrace
条指令的第一个参数包含(
,它突出于基线以下,而第二\underbrace
条指令的第一个参数不包含 。要修复由此导致的水平括号放置深度差异,请\mathstrut
在第二行插入一条指令:
\[
\underbrace{(zzz)}_{\textrm{tall}}
\underbrace{zzz\mathstrut}_{\textrm{short}}
\]
这可以完美地实现,因为\mathstrut
被定义为\vphantom{(}
,它是具有一定高度和(重要的是)深度的印刷支柱 - 并且没有宽度,这使得它不可见,从而证明了 中的“幻影”部分\vphantom
。
\documentclass{article}
\usepackage{amsmath} % for '\underbrace' and '\text' macros
\begin{document}
\[
\underbrace{(zzz)}_{\textrm{tall}} \underbrace{zzz}_{\textrm{short}}
\quad\text{vs.}\quad
\underbrace{(zzz)}_{\textrm{tall}}\,\underbrace{zzz\mathstrut}_{\textrm{short}}
\]
\end{document}
答案3
简短回答
为所有下括号添加相同的\vphantom
分隔符,并将最长的下划线字符传递给它。 本身\vphantom
可以位于命令参数中的任何位置\underbrace
:
\underbrace{(zzz)\vphantom{(}}_{\textrm{tall}}
\underbrace{zzz \vphantom{(}}_{\textrm{short}}
Lyx 程序
在 Lyx 中,可以使用菜单Insert | Formatting | Phantom
(更多的),或者使用工具栏中的数学间距菜单:
键入要用作参数的文本,选择它并插入间隔符。间隔符在其灰色参数上方显示为红色箭头,可随时编辑,结果以交互方式更新:
细节
经过几次尝试后,我能够理解这是如何工作的,这里有一个不使用宏/定义的解决方案,因为:
我只遇到过几次错位的情况。
我更喜欢自包含的命令,以便代码可以从一个文档移植到另一个文档,而不受调整标题/前言的限制。
错位的原因
下支架锚定在垂直位置,基于最长的字符下降符. 下降部是某些字形的底部部分,延伸到排版基线以下,例如y
或g
。
因此,由于不能保证它们的参数包含相同的下划线,因此这种锚定位置因下划线而异。不幸的是,在 Latex 中,没有内置机制让同一行上的下划线自动协调其垂直位置。
解决方案
绕过方法是将具有最高字形的字符添加到所有下括号中,以便它们计算相同的垂直位置。
但是我们不希望出现这个额外的字符。幸运的是,有一个助手\phantom
,创建一个透明区域,包含为其参数提供的任何内容,从而考虑到可能的下降字符。
“幻影”这个名字是有意义的,因为传递给助手的参数不会显示,只用于强制间距。
当然,我们只对创建的垂直空间感兴趣,我们不想添加空的水平空间。 有两种变体\phantom
,一种只显示宽度(\hphantom
),一种只显示高度(\vphantom
)。因此我们可以使用\vphantom
。
(为了完整起见,还有另一种解决方案,使用规则,但据说很“脆弱”。)
幻影论证的选择
的参数\vphantom
可以是任意值,通常是一个字符。我们选择所有下括号中降部最长的字符。
具有长下降部分的字母字符:jpqy({[|]})
。
注意实际边界框取决于字形,因此取决于使用的字体。特别是字体中的数字老式数字的字形有较长的下行线,而某些字形(如 for)s
可以有装饰性的花饰。因此,在特定情况下使用(
or)
并不能保证成功。具有良好所见即所得功能的文字处理应用程序会很有帮助。
在数学公式中,可能会选择某些符号(例如可以选择积分等符号,包括其极限)。
没有什么可以阻止传递多个字符并让特征自行计算最外层边界框。
最终代码
替换此代码:
\underbrace{(zzz)_{\textrm{tall}}
\underbrace{zzz }_{\textrm{short}}
经过:
\underbrace{(zzz)\vphantom{(}}_{\textrm{tall}}
\underbrace{zzz\vphantom{(}} _{\textrm{short}}
感谢 Barbara、Mico 和 egreg 为构建此答案提供了很好的建议。 也看看他们的答案,它们包含可能适合您需求的替代方案。