Использование \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

Хорошо, краткий ответ в комментариях; вотдолгоодин.

Пожалуйста, обрати внимание: Этот ответ применим к оригинальному TeX от Knuth, к 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-битные значения): для каждого входного символа целое число, содержащееся в его связанной записи, определяет необходимую информацию. (Это называется таблицей \mathcodeи очень похоже на другие таблицы TeX, такие как таблицы \catcodes, of \sfcodes, of \uccodes и т. д., о которых вы, возможно, уже знаете.) Точнее, если мы представим такое целое число в виде строки из четырех шестнадцатеричных цифр

кфпп

скварьируется только между 0 и 7, тогда:

  • кдаеткВид набираемого символа: например, 0 = обычный символ, 1 = большой оператор (например,\sum ), 2 = бинарный оператор и т. д. (см.TeXbook, стр. 154, для полного списка);

  • фопределяетфont, через косвенный механизм, который не будет здесь обсуждаться (и в котором NFSS LaTeX2e играет свою роль);

  • стр.указывает напположение внутри этого шрифта.

Подробности того, как это «\mathcode настройки и управления этой таблицей приведены ниже. многоболее сложными в LaTeX2e, чем они были в простом формате TeX, описанном вTeXbook, и даже касаться их здесь нецелесообразно (см. документацию NFSS). Для ответа на наш вопрос, однако, достаточно знать, что TeX имеет «какое-то место», куда можно смотреть, когда ему нужно знать, чтоквид символа, который он собирается набрать. Давайте еще раз подведем итог:

  • TeX просматривает \mathcodeтаблицу только тогда, когда обрабатывает токен символа в математическом режиме (на самом деле, это утверждение следует уточнить, но давайте пропустим подробности TeX);

  • если это так, он ищет соответствующую запись в таблице, содержимое которой определяет, среди прочего, тип синтаксической сущности, которую представляет рассматриваемый символ;

  • атом такого типа в конечном итоге добавляется к текущему математическому списку, возможно, после присоединения к нему надстрочного или подстрочного индекса.


Математические символы и виды атомов

В текстовом режиме вы можете указать символ для набора не только путем включения этого литерального символа во ввод, но и с помощью примитива \char, эквивалентного команде LaTeX \symbol. Например, вместо bubbleвы можете написать в исходном файле , \char98 u\char98 \char98 leи получить точно такой же результат. Конечно, примитив \char на самом деле полезен, когда вам нужно набрать «странный» символ, например «¿».

Аналогичным образом, в математическом режиме, вы можете использовать примитив \mathcharдля указания любого математического символа (или математического символа), который вы хотите. Но есть важное различие между \charи \mathchar: в то время как после того, как \char вы указываете только 8-битное число, которое дает только внутренний код, представляющий предполагаемый символ, после \mathcharожидается 15-битное целое число, которое содержит точно такую ​​же информацию, которую мы нашли бы в\mathcode записи таблицы:кind, шрифтфсемья, и пposition, указанный в точно таком же формате. Так, например,

\matchar"1350

— это (примитивная) команда, действительная только в математическом режиме, которая сообщает TeX о необходимости создания атома Op[erator] (к= 1), содержащий символ, найденный в шрифте номер 3 (ф= 3), что бы это ни значило, в позиции номер 80 (стр. = 50 в шестнадцатеричной системе счисления). В обычной ситуации это оказывается символом ∑.

Конечно, \mathcharкоманды никогда не используются напрямую, а через последовательности управления, которые были определены для работы в качестве эквивалентных команд. Например, в обычной настройке \sumбыло сделано эквивалентным \mathchar"1350, и это объясняет, почему ввод\sum вашего входного файла приводит к тому, что атом Op, содержащий правильный символ, добавляется к текущему списку математики (с возможными нижними/верхними индексами). Здесь следует отметить, что на этот разкинд/фонт/пИнформация о положении не ищется в таблице, как в случае «голых» токенов символов, а поставляется вместе с самой командой, будь то \mathcharпримитивная команда или команда более высокого уровня, например \sum.

Теперь, если всегда предполагать, что общепринятые соглашения остаются в силе, то получается, что,когда используются сами по себе, а не после \leftили \bigили \biggr или…:

  • \vertв конечном итоге эквивалентно\mathchar"026A , поэтому он генерирует атом Ord[inary] (к= 0) содержащий символ, найденный в определенной позиции в определенном шрифте;

  • \lvertв конечном итоге эквивалентно\mathchar"426A , поэтому он генерирует атом Open[ing] (к= 4) содержащий точно такой же символ, как и выше;

  • \lvertв конечном итоге эквивалентно \mathchar"526A, поэтому он генерирует замыкающий атом (к= 5), снова содержащий тот же символ.

Более того, можно видеть, что \mathcodeсвязанный с символом «|» "026Aтоже является, так что простой |во входных данных ведет себя, по крайней мере, когда он используется сам по себе, а не после \rightили \Bigmили \Bigglили…, точно так же, как \vert.

Но это лишь упрощенная версия всей истории: мы дополним картину в следующих двух разделах.


Разделители

Некоторые математические символы, такие как скобки и знаки корня, как ожидается, будут расти с размером подформулы, которую они охватывают, и поэтому требуют специальной обработки. Для них TeX предоставляет концепции «разделителя» и «радикала», из которых только первое имеет здесь значение.

На примитивном уровне (уровень «машинного языка» TeX, так сказать) TeX рассматривает символ как разделитель только в нескольких, четко определенных случаях: после команды \leftили \rightи в связи с некоторыми примитивными командами, которые имеют дело с дробями. Например,( сам по себе набирается как «нормальный» (то есть, не разделитель) символ, согласно правилам, подробно описанным выше, но\left( заставляет TeX рассматривать скобки как «разделитель», то есть как символ, который может расти. Для того чтобы иметь возможность набрать такой растущий символ, TeX требуется больше информации, чем в случае «нормального» символа, поскольку ему нужно знать, где другойразмеры разделителя можно найти. Поэтому вместо того, чтобы искать математический код ( \mathcode) для этого символа, TeX ищет в другой своей внутренней таблице, которая снова содержит запись для каждого из 256 возможных кодов символов: каждая запись содержит так называемый «код разделителя» ( \delcode) связанного символа, который может быть либо отрицательным числом для символов, таких как «x» или «+», которые никогда не должны выступать в качестве разделителей, либо неотрицательным 24-битным числом, то есть последовательностью из шести шестнадцатеричных цифр

fppgqq

которые определяют два варианта рассматриваемого глифа, используя двойную версию соглашения, аналогичного тому, которое используется в\mathcode . Точнее, первые три цифры (fpp) указать шрифтфамили ипположение, в котором находится наименьший размер глифа, и последние три (гкк) аналогичным образом укажите, где можно найти большие размеры (на самом деле,qqуказывают положение внутри шрифта первого более крупного варианта; могут быть доступны еще более крупные варианты, которые можно найти, начиная с первого, с помощью информации, включенной в сам файл метрики шрифта). Особенно важно отметить, что в этом случае информация о синтаксической природе рассматриваемого символанетвключено в его\delcode , потому что этонеттребуется: TeX уже знает эту информацию из команды, которая заставила его искать разделитель ( \left, \rightили другие, которые мы не рассматриваем).

Давайте проиллюстрируем эту концепцию на примере: когда TeX встречает во входных данных символьный токен| сам по себе, он обрабатывает его как «нормальный» символ: он ищет его \mathcode, узнает, что это, скажем, "026A, и из первой цифры \mathcodeон узнает, что символ под рукой должен быть добавлен к текущему математическому списку как (содержимое) атома Ord[inary]; остальные три цифры говорят \mathcode TeX, где найти соответствующий глиф. С другой стороны, когда TeX встречает ввод, скажем, \left|, онуже знает, из \left самой команды следует, что требуется открывающий разделитель, и у него есть только проблема с поиском глифа; для этого, и только для этого, он смотрит на \delcodeпоследующий |, из которого он извлекает необходимую информацию.

Это работает нормально, если разделитель можно указать с помощью символьного токена, как в случае с круглыми скобками ( (, )), квадратными скобками ( [, ]) или вертикальными чертами ( |); но как насчет разделителей, таких как фигурные скобки или двойные вертикальные черты? Они, как вы знаете, указываются с помощью управляющих последовательностей ( \lbrace, \rbrace, \Vertили их синонимов \|). Ну, все эти управляющие последовательности на самом деле являются макросами, которые расширяются до соответствующих вызовов другой примитивной команды, называемой \delimiter, которая является вольным аналогом \mathchar.


Команда\delimiter

За примитивной командой TeX \delimiterдолжно следовать 27-битное целое число без знака, которое можно представить в виде строки из семи шестнадцатеричных цифр.

kfppgqq

скварьируется только от 0 до 7. Эту команду можно использовать во всех местах, где TeX ищет разделитель (то есть после \left, \right, и с некоторыми другими примитивными командами, работающими с дробями), и в этом случае самые правые шесть цифр сообщают TeX, где найти глиф для разделителя, точно так же, как это \delcodeсделал бы a. Теперь,

\left \vert

работает именно так: \vertэто макрос, который расширяется до \delimiter "026A30C, поэтому строка выше расширяется до

\left \delimiter "026A30C

и TeX знает, что ему нужно построить открывающий разделитель (из-за \left ), чей маленький вариант находится в шрифтефamily 2 (TeX знает, какой это шрифт) вппозиция 106, и чей первый более крупный вариант находится в шрифте 3, позиция 12. Вопрос в том: что, черт возьми, это за цифракпредусмотрено?

Ну, мы все знаем, что нам разрешено использовать \vertне только после \left или \right(или и \biglт. д.), но и само по себе, и в этом случае это полностью эквивалентно одиночному |. Это потому, что\delimiter команде разрешено появляться также в местах, где TeXнетищет разделитель; в этом случае последние три шестнадцатеричные цифры полученного числа отбрасываются, и команда ведет себя так, как будто это был \mathchar. Другими словами, когда это происходитнетследовать \leftи т.д.,

\delimiter "kfppgqq

действует точно так же, как

\mathchar "кфпп

На этот раз,это от цифры kчто TeX узнает, какой тип атома он должен построить, и это причина предоставления этого. Таким образом, вы можете определить \vertto expand to \delimiter "026A30C, и это определение будет работать в любой ситуации.


Наконец-то ответ!

Мы наконец-то в состоянии ответить на заданный вопрос. Рассмотрим следующие примеры входных данных:

  • |сам по себе: TeX смотрит на \mathcodeсвязанный с  |, из которого он узнаетобагде найти соответствующий глиф икакой тип атома построить.

  • \left|или \right|: TeXуже знаетчто он должен построить левый (соответственно, правый) разделитель и смотрит на \delcodeof  | just, чтобы узнать, где найти необходимый(е) глиф(ы).

  • \vertсам по себе: это макрос, который расширяется до \delimiter "026A30C; в этом контексте это действует так же, как и \mathchar "026A, и первая цифра числа "026A сообщает TeX, какой тип атома построить (следующие три — где найти глиф, его малый вариант всегда используется в этом случае). Таким образом, Обычный [inary] атом (к = 0) построено здесь.

  • \left\vertили \right\vert: первый из них расширяется до \left \delimiter "026A30C. TeX уже знает, что запрашивается левый разделитель, и поэтомуигнорируетпервую цифру числа "026A30Cи использует оставшиеся цифры, чтобы узнать, где найти нужный(е) глиф(ы). Эффект \right\vertаналогичен.

  • \lvertсам по себе: это макрос, который расширяется до \delimiter "426A30C; в этом контексте это действует так же, как и \mathchar "426A, а первая цифра числа "426A сообщает TeX, какой тип атома построить, который на этот раз является атомом Open[ing] (к = 4); следующие три цифры сообщают TeX, где найти соответствующий глиф, в этом случае всегда используется его уменьшенный вариант.

  • \left\lvertили \right\lvert: первый из них расширяется до \left \delimiter "426A30C. TeX уже знает, что запрашивается левый разделитель, поэтому он игнорирует первую цифру числа "426A30Cи использует оставшиеся шесть только для поиска необходимого глифа(ов). Аналогично для \right\lvert.

  • \rvertсамо по себе: упражнение. (Подсказка: \rvertрасширяется до \delimiter "526A30C;к = 5 означает закрытие атома).

  • \left\rvertили \right\rvert: упражнение.

Из вышесказанного мы видим, что (принимая во внимание обычные \mathcodes и определения) \left|, \left\vert, \left\lvert, и даже \left\rvert — это все одно и то же. И то же самое для \right.


А как насчет \biglродственников?

Управляющие последовательности \big, \bigl, \bigm, \bigr,\Big , и т.д. представляют собой макросы с одним аргументом, каждый из которых создает атом предопределенного вида, содержащий «псевдоразделитель» (то есть, не разделитель в техническом смысле) предопределенного размера; они делают это посредством конструкции \left\right, которая охватывает просто пустой ящик соответствующего размера, который явно заключен в команду \mathord, \mathrel, \mathopen, или \mathclose( \mathordна самом деле не используется, потому что «подразумевается по умолчанию»). Точнее, как вы, конечно, уже знаете:

  • ряд \big, \Big, … порождает Обычные [инарные] атомы;

  • ряд \bigl, \Bigl, … генерирует Open[ing] атомы;

  • ряд \bigm, \Bigm, … генерирует атомы Rel[ation];

  • ряд \bigr, \Bigr, … генерирует замыкающие атомы.

Поэтому здесь аргумент используется только для того, чтобы найти предполагаемый глиф.


Несколько слов о inputenc

Для простоты в приведенном выше описании мы не упомянули тот факт, что \mathcodeпоиск в таблице происходит только для токенов символов, код категории которых равен 11 (буква) или 12 (другое). Помните, что вводПакет делает символы в позициях 128 … 255 активными, и что файлы определения кодировки могут назначать определенное значение некоторым из этих активных символов, когда они используются в математическом режиме. Конечно, замена такого активного символа его значением происходитдо происходят описанные выше процессы. Чтобы привести только один пример, файл latin1.defсодержит, среди прочего, декларацию

\DeclareInputMath{177}{\pm}

так что символ номер 177 всегда будет эквивалентен, при использовании в математическом режиме, управляющей последовательности \pm. Эта замена, конечно, полностью независима от \mathcodeмашины.

решение2

В ответе Густаво много интересных деталей, и его стоит внимательно прочитать. Но основная часть вопроса довольно проста.

После \leftи \middleтолько \rightнекоторые токены являются законными:

  • символ (или макрос, в конечном итоге расширяющийся до одного), имеющий неотрицательное \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

Типичный макрос второго рода определяется в простом TeX как

\def\rangle{\delimiter"526930B }

В LaTeX это написано

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

что является просто шаблонным кодом для выражения по сути того же самого (в более понятной форме).

Тамявляетсяважное отличие: вместо фиксированного указания номеров математической группы (или семейства), как в обычном TeX, LaTeX использует символические имена.

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>является open, ord, closeили rel, в зависимости от того, какой из \bigl, \big, \bigrи \bigm(или друзей) вызывается. В частности, \bigи друзья составляют контекст LMR.

Нет никакой разницы между

\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|он короче и дает тот же результат.

Связанный контент