这个答案提供以下降低重音的代码\widetilde
:
\makeatletter
\newcommand*\wt[1]{\mathpalette\wthelper{#1}}
\newcommand*\wthelper[2]{%
\hbox{\dimen@\accentfontxheight#1%
\accentfontxheight#11.3\dimen@
$\m@th#1\widetilde{#2}$%
\accentfontxheight#1\dimen@
}%
}
\newcommand*\accentfontxheight[1]{%
\fontdimen5\ifx#1\displaystyle
\textfont
\else\ifx#1\textstyle
\textfont
\else\ifx#1\scriptstyle
\scriptfont
\else
\scriptscriptfont
\fi\fi\fi3
}
\makeatother
有人能解释一下这段代码是如何工作的吗?特别是,我想知道:
- 答案是,代码将重音的“x 高度”缩放 1.3。重音的 x 高度到底是什么?我熟悉字体 x 高度的概念,但我不明白为什么缩放 x 高度会降低重音。
- 上述代码中的各种命令(例如,
\mathpalette
,\dimen@
,\fontdimen
)有什么作用?这些命令应该做什么?\m@th
\accentfontxheight
- 为什么代码对小写字母没有任何效果?答案提供了解释,但我不明白为什么它对大写字母有效,但对小写字母无效。
- 有没有办法修改代码,以降低小写字母的重音?
答案1
- 字体的“x 高度”是指
1ex
该字体的大小。TeX 利用这一点在数学中设置方框和重音之间的空间。它还有更多内容,但重音放在方框顶部,它们之间的空间减少了,其中min(1ex, h)
是1ex
相对于重音字体的,h
是方框的高度(减少因为重音符号正好位于大写字母的高度上方)。
因此,如果你这样做\widetilde{W}
,例如,由于的高度W
大于,1ex
你会得到类似\vbox{ \hbox{<horizontally skewed widetilde accent>} \kern-1ex \hbox{W} }
因此,如果增加1ex
,则会减少重音和字符之间的间距。
-
\fontdimen
是一个 TeX 基元,用于加载字体的某些维度寄存器。它的用法是\fontdimen<number><font>
,在本例中\fontdimen5<font>
给出的大小。在本例中,我们想要的字体是或等等,具体取决于1ex
上下文,因为这些被定义为重音字体。这是宏的目的,如果你给它上下文(,等等 --- 当前数学样式),它会在该上下文中给你。<font>
\textfont3
\scriptfont3
\accentfontxheight
\displaystyle
\textstyle
\fontdimen3
\dimen@
\dimen0
是 TeX 中第 dimen寄存器的简写0
。它在这里用作临时寄存器,用于存储 的原始值,\fontdimen
以便在 之后重置\wt
。执行\dimen@<dimen>
会将 设置\dimen0
为<dimen>
,并将<dimen register>\dimen@
设置<dimen register>
为 中存储的值\dimen0
。\mathpalette\<macro>{<param>}
根据上下文调用\<macro>\displaystyle{<param>}
、或等,这允许您创建一个根据当前数学样式执行不同操作的宏。\<macro>\textstyle{<param>}
\<macro>
\m@th
是 的简写。TeX在数学开启和数学关闭项周围\mathsurround=0pt
添加长度的字距。\mathsurround
之所以对小写字母没有影响,是因为
h<=1ex
在这种情况下,所以min(h, 1ex)=h
,因此增加1ex
不会影响这个最小值。一种方法是检查被强调的盒子的高度是否小于
1ex
,如果是,则将强调的内容放入更高的盒子中(升高被强调的材料),强调它,然后将其放低,使其恢复到原始高度。这只是一个想法,可能不是最好的。
所有关于此的信息都可以在 TeXbook 中找到。附录 G 包含有关 TeX 如何从公式生成框的信息,第 443 页的第 12 步包含有关数学重音的相关信息。