![使用额外的前导 {} 重新定义数学重音的缺点是什么?](https://linux22.com/image/269781/%E4%BD%BF%E7%94%A8%E9%A2%9D%E5%A4%96%E7%9A%84%E5%89%8D%E5%AF%BC%20%7B%7D%20%E9%87%8D%E6%96%B0%E5%AE%9A%E4%B9%89%E6%95%B0%E5%AD%A6%E9%87%8D%E9%9F%B3%E7%9A%84%E7%BC%BA%E7%82%B9%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F.png)
正如我发现的那样无缺陷latex/4253
,TeX 有一个(错误)功能,即它忽略\mathaccent
构造周围的括号:${a_b}_c$
可以工作,但${\tilde a_b}_c$
会因“双下标”错误而失败。括号将{a_b}
其转换为一个原子,它可以接收第二个下标,但括号{\tilde a_b}
不起作用。请参阅关于为什么会发生这种情况的问题了解详情。
由于${{}\tilde a_b}_c$
效果很好(TeX 保留了周围的括号),我想知道定义\tilde
为{}\mathaccent...
而不是\mathaccent...
是否更好。这样的前导括号组会对间距(或其他东西)产生不良影响吗?有没有更好的定义不会导致令人困惑的双上标错误?
编辑:一些评论者怀疑地问我为什么有人会想要这个。我无法想出双下标的好例子,只能想出双上标的好例子: 导数的平方b
是{b'}^2
或b'{}^2
。 那么 导数的平方呢\tilde{b}
?
\tilde{b}{{}'}^2
在这里,使用(标有星号的行)可以得到不错的结果,但我认为输入并不自然。举一个让事情变得更糟的例子,假设\widetilde
表示傅里叶变换,我想对进行傅里叶变换b(t)/t
,然后取其导数的平方。我自然会输入{\widetilde{\biggl[\frac{b}{t}\biggr]}'}^2
。相反,我需要输入\widetilde{\biggl[\frac{b}{r}\biggr]}{\vphantom{\frac{b}{r}}'}^2
或类似的东西......
话虽如此,我最感兴趣的是知道在(和){}
定义的开头添加是否会弄乱数学间距。\tilde
\widetilde
答案1
此修订解决方案满足了能够将结果缩放到不同数学样式大小的要求。为此,scalerel
使用包的功能将当前数学样式导入修订的定义中\tilde
。
而且,与原始解决方案一样,它提供了所需的语法,并且无需在 上预先加载\tilde
,{}
并且可以轻松获取后续的下标和上标。此解决方案的一个关键特性是修订后的定义从原始\tilde
定义开始,并在 的参数上结束\tilde
,因此它应该以预期的方式相对于相邻的数学问题运行。
\documentclass[]{article}%
\usepackage{scalerel}
\let\savetilde\tilde
\def\tilde#1{%
\ThisStyle{\savetilde{\phantom{\SavedStyle#1}}%
\setbox0=\hbox{$\SavedStyle#1$}\kern-\wd0#1}}
\parskip .8ex
\begin{document}
${\tilde a_b}_c$\par
${\tilde{b}'}^2$ No BOOM!\par
$\tilde b'^2$ Natural input\par
$(\tilde{b}')^2$ correct, per tohecz\par
$\scriptstyle{\tilde a_b}_c$\par
$\scriptstyle{\tilde{b}'}^2$ No BOOM!\par
$\scriptstyle\tilde b'^2$ Natural input\par
$\scriptstyle(\tilde{b}')^2$ correct, per tohecz\par
$\scriptscriptstyle{\tilde a_b}_c$\par
$\scriptscriptstyle{\tilde{b}'}^2$ No BOOM!\par
$\scriptscriptstyle\tilde b'^2$ Natural input\par
$\scriptscriptstyle(\tilde{b}')^2$ correct, per tohecz\par
Would otherwise cause tilde errors:\par
${\tilde{a}^b}^c$
${{\tilde{a}}^b}^c$
\end{document}
上述 MWE 中的最后一行由 egreg 给出,作为与\tilde
at中断的示例涉及波浪符号的双上标错误. 它们与当前的重新定义一起工作。
原始解决方案(不能随着较小的数学风格而扩展)它提供了所需的语法;它不需要预先加载\tilde
,{}
并且可以轻松地获取后续的下标和上标。
\documentclass[]{article}%
\usepackage{stackengine}
\stackMath
\let\svtilde\tilde
\def\tilde#1{\stackengine{0pt}{}{\svtilde{\phantom{#1}}}{O}{l}{F}{T}{L}#1%
}
\parskip 1ex
\begin{document}
${\tilde a_b}_c$\par
${\tilde{b}'}^2$ No BOOM!\par
$\tilde b'^2$ Natural input\par
$(\tilde{b}')^2$ correct, per tohecz
\end{document}
这个答案和我之前在解决下标符号间距较小时使用宽条的简单方法