考虑$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,a
而b
triangularright 被声明为
\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
。