我经常使用该cancel
包来抵消数学表达式中的项,但有时这些项包含下括号。请看以下(人为的)示例:
\[abc + \cancel{d \underbrace{(e - e)}_{0} f}\]
在这里,我取消了项 $d(e - e)f$,下括号强调了是 $(e - e)$ 使得整个项为 0。但是,如您所见,对角线延伸得太低,理想情况下它应该忽略下括号增加的额外高度。使用\smash
和,\vphantom
如这个帖子适用于简单的情况,但有时额外的高度不能完全忽略:
\documentclass{article}
\usepackage{amsmath}
\usepackage{cancel}
\DeclareDocumentCommand{\underbracesmash}{mm}{\vphantom{#1} \smash{\underbrace{#1}_{#2}}}
\begin{document}
\begin{align*}
&= abc + \cancel{d \underbracesmash{(e - e)}{0} f} + ghi + jkl\\
&= abc + ghi + jkl
\end{align*}
\end{document}
我可以继续使用\smash
和\vphantom
使其工作,但这似乎不必要地重复。即使我要定义更多命令来减少重复,就像我上面对所做的那样\underbracesmash
,这仍然看起来太过黑客了。有没有更简单/更有效的方法来实现这一点?
答案1
定义命令是有用。
由于\underbrace
和\overbrace
在各种场合都可能被粉碎,我们可以一举两得:
在很多情况下,周围的间距
\underbrace
和\overbrace
零件是错误的,所以我们会修复它;我们可以处理它们被粉碎的情况,但仍然保持它们占据的垂直空间。
\documentclass{article}
\usepackage{amsmath,cancel}
% better \ubrace{x}{y} than \underbrace{x}_{y}
\NewDocumentCommand{\ubrace}{mm}{\perhapssmash{\underbrace{#1}_{#2}}}
\NewDocumentCommand{\obrace}{mm}{\perhapssmash{\overbrace{#1}^{#2}}}
\NewDocumentCommand{\perhapssmash}{m}{{#1}}
% smash and add
\NewDocumentCommand{\smashcancel}{m}{%
\begingroup
\RenewCommandCopy\perhapssmash\smash
\cancel{#1}%
\endgroup
\vphantom{#1}%
}
\begin{document}
\begin{align*}
uvw &= abc + \smashcancel{d \ubrace{(e - e)}{0} f} + ghi + jkl \\
&= abc + ghi + jkl \\
uvw &= abc + \smashcancel{d \obrace{(e - e)}{0} f} + ghi + jkl \\
&= abc + ghi + jkl
\end{align*}
\end{document}
始终使用\ubrace
和\obrace
。
答案2
重新建立行的整体高度和深度的代码\vphantom{...}
块不能位于 的参数中\cancel
。
除非您的文档中有大量这样的术语,否则我认为不值得您花时间定义快捷宏。
\documentclass{article}
\usepackage{amsmath,cancel}
\begin{document}
\begin{align*}
uvw &= abc
+ \cancel{d \smash{\underbrace{(e - e)}_{0}} f}\vphantom{\underbrace{(e - e)}_{0}}
+ ghi + jkl\\
&= abc + ghi + jkl
\end{align*}
\end{document}