为什么 \overline 会弄乱间距?

为什么 \overline 会弄乱间距?

考虑$a \triangleright b$$a \overline{\triangleright} b$。它们在间距方面的表现完全不同:

在此处输入图片描述

为什么?我该如何解决?

答案1

该命令\triangleright是所谓的二元运算符。LaTeX 以某种方式处理该二元运算符,即在其前后设置一个小的水平空间。这里发生的事情是,您将此命令包装在某个隐藏此功能的其他命令中。如果您尝试,您可以看到相同的效果$a+b{+}c$

因此,您必须通过将其包装在命令中来再次构造二元运算符\mathbin

 % arara: pdflatex

\documentclass{article}
\newcommand*{\oltriangleright}{\mathbin{\overline\triangleright}}

\begin{document}
$a \triangleright b$ and $a \oltriangleright b$
\end{document}

在此处输入图片描述


这个符号是什么意思?如果你有参考的话,你可能会推荐unicode。

答案2

数学排版中的每个对象都具有以下类之一:0=Ord、1=Op、2=Bin、3=Rel、4=Open、5=Close、6=Punct。此类影响水平空间(自动插入对象之间)。数学排版中的基本对象通常由\mathchardef原始(用于控制序列)或\mathcode(用于本机代码)声明。\mathode和被声明为类 Ord,abtriangularright 被声明为

\mathchardef\triangleright="212E

这意味着 class=2=Bin、family=1、fontcode=2E。目前最重要的是 Bin 类。顺序a\triangleright b是“Ord Bin Ord”,这会影响右侧水平空间。事情更复杂,但基本原理在这里展示。

现在,最重要的是大括号(如{\triangleright})或其他结构(如\overline{\triangleright})在 Ord 类中创建组合对象。因此,Ord Ord Ord在我们的示例中,和之间没有插入空格。但是有类重新类型化原语\mathord\mathop\mathbin\mathrel、和\mathopen,它们会生成给定类的对象。所以\mathclose\mathpunct

a \mathbin{\overline{\triangleright}} b

给出序列“Ord Bin Ord”,这会影响正确的间距。

答案3

\overline您可以使用使用与相同基础结构的修改版本来获得正确的间距\overset

\documentclass{article}
\usepackage{amsmath,amssymb}

\makeatletter
\DeclareRobustCommand{\coverline}[1]{% clever overline
  \binrel@{#1}\binrel@@{\overline{#1}}%
}
\makeatother

\begin{document}

$a\coverline{<}b$

$a<b$

$a\coverline{\triangleright} b$

$a\triangleright b$

\end{document}

该指令\binrel@判断参数是二元运算还是关系符号,并据此设置\binrel@@\mathbin\mathrel;如果无法确定类型,则设置为\mathord

在此处输入图片描述

相关内容