Mathaccents、fontdimens、宏,天哪!

Mathaccents、fontdimens、宏,天哪!

这为什么不起作用?

\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软件包以更安全的方式来执行此操作。

相关内容