如何确定数学列表是否由单个字符组成?

如何确定数学列表是否由单个字符组成?

当放置重音符号时,TeX 引擎会对单个字符进行特殊处理;请参阅 TeXbook,第 443 页的第 12 条规则。另请参阅这个问题及其接受的答案以了解详细信息。因此,对于像包提供的那些假重音accents,找出给定的数学列表是否由单个字符组成会很有用。单个字符的示例:a\alpha\mathcal{A}。相反,aba{}不是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 的这个回答太棒了了解详情。

相关内容