这为什么不起作用?
\def\circacc{%
\dimen0=\fontdimen5\textfont2
\fontdimen5\textfont2=-.5ex
\mathaccent\circ
\fontdimen5\textfont2=\dimen0
}$\circacc a$\bye
最后一行产生错误(! Missing { inserted.
),但为什么它工作正常就在两行之前?!
如果将宏更改为包括一个参数,我可以使它起作用,但是在\fontdimen
口音是排版之前,最后一个变化会应用!
恐怕我现在在Tex Wizard -Lands上,我迷路了。
更新:问题的第一部分对我来说很清楚。
\def\circacc#1{
\dimen0=\fontdimen5\textfont2 \dimen1=\fontdimen5\scriptfont2 \dimen2=\fontdimen5\scriptscriptfont2
{\fontdimen5\textfont2=-.25ex \fontdimen5\scriptfont2=-.25ex \fontdimen5\scriptscriptfont2=-.25ex
\mathaccent\circ{#1}}
\fontdimen5\textfont2=\dimen0 \fontdimen5\scriptfont2=\dimen1 \fontdimen5\scriptscriptfont2=\dimen2
}$\circacc W$\bye
(产生与原始 x 高度相同的重音)
答案1
在 \accent 和要加重音的字符之间可以插入赋值,但在 \mathaccent 和要加重音的原子之间不能插入。由于 TeX 需要数学字符或子公式,但不是\fontdimen
字符,因此它会尝试插入括号。
第一个想法是\circacc
用论点定义,并在以排版重音符号之后进行重新分配:
\def\circacc#1{%
\dimen0=\fontdimen5\textfont2
\fontdimen5\textfont2=-.5ex
\mathaccent\circ{#1}
\fontdimen5\textfont2=\dimen0
}
不幸的是,这两个任务都没有做任何事情,因为Tex完成了数学列表时,将数学列表转换为水平列表,因此当IS\fontdimen
再次添加一个组时。和将数学列表转换为水平列表:
\def\circacc#1{%
\dimen0=\fontdimen5\textfont2
\hbox{$\fontdimen5\textfont2=-.5ex
\mathaccent\circ{#1}$}
\fontdimen5\textfont2=\dimen0
}
重新分配\fontdimen5
必须重做,因为对A的分配\fontdimen
本质上是全球的(它们是<字体分配>,TeXbook 第 277 页)。
当然,例如,这不起作用$a_{\circacc{W}}$
,因此我不建议这种方法:Accents软件包以更安全的方式来执行此操作。