
На основании ответов наэтот вопрос(о \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 долженнабранныйв формуле необходимо знать:
откуда взять символ, то есть из какого шрифта и из какой позиции внутри этого шрифта;
какой вид синтаксической сущности представляет символ, то есть является ли он переменной, бинарной операцией, отношением и т. д.
TeX нуждается в информации, упомянутой в пункте 2, поскольку от нее зависит расстояние между соседними символами в формуле: например, в формуле
ax+by=0
не должно быть пробелов между переменными «a» и «x» или между «b» и «y», но, наоборот, символы «+» и «=» должны быть отделены от окружающих элементов некоторым количеством пробелов (на самом деле, «=» требует более толстого пробела, чем «+»).
Теперь возникает проблема, как указать всю эту информацию для каждого из возможных входных токенов гибким и перенастраиваемым способом, так, например, чтобы соглашение о том, что «+» является бинарным оператором, а «=» — символом отношения, не было жестко зашито в коде самого TeX. Вы уже можете догадаться, что это совсем не проблема для управляющих последовательностей, таких как
\cup
, \vert
, или \lvert
: в конце концов, управляющие последовательности могут обозначать произвольные «программы», поэтому вы можете легко упаковать в них столько информации, сколько захотите (подробности мы увидим ниже). Но как эта информация указывается для простых символов, таких как «x» или «+» (или «|»)?
Ответ: связывая каждый символ с так называемым «математическим кодом». TeX поддерживает внутренне таблицу, состоящую из 256 записей, каждая из которых может содержать 16-битное целое число (хотя, за одним исключением, фактически используются только 15-битные значения): для каждого входного символа целое число, содержащееся в его связанной записи, определяет необходимую информацию. (Это называется таблицей
\mathcode
и очень похоже на другие таблицы TeX, такие как таблицы \catcode
s, of \sfcode
s, of \uccode
s и т. д., о которых вы, возможно, уже знаете.) Точнее, если мы представим такое целое число в виде строки из четырех шестнадцатеричных цифр
кфпп
скварьируется только между 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 узнает, какой тип атома он должен построить, и это причина предоставления этого. Таким образом, вы можете определить \vert
to expand to \delimiter "026A30C
, и это определение будет работать в любой ситуации.
Наконец-то ответ!
Мы наконец-то в состоянии ответить на заданный вопрос. Рассмотрим следующие примеры входных данных:
|
сам по себе: TeX смотрит на\mathcode
связанный с|
, из которого он узнаетобагде найти соответствующий глиф икакой тип атома построить.\left|
или\right|
: TeXуже знаетчто он должен построить левый (соответственно, правый) разделитель и смотрит на\delcode
of|
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
: упражнение.
Из вышесказанного мы видим, что (принимая во внимание обычные \mathcode
s и определения) \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|
он короче и дает тот же результат.