当放置重音符号时,TeX 引擎会对单个字符进行特殊处理;请参阅 TeXbook,第 443 页的第 12 条规则。另请参阅这个问题及其接受的答案以了解详细信息。因此,对于像包提供的那些假重音accents
,找出给定的数学列表是否由单个字符组成会很有用。单个字符的示例:a
、\alpha
、\mathcal{A}
。相反,ab
和a{}
不是a\hspace{0pt}
单个字符。
因此我的问题是:如何找出给定的数学列表是否由单个字符组成?
答案1
重音符号放置中对单个字符的特殊处理之一是对下标和上标的处理。摘自 TeXbook,第 443 页,规则 12:
如果核心是单个字符,则替换框
x
[包含花柱的核心C'
]通过一个包含原子核以及 Acc 原子的上标和下标的盒子,样式为C
,并使 Acc 原子的下标/上标为空;...
粗略地说,效果是\hat{a}^H
,在 中,H
是“附加”到 的a
,而在 中,\hat{\kern0pt a}^H
它“附加”到\hat{\kern0pt a}
,因此位置要高得多。下面是\ifsingle
基于这个想法的命令(带有真分支和假分支)。首先是输出:
\documentclass{article}
\newcommand*\ifsingle[3]{%
\setbox0\hbox{$\mathaccent"0362{#1}^H$}%
\setbox2\hbox{$\mathaccent"0362{\kern0pt#1}^H$}%
\ifdim\ht0=\ht2 #3\else #2\fi
}
\newcommand*\test[1]{$#1$ is\ifsingle{#1}{}{ not} a single character\par}
\newcommand*\stupida{\string a}
\newcommand*\awithbraces{a{}}
\begin{document}
\test{a}
\test{\alpha}
\test{\mathcal{A}}
\test{ab}
\test{a_1}
\test{\hat{a}}
\test{\stupida}
\test{\awithbraces}
\end{document}
正如 egreg 在评论中指出的那样,\ifsingle
不会将 、 和 识别[
为\sum
单个,
字符+
。(而且我修改了代码,因此=
也不会被识别为单个字符。)但是,我认为这没什么大不了的:在 中\hat{=}
, 也\hat
看不到单个字符,因为{=}
不是单个字符。只有在 中\hat=
, 才会\hat
看到单个字符=
。请参阅Frank Mittelbach 的这个回答太棒了了解详情。