\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と はaクラスbOrd として宣言され、 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@@応じて\mathbinまたはを設定します\mathrel。型を判定できない場合は に設定されます\mathord

ここに画像の説明を入力してください

関連情報