使用 \big|和\右|與 \bigr\rvert 和 \right\rvert 相對

使用 \big|和\右|與 \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

好的,簡短的答案在評論中;這裡是一。

請注意: 這個答案適用於 Knuth 的原始 TeX、eTeX 和 pdfTeX。我不知道數學模式下的字元輸入和數學字體在其他排版引擎中是如何管理的,例如,在 XeTeX 中。此外,原則上輸入法包可能會幹擾下面描述的過程,最後對此進行了簡要討論。

提供有關該主題的有用資訊的現有答案包括:


字符標記、它們的數學代碼和原子種類

如您所知,當 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 位元整數(儘管,除了一個例外,實際上只使用15 位元值):對於每個輸入字符,其關聯條目中包含的整數指定必要的資訊。 (這稱為 表,與其他 TeX 表非常相似,例如s、of s、of s 等\mathcode表,您可能已經知道了。)更準確地說,如果我們將這樣一個整數表示為字串四個十六進制數字\catcode\sfcode\uccode

克夫普

k僅在 0 到 7 之間變化,則:

  • k給出k正在排版的符號的索引:例如,0 = 普通符號,1 = 大運算子(例如\sum),2 = 二元運算符,依此類推(請參閱教材,p。 154,完整列表);

  • F指定Font,透過這裡不會討論的間接機制(其中 LaTeX2e 的 NFSS 發揮了作用);

  • PP表示p該字體內的位置。

詳細內容如何“\mathcode該「 」表如何設定和管理的 很多LaTeX2e 中的格式比 所述的純 TeX 格式更複雜教材,甚至在這裡觸及它們也是不可行的(請參閱 NFSS 文件)。然而,為了回答我們的問題,只要知道 TeX 在需要了解什麼內容時有「某個地方」可以查看就足夠了。k即將排版的符號的索引。讓我們再回顧一下:

  • \mathcodeTeX僅在數學模式下處理字元標記時才查看該表(實際上,該語句應該改進,但讓我們忽略 TeXnicalities);

  • 如果是,它會在表中尋找相應的條目,該條目的內容除其他外還指定了所討論的字元所代表的語法實體的類型;

  • 這種原子最終會被附加到目前的數學清單中,可能是在附加上標或下標之後。


數學特徵和原子種類

在文字模式下,您不僅可以透過在輸入中包含該文字字符來指定要排版的字符,還可以透過原 \char語的方式來指定,相當於LaTeX的\symbol命令。例如,bubble您可以在來源文件中編寫 ,\char98 u\char98 \char98 le並獲得完全相同的結果。當然,\char 當您需要排版像“¿”這樣的“奇怪”字元時,原語實際上很有用。

以類似的方式,在數學模式下,您可以使用\mathchar基元指定所需的任何數學字元(或數學符號)。但是\char和之間有一個重要的區別\mathchar:在\char 您只指定一個 8 位數字之後,它只給出了表示預期字元的內部代碼,而在\mathchar需要一個15 位整數之後,它包含與我們想要的完全相同的資訊找到在一個\mathcode:akind,一種字體F艾米麗和一個 p位置,以完全相同的格式指定。所以,舉例來說,

\matchar"1350

是一個(原始)命令,僅在數學模式下有效,它告訴 TeX 構造一個 Op[erator] 原子(k= 1) 包含在字體編號 3 中找到的字元 (F= 3),無論這意味著什麼,在位置號 80 (PP = 50 十六進位)。在通常的設定中,這就是 Σ 符號。

當然,\mathchar命令永遠不會直接使用,而是透過已定義為等效命令的控制序列使用。例如,在習慣設定中\sum已等同於 \mathchar"1350,這解釋了為什麼鍵入\sum在輸入檔案中鍵入會導致包含正確符號的 Op 原子被附加到當前數學清單(帶有可能的子/上標)。這裡要注意的一點是,這次k工業/F安省/p位置資訊不像「裸」字元標記那樣在表中查找,而是隨命令本身一起提供,無論是\mathchar原始命令還是高級命令,例如\sum.

現在,總是假設習慣公約有效,事實證明,當單獨使用時而不是在\left\big或 之後\biggror…之後:

  • \vert最終等於\mathchar"026A,因此它產生一個 Ord[inary] 原子 (k= 0) 包含在某種字體的某個位置找到的字元;

  • \lvert最終等於\mathchar"426A,因此它產生一個 Open[ing] 原子 (k= 4) 包含與上面完全相同的字元;

  • \lvert最終等價於\mathchar"526A,因此它生成一個 Clos[ing] 原子 (k= 5) 再次包含相同的字元。

而且,我們可以看到\mathcode與“|”相關的字元"026A也是如此,因此|輸入中的 simple 的行為,至少當它單獨使用時,而不是在\rightor \Bigmor \Bigglor ... 之後,與 完全相同\vert

但這只是整個故事的簡化版本:我們將在接下來的兩節中完成整個畫面。


分隔符

一些數學符號(例如括號和根號)預計會隨著它們所包含的子公式的大小而增長,因此需要特殊處理。對於這些,TeX 提供了「定界符」和「根式」的概念,這裡只關注第一個。

在原始層級(可以說是 TeX 的「機器語言」層級),TeX 僅在少數定義明確的情況下將符號視為分隔符號:在 \leftor\right命令之後,以及與處理分數的某些原始命令相關。例如,(它本身被排版為“正常”(IE,非分隔符號)字符,根據上面詳細的規則,但是\left(會導致 TeX 將括號視為“分隔符”,即視為可以增長的字符。為了能夠排版這樣一個不斷增長的字符,TeX 需要比“正常”字符更多的信息,因為它需要知道 不同的可以找到分隔符號的大小。因此,TeX 不是查看\mathcode該字元的數學代碼 ( ),而是搜尋其另一個內部表,該表同樣包含 256 個可能的字元代碼中每一個的條目:每個條目保存所謂的「分隔符號代碼」( \delcode)關聯字符的數量,可以是負數(對於字符,如“x”或“+”,永遠不能充當分隔符),也可以是非負 24 位數字,即六個十六進制的序列數字

飛豬QQ

指定所討論字形的兩種變體,使用類似於中使用的約定的雙重版本\mathcode。更準確地說,前三位數字 (法普) 表示字體F艾米麗和p可以找到最小尺寸的字形的位置,最後三個(QQ)以類似的方式指定可以找到較大尺寸的位置(實際上,QQ指示第一個較大變體在字體內的位置;也可以使用更大的變體,可以透過字體度量文件本身中包含的資訊從第一個變體開始找到這些變體)。特別重要的是要注意,在這種情況下,有關當前符號的句法性質的資訊是不是包含在其\delcode,因為它是不是需要:TeX 已經從導致它查找分隔符號的命令中知道了此資訊(\left\right或我們不考慮的其他分隔符號)。

讓我們用一個例子進一步說明這個概念:當 TeX 在輸入中遇到字元標記時| 透過它自己,它把它當作一個“正常”符號:它查找它的\mathcode,發現它是,比方說,"026A,並且從它的第一個數字中\mathcode得知手頭的字符應該附加到當前的數學列表中( )一個普通[inary]原子的內容;其他三位數字告訴\mathcode TeX 在哪裡可以找到合適的字形。另一方面,當 TeX 遇到輸入時,例如\left|,它已經知道,從\left 指令本身來看,需要一個開始分隔符,而且它只存在找到字形的問題;為此,也正是為此,它查看 \delcode隨後的|,從中檢索必要的資訊。

如果可以透過字元標記指定分隔符,則此方法效果很好,如圓括號 ( (, ))、方括號 ( [, ]) 或豎線 ( |) 的情況;但是像花括號或雙豎線這樣的分隔符號呢?如您所知,這些是透過控制序列(\lbrace\rbrace或其\Vert同義詞\|)指定的。好吧,所有這些控制序列實際上都是宏,它們擴展為另一個名為 的原始命令的適當調用\delimiter,該命令與\mathchar.


\delimiter命令

原始 TeX 指令\delimiter後面必須跟著 27 位元無符號整數,可以表示為七個十六進位數字的字串

kfppgq

k僅在 0 到 7 之間\left變化 \right。在哪裡可以找到分隔符號的字形,其方式與a 完全相同\delcode。現在,

\left \vert

正是這樣運作的:\vert是一個擴展為 的宏 \delimiter "026A30C,因此上面的行擴展為

\left \delimiter "026A30C

TeX 知道它必須建構一個開始分隔符號(因為 \left),其小變體可以在 font 中找到Family 2(TeX 知道這是什麼字體)位於p位置 106,其第一個較大的變體出現在字體 3,位置 12 中。k為...提供?

\vert好吧,我們都知道,我們不僅可以在\left or \right(或等)之後使用,\bigl還可以單獨使用,在這種情況下,它完全相當於一個單獨的|。這是因為\delimiter 命令也被允許出現在 TeX 存在的地方不是尋找分隔符號;在這種情況下,隨後的數字的最後三個十六進制數字將被刪除,並且該命令的行為就像以前的命令一樣 \mathchar.換句話說,當它發生時不是遵循\left

\delimiter "kfppgq

行為完全一樣

\mathchar "克夫普

這次,它來自 k 位數TeX 知道它必須構造哪種原子,這就是提供它的原因。因此,您可以定義\vert擴展為\delimiter "026A30C,並且該定義適用於每種情況。


答案,終於!

我們終於能夠回答所提出的問題了。考慮以下輸入範例:

  • |本身:TeX 看\mathcode與 相關的 |,從中學習兩個都在哪裡可以找到相關的字形 構造哪種原子。

  • \left|\right|:TeX已經知道它必須構造一個左(或右)分隔符,並查看 of\delcode只是 | 為了了解在哪裡可以找到必要的字形。

  • \vert就其本身而言:這是一個擴展為的巨集 \delimiter "026A30C;在這種情況下,這就像以前一樣 \mathchar "026A,並且數字的第一位數字"026A 告訴TeX要構造哪種原子(以下三個,在哪裡可以找到字形,在這種情況下總是使用它的小變體)。所以,一個 Ord[inary] 原子 (k = 0) 在此構造。

  • \left\vert\right\vert:其中第一個擴展為 \left \delimiter "026A30C. TeX 已經知道需要左分隔符,因此忽略數字的第一位數字"026A30C,並使用剩餘的數字來了解在哪裡可以找到它需要的字形。的效果\right\vert類似。

  • \lvert就其本身而言:這是一個擴展為的巨集 \delimiter "426A30C;在這種情況下,這就像以前一樣 \mathchar "426A,並且數字的第一位數字"426A 告訴 TeX 要構造哪種原子,這次是一個 Open[ing] 原子(k = 4);接下來的三位數字告訴 TeX 在哪裡可以找到合適的字形,在這種情況下總是使用它的小變體。

  • \left\lvert\right\lvert:其中第一個擴展為 \left \delimiter "426A30C. TeX 已經知道需要左分隔符,因此它忽略數字的第一個數字"426A30C,並使用剩餘的六位來定位必要的字形。同樣對於\right\lvert.

  • \rvert就其本身而言:鍛鍊。 (提示:\rvert擴展為 \delimiter "526A30Ck = 5 表示 Clos[ing] 原子)。

  • \left\rvert\right\rvert:運動。

從上面我們看到(假設習慣的\mathcodes 和定義)\left|\left\vert\left\lvert、 甚至\left\rvert 都是完全相同的東西。對於 也一樣\right


\bigl和親戚呢?

控制序列\big, \bigl, \bigm, \bigr,\Big等是帶有一個參數的宏,每個參數都製造一個包含「偽分隔符號」的預定類型的原子(IE,不是技術意義上的分隔符號)的預定大小;他們透過\left...\right結構來實現這一點,該結構僅包含一個適當大小的空框,該空框由\mathord\mathrel\mathopen\mathclose命令顯式包裝(\mathord實際上並未使用,因為它是「預設隱含的」) 。更準確地說,正如您肯定已經知道的那樣:

  • , \big, \Big… 系列生成 Ord[inary] 原子;

  • \bigl, , …系列\Bigl生成 Open[ing] 原子;

  • \bigm, , …系列\Bigm生成 Rel[ation] 原子;

  • \bigr, , …系列\Bigr生成 Clos[ing] 原子。

因此,這裡的參數僅用於定位預期的字形​​。


關於輸入法的一句話

為了簡單起見,在上面的描述中我們沒有提到\mathcode表格查找僅針對類別代碼為 11(字母)或 12(其他)的字元標記進行。請記住, 輸入法包使位置 128 … 255 中的字元處於活動狀態,並且在數學模式下使用時,編碼定義檔可以為其中一些活動字元分配特定含義。當然,這種活躍的字元會被替換為它的意義。 發生上述過程。僅舉一個例子,該文件latin1.def除許多其他內容外還包含聲明

\DeclareInputMath{177}{\pm}

因此,當在數學模式中使用時,字符號 177 將始終等於控制序列\pm。當然,這種替代完全獨立於\mathcode機器之外。

答案2

古斯塔沃的回答中有很多有趣的細節,值得仔細閱讀。但大部分問題都很簡單。

之後\left\middle只有\right一些令牌是合法的:

  • 具有非負數的字元(或最終擴展為 1 的巨集)\delcode
  • 一個宏,其最終擴展以\delimiter27 位數開始。

請注意,TeX 在掃描\left, \middleor後執行擴展\right,以便找到具有非負\delcodeor的所需字元\delimiter(這反過來會觸發擴展以查找數字)。

限制於標準 TeX/LaTeX(與 XeTeX/LuaTeX 相對unicode-math),唯一具有非負數的字元\delcode

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

典型的第二類巨集在 plain TeX 中定義為

\def\rangle{\delimiter"526930B }

在 LaTeX 中這樣寫

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

這只是樣板程式碼,用於表達本質上相同的事情(以更清晰的方式)。

那裡一個重要的區別是:LaTeX 使用符號名稱,而不是像普通 TeX 那樣硬連線數學組(或系列)數字。

A\delcode是24位數字;與代碼的區別\delimiter在於,代碼中最左邊的三位\delimiter指定符號的類型,以防它不在\left,\middle或 的上下文中使用\right(下文稱為 LMR)。因此,例如,\rangle建構一個關閉原子關於間距(普通的第一個十六進位數字 5,\mathclose在 LaTeX 中)。

相反,當在 LMR 中使用時,這三位被忽略,因為 TeX 已經知道類型 (打開,奧德或者關閉,分別)來分配。最右邊的 24 位的意思並不真正相關。

如何\bigl和兄弟姊妹一起\big進入\bigr遊戲?它們實際上是\left經過偽裝的,但分別隱藏在類型分配命令中\mathopen\mathord\mathclose。還有\bigm一個建構相對值原子以同樣的方式:

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

完成後,其中<token>\big和 朋友,<box>是一個適當大小的框(用於區分\big\Big\bigg\Bigg,並且<X>openord或,取決於調用、、和(或朋友)中close的哪一個。特別是和朋友構成LMR語境。rel\bigl\big\bigr\bigm\big

之間沒有任何區別

\big| \big\lvert \big\rvert

或之間

\bigl| \bigl\lvert \bigl\rvert

類似地,\left|\left\lvert\left\rvert完全相同,因為|\lvert\rvert都指向相同的字元(從技術上講,\delcode\delimiter代碼中的最低有效 24 位元是相同的)。


您可能已經注意到,>和分別在程式碼中\rangle共享最低有效 24 位元;和也會發生同樣的情況。這讓人可以說\delcode\delimiter<\langle

\left<
\bigl<
\Bigl<

(甚至\big<,但這是錯誤的)而不是使用\langle;同樣對於\rangle.

只有當它們不出現在 LMR 上下文中時,和|(或同義詞\vert)之間的區別才有意義。\lvert\rvert

可以看到這一點的最簡單的例子是

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

正確的是後者;前者會導致

日誌<thinmuskip>| <medmuskip>- <medmuskip>2|

而後者給了正確的

日誌|-2|


結論:\bigl\lvert如果您感覺更舒服,但\bigl|時間更短並且達到相同的效果,請使用。

相關內容