
考慮$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
(對於本機程式碼)聲明。 of\mathode
和被宣告為 Ord 類a
,b
triangleright 被宣告為
\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@@
為mean\mathbin
或\mathrel
;如果無法確定類型,則將其設為\mathord
。