\big| と \right| と \bigr\rvert と \right\rvert の使用

\big| と \right| と \bigr\rvert と \right\rvert の使用

の回答に基づいてこの質問\bigl、、\bigrなどについて\big)およびこの質問\lvert、、\rvertなど|について)右側を区切るために縦線を使用する場合は\rvert、、\bigr\rvertなど、または\right\rvert(または\mright\rvert)と書くべきだと思います。しかし、いくつかの回答ではこれらが混在しているように感じます。たとえば、抜粋を見てみましょう。

\right|_{#2} % this is the delimiter

からこの答え、または抜粋

\NewDocumentCommand{\evalat}{sO{\big}mm}{%
  \IfBooleanTF{#1}
   {\mleft. #3 \mright|_{#4}}
   {#3#2|_{#4}}%
}

からこの答えここで異なる組み合わせを使用するのが適切なのはなぜでしょうか?

答え1

OK、短い答えはコメントにあります。長い1つ。

ご注意ください: この回答は、KnuthによるオリジナルのTeX、eTeX、pdfTeXに適用されます。他のタイプセッティングエンジンでは、数式モードでの文字入力や数式フォントがどのように管理されているかはわかりません。例えば、XeTeXではさらに、原理的には入力encパッケージは、以下に説明するプロセスに干渉する可能性があります。これについては最後に簡単に説明します。

この主題に関して有用な情報を提供する既存の回答には、次のようなものがあります。


文字トークン、その数学コード、および原子の種類

ご存知のように、TeX が入力ファイルからタイプセットする数式を読み込むとき、入力トークンは「数式モード」で処理されます。これらの入力トークンのほとんどは、「x」、「y」、「+」、「=」などの単純な文字であり、数式の構文単位を表します。たとえば、「x」と「y」は変数、「+」は二項演算、「=」は関係などです。ただし、もちろん、通常のテキストで使用される単純な文字では表せない数学記号も多くあり、そのため制御シーケンスとして入力されます。たとえば、、、、などです\sumが、またはも含ま\intれます。明らかに、は前者のケースに該当し、、、およびは後者のケースに該当します。\cup\cap\langle\rangle|\vert\lvert\rvert

さて、入力方法に関係なく、TeXが入力しなければならない各文字についてタイプセット数式では、次のことを知っておく必要があります。

  1. 文字をどこから取得するか、つまりどのフォントから、そのフォント内のどの位置から取得するか。

  2. 文字がどのような種類の構文エンティティを表すか、つまり、変数、二項演算、関係などであるかどうか。

TeX では、数式内の隣接する文字間のスペースがこの情報に依存するため、2 で説明した情報が必要です。たとえば、数式では ax+by=0、変数「a」と「x」の間、または「b」と「y」の間にスペースを挿入してはなりませんが、逆に、「+」と「=」の記号は周囲の要素からある程度のスペースで分離する必要があります (実際には、「=」は「+」よりも太いスペースを必要とします)。

ここで、このすべての情報を、入力トークンのそれぞれについて、柔軟かつ再構成可能な方法で指定する方法が問題になります。たとえば、「+」は二項演算子、「=」は関係記号であるという規則が、TeX 自体のコードに組み込まれないようにします。、、またはなどの制御シーケンスでは、これがまったく問題にならないことはすでに推測できます。 \cup結局のところ\vert\lvert制御シーケンスは任意の「プログラム」を表すことができるため、その中に必要なだけの情報を簡単に詰め込むことができます (詳細は後述します)。しかし、「x」や「+」(または「|」) などの単純な文字では、この情報はどのように指定されるのでしょうか。

答え: 各文字にいわゆる「数学コード」を関連付ける。TeX は内部的に 256 エントリからなるテーブルを保持しており、各エントリは 16 ビットの整数を保持できます (ただし、1 つの例外を除き、実際に使用されるのは 15 ビットの値のみです)。入力文字ごとに、関連付けられたエントリに含まれる整数が必要な情報を指定します。(これはテーブルと呼ばれ 、 s、s、 s など\mathcodeの他の TeX テーブルと非常によく似ています。これらは既にご存知かもしれません)。より正確には、このような整数を 4 つの 16 進数の文字列として表すと、\catcode\sfcode\uccode

ケーエフピー

0 から 7 の間でのみ変化する場合は、次のようになります。

  • 与えるタイプセットするシンボルのind: たとえば、0 = 通常のシンボル、1 = 大きな演算子 ( など\sum)、2 = 二項演算子など (TeXbook について完全なリストについては、154 ページを参照してください。

  • 指定するont、ここでは説明しない間接的なメカニズムを通じて(LaTeX2e の NFSS がその役割を果たします)。

  • 1人あたりを示しますpそのフォント内の位置。

\mathcodeこの「 」テーブルの設定と管理 方法の詳細については、多くのLaTeX2eでは、TeX形式よりも複雑になっています。TeXbook について、ここでそれらについて触れることさえ不可能です(NFSSのドキュメントを参照してください)。しかし、私たちの質問に答えるためには、TeXが何を知る必要があるかを知る必要があるときに参照する「場所」があることを知っていれば十分です。これからタイプセットするシンボルの ind です。もう一度まとめてみましょう。

  • TeX は、数式モードで文字トークンを処理するときにのみテーブルを参照します\mathcode(実際には、このステートメントは改良する必要がありますが、TeXnicalities については省略します)。

  • そうであれば、テーブル内の対応するエントリを検索します。その内容は、とりわけ、問題の文字が表す構文エンティティの種類を指定します。

  • そのようなアトムは、上付き文字または下付き文字を付加した後、最終的に現在の数式リストに追加されます。


数学記号と原子の種類

テキスト モードでは、入力にその文字そのものを含めるだけでなく、 \charLaTeX の\symbolコマンドに相当する プリミティブを使用して、タイプセットする文字を指定できます。たとえば、 の代わりにbubble、ソース ファイルに と記述する\char98 u\char98 \char98 leと、まったく同じ結果が得られます。もちろん、\char プリミティブは、「¿」のような「奇妙な」文字をタイプセットする必要がある場合に実際に役立ちます。

同様に、数式モードでは、\mathcharプリミティブを使用して任意の数式文字(または数式記号)を指定できます。ただし、とには重要な違いがあります\char\mathcharでは、\char 8ビットの数値のみを指定し、目的の文字を表す内部コードのみを指定しますが、 では、\mathcharテーブルエントリで見つかるものとまったく同じ情報を含む15ビットの整数が期待されます\mathcodeind、フォント親愛なる、そして pまったく同じ形式で指定されます。たとえば、

\matchar"1350

は、数式モードでのみ有効な(プリミティブな)コマンドであり、TeXにOp[erator]アトムを構築するよう指示します(= 1) フォント番号 3 の文字を含む (= 3)、これが何を意味するにせよ、位置番号80(1人あたり = 50 16進数)。通常の設定では、これは∑記号になります。

もちろん、\mathcharコマンドは直接使用されることはなく、同等のコマンドとして動作するように定義された制御シーケンスを介して使用されます。たとえば、慣例的な設定では は\sumと同等になっています \mathchar"1350。これは、入力ファイルに入力すると、正しい記号を含む Op アトムが現在の数式リストに追加される理由を説明しています\sum(下付き/上付き文字も可能)。ここで注目すべき点は、今回はインド/オント/p位置情報は、「裸の」文字トークンの場合のようにテーブルで検索されるのではなく、\mathcharプリミティブコマンドまたは のような高レベルコマンドのいずれであっても、コマンド自体に付属しています\sum

さて、慣習的な慣習が施行されていると仮定すると、単独で使用され、またはまたはまたは…の後では\leftない\big場合 \biggr:

  • \vertは最終的に と等価となり\mathchar"026A、Ord[inary]アトム(= 0) 特定のフォント内の特定の位置にある文字を含む。

  • \lvertは最終的に と等価になる\mathchar"426Aため、Open[ing]アトム(= 4) 上記と全く同じ文字を含む

  • \lvertは最終的に と等価になる\mathchar"526Aため、Clos[ing]アトム(= 5) にも同じ文字が含まれます。

\mathcodeさらに、 「|」文字に関連付けられた も であることがわかります"026A。そのため、|入力内の は、少なくとも\rightまたは\Bigmまたはの後ではなく単独で使用されている場合は\Biggl、 とまったく同じように動作します\vert

しかし、これは全体のストーリーの簡略版にすぎません。次の 2 つのセクションで全体像を説明します。


区切り文字

括弧やルート記号などの一部の数学記号は、それらが囲む部分式のサイズに応じて大きくなることが予想されるため、特別な処理が必要です。これらの記号に対して、TeX は「区切り記号」と「根号」の概念を提供しますが、ここでは最初の記号のみを扱います。

プリミティブレベル(いわばTeXの「機械語」レベル)では、TeXは、 \leftまたは\rightコマンドの後、および分数を扱う特定のプリミティブコマンドと関連した、いくつかの明確に定義された場合にのみ、記号を区切り文字として扱います。たとえば、(は単独では「通常の」 (つまり括弧は、上記のルールに従って、括弧(非区切り文字)として扱われますが、\left(TeXは括弧を「区切り文字」、つまり伸びる文字として扱います。このように伸びる文字をタイプセットするには、TeXは括弧がどこにあるのかを知る必要があるため、「通常の」文字の場合よりも多くの情報を必要とします。 違う区切り文字のサイズは、文字の数式コード ( ) を参照する代わりに\mathcode、TeX は別の内部テーブルを検索します。このテーブルにも、256 個の文字コードに対応するエントリが含まれています。各エントリには、\delcode関連する文字のいわゆる「区切り文字コード」( ) が格納されます。このコードは、区切り文字として機能しない「x」や「+」などの文字の場合は負の数、そうでない場合は 24 ビットの負でない数、つまり 6 桁の 16 進数のシーケンスになります。

翻訳

これは、表で使用されているものと同様の規則を2つ折りにしたバージョンを使用して、問題のグリフの2つの変種を指定します\mathcode。より正確には、最初の3桁(fpp)はフォントを示す家族とpグリフの最小サイズが見つかる位置と最後の3つ(グクク)同様の方法で、より大きなサイズが見つかる場所を指定します(実際には、qqフォント内の最初の大きな変種の位置を示します。さらに大きな変種が存在する可能性があり、フォントメトリックファイル自体に含まれる情報を使用して最初の変種から見つけることができます。この場合、手元のシンボルの構文に関する情報は、ないに含まれている\delcodeため、ない\left必要: TeX は、区切り文字 ( 、\right、または考慮していない他の区切り文字)を探すコマンドからこの情報をすでに認識しています。

この概念を例でさらに説明しましょう。TeXが入力で文字トークンに遭遇すると、| それ自体での場合、TeXはそれを「通常の」記号として扱います。つまり、 を調べて\mathcode、それが であると知り、"026Aの最初の桁から、\mathcodeその文字が現在の数式リストに Ord[inary] アトム(の内容)として追加されるべきであると学習します。 の残りの3桁は、\mathcode TeXに適切なグリフを見つける場所を伝えます。一方、TeXが という入力に遭遇すると\left|すでに知っているコマンド自体から\left 、開始区切り文字が必要であることがわかり、グリフを見つける問題だけが残ります。このためだけに、 \delcode後続の のを調べ|、そこから必要な情報を取得します。

(これは、丸括弧 ( 、))、角括弧 ( [])、または縦棒 ( )の場合のように、区切り文字を文字トークンで指定できる場合は正常に機能します|が、中括弧や二重縦棒などの区切り文字についてはどうでしょうか。ご存知のように、これらは制御シーケンス ( \lbrace\rbrace\Vertまたはその同義語\|) によって指定されます。これらの制御シーケンスはすべて、実際には と呼ばれる別の基本コマンドの適切な呼び出しに展開されるマクロであり\delimiter、 は に大まかに類似しています\mathchar


コマンド\delimiter

基本的なTeXコマンド\delimiterの後には、7桁の16進数文字列として表される27ビットの符号なし整数が続く必要があります。

きゃっきゃっ

0 から 7 の間でのみ変化します。このコマンドは、TeX が区切り文字を探しているすべての場所 (つまり、、、および分数を扱うその他の基本コマンドの後) で使用できます\left\rightこの場合、右端の 6 桁の数字は、a の場合とまったく同じように、区切り文字のグリフがどこにあるかを TeX に伝えます\delcode。さて、

\left \vert

はまさにこのように動作します。\vertは に展開されるマクロなので \delimiter "026A30C、上記の行は に展開されます。

\left \delimiter "026A30C

そしてTeXは、開始区切り文字を構築する必要があることを認識しています(コマンドのため \left)。その小さなバリアントはフォントにありますamily 2 (TeXはこれがどのフォントであるかを知っています)p位置106で、最初の大きな変種はフォント3の位置12にあります。問題は、その数字が一体何なのかということです。提供されますか?

さて、私たちは皆、を または(またはなど)\vertの後だけでなく、 単独でも使用できることを知っています。この場合、 は 単独の と完全に同等です。これは、 コマンドがTeXが\left\right\bigl|\delimiterない区切り文字を探す場合、次の数字の最後の3桁の16進数は省略され、コマンドは の場合と同じように動作します \mathchar。言い換えれば、ないフォロー\leftなど

\delimiter "きゃっきゃっ

まさにその通りです

\mathchar "ケーエフピー

この時、k桁から始まるTeX はどの種類のアトムを構築する必要があるかを学習します。これが、これを提供する理由です。したがって、\vertを に展開するように定義することができ\delimiter "026A30C、この定義はあらゆる状況で機能します。


ついに答えが見つかりました!

ようやく、尋ねられた質問に答えられるようになりました。次の入力サンプルを検討してください。

  • |TeXは に\mathcode関連付けられた を見て|、そこから学習します。両方関連するグリフを見つける場所 そしてどの種類の原子を構築するか。

  • \left|または\right|: TeXすでに知っている左区切り文字 (右区切り文字) を作成する必要があり、 必要なグリフがどこにあるかを知るために を参照\delcodeする だけです。|

  • \vert単独では、これは に展開されるマクロです \delimiter "026A30C。このコンテキストでは、これは であったのと同じように動作し \mathchar "026A、数字の最初の桁は"026A TeX にどの種類のアトムを構築するかを伝えます (次の 3 つ、グリフが見つかる場所、この場合は常にその小さなバリアントが使用されます)。したがって、Ord[inary] アトム ( = 0)がここで構築されます。

  • \left\vertまたは\right\vert:最初のものは に展開されます \left \delimiter "026A30C。TeXは左区切り文字が求められていることをすでに認識しているので、無視するは、数字の最初の桁を取得し"026A30C、残りの桁を使用して、必要なグリフがどこにあるか学習します。 の効果も\right\vert同様です。

  • \lvert単独では、これは に展開されるマクロです \delimiter "426A30C。このコンテキストでは、これは であったのと同じように動作し \mathchar "426A、数値の最初の桁は"426A TeX にどの種類のアトムを構築するかを伝えます。今回は、Open[ing] アトムです ( = 4); 次の 3 つの数字は TeX に適切なグリフがどこにあるかを伝え、この場合は常にその小さいバリアントが使用されます。

  • \left\lvertまたは\right\lvert: 最初のものは に展開されます \left \delimiter "426A30C。TeX は左区切り文字が要求されていることをすでに認識しているため、数値 の最初の桁を無視し"426A30C、残りの 6 桁を使用して必要なグリフを検索します。 の場合も同様です\right\lvert

  • \rvert単独では: 運動。(ヒント:\rvertに展開されます \delimiter "526A30C; = 5は原子を閉じることを意味します。

  • \left\rvertまたは\right\rvert:運動する。

上記から、(慣例の\mathcodeおよび の定義を前提とすると)\left|\left\vert\left\lvert、 は\left\rvert すべてまったく同じものであることがわかります。 についても同様です\right


\bigl親戚はどうですか?

制御シーケンス、、、、、\bigなどは、1つの引数を持つマクロであり、それぞれが「疑似区切り文字」(\bigl\bigm\bigr\Bigつまり\left(テキスト的な意味での区切り文字ではありません)を所定のサイズで囲みます。これは、適切なサイズの空のボックスだけを含む…構造によって行われ、これは、、、、 またはコマンド\rightによって明示的に囲まれます(は「デフォルトで暗黙的」であるため、実際には使用されません)。より正確には、すでにご存知のとおり、次のようになります。\mathord\mathrel\mathopen\mathclose\mathord

  • \big、、 …系列\Bigは通常の原子を生成する。

  • \bigl、、 …シリーズ\BiglはOpen[ing]原子を生成します。

  • \bigm、、 …シリーズ\BigmはRel[ation]アトムを生成します。

  • \bigr、、 …シリーズ\BigrはClos[ing]原子を生成します。

したがって、ここでは、引数は目的のグリフを見つけるためだけに使用されます。


inputencについて

簡単にするために、上記の説明では、テーブル\mathcode検索はカテゴリコードが11(文字)または12(その他)の文字トークンに対してのみ行われるという事実については触れませんでした。 入力encパッケージは128~255の位置の文字をアクティブにし、エンコーディング定義ファイルは数式モードで使用するときにこれらのアクティブ文字の一部に特定の意味を割り当てることができます。もちろん、そのようなアクティブ文字の意味の置き換えは前に 上記のプロセスが実行されます。一例として、ファイルには、latin1.def他の多くの宣言とともに、次のような宣言が含まれています。

\DeclareInputMath{177}{\pm}

そのため、文字番号 177 は、数式モードで使用される場合、常に制御シーケンスと同等になります\pm。この置換は、もちろん、\mathcodeメカニズムから完全に独立しています。

答え2

Gustavo の回答には興味深い詳細が多数含まれており、注意深く読む価値があります。しかし、大部分は非常に簡単です。

以降では、\left一部のトークンのみが有効になります。\middle\right

  • 非負の を持つ文字 (または最終的に 1 つに展開されるマクロ) \delcode
  • \delimiter最終的な展開が で始まり、その後に 27 ビットの数値が続くマクロ。

TeX は、 、 、 をスキャンした後に拡張を実行して\left、負でない\middleまたはを\right持つ必要な文字を検索することに注意してください(これにより、数値を探すための拡張がトリガーされます)。\delcode\delimiter

標準のTeX/LaTeXに限定すると( を使用したXeTeX/LuaTeXとは対照的にunicode-math)、非負の値を持つ文字\delcode

( "028300
) "029301
. 0
/ "02F30E
< "26830A
> "26930B
[ "05B302
\ "26E30F
] "05D303
| "26A30C

2番目の種類の典型的なマクロは、プレーンTeXでは次のように定義されます。

\def\rangle{\delimiter"526930B }

LaTeXではこう書かれています

\DeclareMathDelimiter{\rangle}{\mathclose}{symbols}{"69}{largesymbols}{"0B}

これは、本質的に同じことを(より明確な形で)述べるための単なる定型コードです。

そこには重要な違い: プレーンな TeX のように数学グループ (またはファミリ) 番号をハードワイヤリングする代わりに、LaTeX ではシンボリック名を使用します。

A\delcodeは24ビットの数値です。コードとの違いは\delimiter、コードの左端の3ビットが、、または(以下LMR)のコンテキストで使用されていない場合に、シンボルの型を指定することです。したがって\delimiter、たとえば、は\left\middle\right\rangle近い間隔に関するアトム (通常の場合は最初の 16 進数字は 5、\mathcloseLaTeX の場合は 5)。

逆に、LMRで使用される場合、TeXはすでに型を知っているので、これらの3ビットは無視されます(開けるオードまたは近い、それぞれ割り当てるビットです。右端の 24 ビットの意味は、実際には重要ではありません。

\bigl、、はどのようにし\big\bigr兄弟と一緒にゲームに参加するのでしょうか? これらは実際に\leftは変装していますが、それぞれ\mathopen、、という型割り当てコマンドに埋め込まれています。また\mathord\mathclose\bigm関係原子も同様に:

\math<X>{\left<token><box>\right.\kern-\nulldelimiterspace}

が完了します。ここで、はおよび の友達に<token>続くもので、は適切なサイズのボックス(、、および を区別するため)であり、 は、、、および(または友達)のどれが呼び出されるかに応じて、、、または になります。特に、 および の友達は LMR コンテキストを構成します。\big<box>\big\Big\bigg\Bigg<X>openordcloserel\bigl\big\bigr\bigm\big

両者の間には何ら違いはない

\big| \big\lvert \big\rvert

または

\bigl| \bigl\lvert \bigl\rvert

同様に、、\left|および\left\lvert\left\rvertまったく同じです。これは|、、\lvertおよび がすべて同じ文字を指しているためです (技術的には、またはコード\rvertの最下位 24 ビットは同じです)。\delcode\delimiter


コードでは、>と が\rangleそれぞれ と の最下位24ビットを共有していることに気づいたかもしれません。とについても同じことが起こります。これにより、\delcode\delimiter<\langle

\left<
\bigl<
\Bigl<

(または ですが\big<、これは間違いです) の代わりに を使用します。\langleについても同様に使用します\rangle

|(または同義語\vert)、および の区別は\lvert\rvertそれらが LMR コンテキストに表示されない場合にのみ重要です。

このことが最もよくわかる例は

\log|-2|
\log\lvert-2\rvert

正しいのは後者です。前者の場合は

ログ<thinmuskip>| <medmuskip>- <medmuskip>2|

後者は正しい

ログ|-2|


結論:\bigl\lvertより快適に感じる場合は使用してください。ただし、\bigl|短くて同じ結果になります。

関連情報