Usando \big| e \certo| versus bigr rvert e right rvert

Usando \big| e \certo| versus bigr rvert e right rvert

Com base nas respostasessa questão(sobre \bigl, \bigr, \big, etc.) eessa questão(sobre \lvert,,, etc.), eu pensaria que sempre que alguém usasse uma barra vertical para delimitar à direita, deveria escrever \rvert,, etc. , ou (ou ). No entanto, sinto que estou vendo isso misturado e combinado em algumas respostas. Tomemos por exemplo o trecho|\rvert\bigr\rvert\right\rvert\mright\rvert

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

deesta resposta, ou o trecho

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

deesta resposta. Por que é apropriado usar as diferentes combinações aqui?

Responder1

OK, a resposta curta está nos comentários; aqui está omuuuitoum.

Observe: Esta resposta se aplica ao TeX original de Knuth, ao eTeX e ao pdfTeX. Não sei como a entrada de caracteres no modo matemático e as fontes matemáticas são gerenciadas em outros mecanismos de composição,por exemplo, em XeTeX. Além disso, em princípio oentradapacote poderia interferir nos processos descritos abaixo, e isso é brevemente discutido no final.

As respostas já existentes que fornecem informações úteis sobre este assunto são, entre outras:


Tokens de caracteres, seus códigos matemáticos e tipos de átomo

Como você sabe, quando o TeX está lendo do arquivo de entrada uma fórmula para ser composta, os tokens de entrada são processados ​​no “modo matemático”. A maioria desses tokens de entrada serão caracteres simples como “x”, “y”, “+”, “=” e assim por diante, representando unidades sintáticas da fórmula: por exemplo, “x” e “y” são variáveis, “+” é uma operação binária, “=” é uma relação, etc. É claro que também existem muitos símbolos matemáticos que não podem ser representados pelos caracteres simples usados ​​em texto comum e, portanto, são inseridos como sequências de controle: por exemplo, \sum, \int, \cup, \cap, etc,, mas também \langleou \rangle. Obviamente, |cai no primeiro caso, enquanto \vert, \lverte \rvertno segundo.

Agora, independentemente do método usado para inseri-lo, para cada caractere que o TeX deveformatadoem uma fórmula, ele precisa saber:

  1. de onde retirar o caractere, ou seja, de qual fonte e de qual posição dentro dessa fonte;

  2. que tipo de entidade sintática o caractere representa, ou seja, se é uma variável, uma operação binária, uma relação e assim por diante.

O TeX precisa da informação mencionada em 2 porque o espaçamento entre caracteres adjacentes em uma fórmula depende disso: por exemplo, na fórmula ax+by=0, nenhum espaço deve ser inserido entre as variáveis ​​“a” e “x”, ou entre “b” e “ y”, mas, pelo contrário, os símbolos “+” e “=” devem ser separados dos elementos circundantes por uma certa quantidade de espaço (na verdade, “=” requer um espaço mais espesso que “+”).

Agora surge o problema de como especificar toda esta informação, para cada um dos possíveis tokens de entrada, de forma flexível e reconfigurável, de modo que, por exemplo, a convenção de que “+” é um operador binário e “=” uma relação O símbolo não está embutido no código do próprio TeX. Você já pode adivinhar que isso não é um problema para sequências de controle como \cup, \vert, ou \lvert: afinal, sequências de controle podem significar “programas” arbitrários, então você pode facilmente empacotar quantas informações quiser dentro delas (vamos veja os detalhes abaixo). Mas como essa informação é especificada para caracteres simples como “x” ou “+” (ou “|”)?

Resposta: associando a cada caractere um chamado “código matemático”. O TeX mantém internamente uma tabela que consiste em 256 entradas, cada uma das quais pode conter um inteiro de 16 bits (embora, com uma exceção, apenas valores de 15 bits sejam realmente usados): para cada caractere de entrada, o inteiro contido em sua entrada associada especifica as informações necessárias. (Isso é chamado de \mathcodetabela e é muito semelhante a outras tabelas TeX, como as tabelas de \catcodes, de \sfcodes, de \uccodes, etc., que você já deve conhecer.) Mais precisamente, se representarmos esse número inteiro como uma string de quatro dígitos hexadecimais

kfpp

comkvariando apenas entre 0 e 7, então:

  • kdá okind do símbolo sendo composto: por exemplo, 0 = símbolo comum, 1 = operador grande (como \sum), 2 = operador binário e assim por diante (consulteO TeXbook, pág. 154, para a lista completa);

  • fespecifica ofont, através de um mecanismo indireto que não será discutido aqui (e no qual o NFSS do LaTeX2e desempenha o seu papel);

  • pp.indica opposição dentro dessa fonte.

Os detalhes de como esta “ \mathcodetabela” é configurada e gerenciada são muitomais complicados no LaTeX2e do que no formato TeX simples descrito noO TeXbook, e até mesmo tocá-los aqui é inviável (veja a documentação do NFSS). Para responder à nossa pergunta, entretanto, é suficiente saber que o TeX tem “algum lugar” para procurar quando precisa saber o quektipo de símbolo que está prestes a ser escrito. Vamos recapitular mais uma vez:

  • O TeX olha para a \mathcodetabela apenas quando está processando um token de caractere no modo matemático (na verdade, esta declaração deve ser refinada, mas deixemos de lado os TeXnicalities);

  • em caso afirmativo, procura a entrada correspondente na tabela, cujo conteúdo especifica, entre outras coisas, o tipo de entidade sintática que o caracter em questão representa;

  • um átomo desse tipo é eventualmente anexado à lista matemática atual, possivelmente após anexar um sobrescrito ou subscrito a ela.


Caracteres matemáticos e tipos de átomo

No modo texto, você pode especificar um caractere a ser digitado não apenas incluindo esse caractere literal na entrada, mas também por meio do \charprimitivo, equivalente ao comando do LaTeX \symbol. Por exemplo, em vez de bubblevocê pode escrever, em seu arquivo de origem, \char98 u\char98 \char98 lee obter exatamente o mesmo resultado. Claro, o \char primitivo é realmente útil quando você precisa compor um caractere “estranho” como “¿”.

De maneira semelhante, no modo matemático, você pode usar o \mathcharprimitivo para especificar qualquer caractere matemático (ou símbolo matemático) desejado. Mas há uma diferença importante entre \chare \mathchar: enquanto depois de \char especificar apenas um número de 8 bits, que fornece apenas o código interno que representa o caracter pretendido, depois de \mathcharespecificar um número inteiro de 15 bits, que contém exatamente a mesma informação que teríamos encontrar em uma \mathcodeentrada de tabela: akind, uma fonteffamília, e um pposição, especificada exatamente no mesmo formato. Então, por exemplo,

\matchar"1350

é um comando (primitivo), válido apenas no modo matemático, que diz ao TeX para construir um átomo Op[erator] (k= 1) contendo o caractere encontrado na fonte número 3 (f= 3), seja lá o que isso signifique, na posição número 80 (pp. = 50 hexadecimais). Na configuração normal, este é o símbolo ∑.

É claro que \mathcharos comandos nunca são usados ​​diretamente, mas através de sequências de controle que foram definidas para atuar como comandos equivalentes. Por exemplo, na configuração habitual \sumfoi equivalente a \mathchar"1350, e isso explica por que digitar \sumseu arquivo de entrada faz com que um átomo Op contendo o símbolo correto seja anexado à lista matemática atual (com possíveis sub/sobrescritos). O ponto a ser observado aqui é que desta vez okind/font/pas informações de posição não são consultadas em uma tabela, como no caso de tokens de caracteres “básicos”, mas vêm com o próprio comando, seja um \mathcharcomando primitivo ou de nível superior como \sum.

Ora, sempre assumindo que as convenções consuetudinárias estão em vigor, verifica-se que,quando usados ​​sozinhos e não depois \leftou \bigou \biggrou…:

  • \verté eventualmente equivalente a \mathchar"026A, então gera um átomo Ord[inário] (k= 0) contendo um caractere encontrado em uma determinada posição em uma determinada fonte;

  • \lverté eventualmente equivalente a \mathchar"426A, então gera um átomo Open[ing] (k= 4) contendo exatamente o mesmo caractere acima;

  • \lverté eventualmente equivalente a \mathchar"526A, então gera um átomo Clos[ing] (k= 5) contendo novamente o mesmo caractere.

Além disso, pode-se ver que o \mathcodeassociado ao “|” caractere "026Atambém é, para que um simples |na entrada se comporte, pelo menos quando é usado sozinho e não depois \rightou \Bigmou \Bigglou…, exatamente como \vert.

Mas esta é apenas uma versão simplificada de toda a história: completaremos o quadro nas próximas duas seções.


Delimitadores

Espera-se que alguns símbolos matemáticos, como parênteses e sinais de raiz, cresçam com o tamanho da subfórmula que abrangem e, portanto, requerem um tratamento especial. Para estes, o TeX fornece os conceitos de “delimitador” e de “radical”, dos quais apenas o primeiro é de interesse aqui.

No nível primitivo (nível de “linguagem de máquina” do TeX, por assim dizer), o TeX trata um símbolo como um delimitador apenas em alguns casos bem definidos: após um comando \leftou \righte em conexão com certos comandos primitivos que lidam com frações . Por exemplo, (por si só é escrito como “normal” (ou seja, não delimitador), conforme regras detalhadas acima, mas \left(faz com que o TeX trate o parêntese como um “delimitador”, ou seja, como um caractere que pode crescer. Para poder compor um personagem tão crescente, o TeX precisa de mais informações do que no caso de um personagem “normal”, porque precisa saber onde o diferentetamanhos do delimitador podem ser encontrados. Então, em vez de olhar para o código matemático ( \mathcode) daquele caractere, o TeX pesquisa outra de suas tabelas internas, que novamente contém uma entrada para cada um dos 256 códigos de caracteres possíveis: cada entrada contém o chamado “código delimitador” ( \delcode) do caractere associado, que pode ser um número negativo, para caracteres como “x” ou “+”, que nunca devem atuar como delimitadores, ou um número não negativo de 24 bits, ou seja, uma sequência de seis caracteres hexadecimais dígitos

fppgqq

que especificam duas variantes do glifo em questão, usando uma versão dupla de uma convenção semelhante à usada na \mathcodetabela. Mais precisamente, os três primeiros dígitos (fpp) indique a fontefamilia e opposição onde o menor tamanho do glifo pode ser encontrado, e os três últimos (gqq) especifique de maneira semelhante onde os tamanhos maiores podem ser encontrados (na verdade,qqindicar a posição dentro da fonte da primeira variante maior; poderiam estar disponíveis variantes ainda maiores, que podem ser encontradas a partir da primeira por meio de informações incluídas no próprio arquivo de métricas de fontes). É particularmente importante notar que, neste caso, a informação sobre a natureza sintática do símbolo em questão énãoincluído em seu \delcode, porque énãonecessário: o TeX já conhece esta informação do comando que o fez procurar por um delimitador ( \left, \right, ou outros que não estamos considerando).

Vamos ilustrar ainda mais esse conceito com um exemplo: Quando o TeX encontra, na entrada, o token do caractere| por si próprio, ele o trata como um símbolo “normal”: ele procura seu \mathcode, descobre que é, digamos "026A, e a partir do primeiro dígito do \mathcodeele aprende que o caractere em questão deve ser anexado à lista matemática atual como (o conteúdo de) um átomo comum; os outros três dígitos \mathcode informam ao TeX onde encontrar o glifo apropriado. Por outro lado, quando o TeX encontra a entrada, digamos, \left|, elejá sabe, a partir do \left próprio comando, que é necessário um delimitador de abertura, e só tem o problema de encontrar o glifo; para isso, e só por isso, olha para \delcodeo seguinte |, do qual recupera as informações necessárias.

Isso funciona bem se o delimitador puder ser especificado por meio de um token de caractere, como é o caso de parênteses redondos ( (, )), colchetes ( [, ]) ou barras verticais ( |); mas e os delimitadores como chaves ou barras verticais duplas? Estes, como você sabe, são especificados por meio de sequências de controle ( \lbrace, \rbrace, \Vertou seu sinônimo \|). Bem, todas essas sequências de controle são na verdade macros que se expandem para invocações apropriadas de outro comando primitivo chamado \delimiter, que é vagamente análogo a \mathchar.


O \delimitercomando

O comando TeX primitivo \delimiterdeve ser seguido por um inteiro sem sinal de 27 bits, que pode ser representado como uma sequência de sete dígitos hexadecimais

kfppgqq

comkvariando apenas entre 0 e 7. Este comando pode ser usado em todos os lugares onde o TeX está procurando por um delimitador (isto é, depois de \left, \right, e com alguns outros comandos primitivos que lidam com frações), e neste caso os seis dígitos mais à direita informam ao TeX onde encontrar o glifo para o delimitador exatamente da mesma maneira que a \delcodefaria. Agora,

\left \vert

funciona precisamente desta maneira: \verté uma macro que se expande para \delimiter "026A30C, então a linha acima se expande para

\left \delimiter "026A30C

e o TeX sabe que precisa construir um delimitador de abertura (por causa do \leftcomando) cuja pequena variante é encontrada em fontfamily 2 (TeX sabe qual fonte é essa) empposição 106, e cuja primeira variante maior se encontra na fonte 3, posição 12. A questão é: que diabos é o dígitokoferecida por?

Bem, todos nós sabemos que podemos usar \vertnão apenas after \left ou \right(ou \bigl, etc.), mas também por si só, e neste caso é completamente equivalente a um lone |. Isso ocorre porque o \delimiter comando também pode aparecer em locais onde o TeX énãoprocurando um delimitador; neste caso, os últimos três dígitos hexadecimais do número seguinte são eliminados e o comando se comporta como se fosse um \mathchar. Em outras palavras, quando isso acontecenãoseguir \left, etc.,

\delimiter "kfppgqq

age exatamente como

\mathchar "kfpp

Desta vez,é do dígito kque o TeX aprende que tipo de átomo deve construir, e esta é a razão para fornecê-lo. Assim, você pode definir \verta expansão para \delimiter "026A30C, e essa definição funcionará em todas as situações.


A resposta, finalmente!

Estamos finalmente em condições de responder à pergunta que foi colocada. Considere os seguintes exemplos de entrada:

  • |por si só: o TeX analisa o \mathcodeassociado  |, com o qual aprendeambosonde encontrar o glifo relevante eque tipo de átomo construir.

  • \left|ou \right|: TeXjá sabeque ele tem que construir um delimitador esquerdo (ou direito), e olha para \delcodeapenas  | para aprender onde encontrar o(s) glifo(s) necessário(s).

  • \vertpor si só: esta é uma macro que se expande para \delimiter "026A30C; neste contexto, isso funciona como antes \mathchar "026A, e o primeiro dígito do número "026A informa ao TeX que tipo de átomo construir (os três seguintes, onde encontrar o glifo, sendo sua variante pequena sempre usada neste caso). Então, um átomo comum [inário] (k = 0) é construído aqui.

  • \left\vertou \right\vert: o primeiro deles se expande para \left \delimiter "026A30C. O TeX já sabe que um delimitador esquerdo está sendo solicitado e, portanto,ignorao primeiro dígito do número "026A30Ce usa os dígitos restantes para saber onde encontrar o(s) glifo(s) necessário(s). O efeito de \right\verté análogo.

  • \lvertpor si só: esta é uma macro que se expande para \delimiter "426A30C; neste contexto, isso funciona como antes \mathchar "426A, e o primeiro dígito do número "426A informa ao TeX que tipo de átomo construir, que, desta vez, é um átomo Open[ing] (k = 4); os três dígitos seguintes informam ao TeX onde encontrar o glifo apropriado, sendo sua variante pequena sempre usada neste caso.

  • \left\lvertou \right\lvert: o primeiro deles se expande para \left \delimiter "426A30C. O TeX já sabe que um delimitador esquerdo está sendo solicitado, então ele ignora o primeiro dígito do número "426A30Ce usa os seis restantes apenas para localizar o(s) glifo(s) necessário(s). Da mesma forma para \right\lvert.

  • \rvertpor si só: exercício. (Dica: \rvertexpande para \delimiter "526A30C;k = 5 significa Clos[ing] átomo).

  • \left\rvertou \right\rvert: exercício.

Pelo exposto, vemos que (assumindo os \mathcodes e definições habituais) \left|, \left\vert, \left\lvert, e até \left\rvert são exatamente a mesma coisa. E o mesmo para \right.


E parentes \bigl?

As sequências de controle \big, \bigl, \bigm, \bigr, \Bigetc. são macros com um argumento, cada um dos quais fabrica um átomo de um tipo predeterminado que contém um “pseudo-delimitador” (ou seja, não um delimitador no sentido téXnico) de tamanho predeterminado; eles fazem isso por meio de uma construção \left\rightque abrange apenas uma caixa vazia do tamanho apropriado, que é explicitamente envolvida por um comando , , ou ( \mathordna \mathrelverdade \mathopennão é usado, porque está “implícito por padrão”). Mais precisamente, como você certamente já sabe:\mathclose\mathord

  • a série \big, \Big,… gera átomos comuns [inários];

  • a série \bigl, \Bigl,… gera átomos Open[ing];

  • a série \bigm, \Bigm,… gera átomos Rel[ation];

  • a série \bigr, \Bigr,… gera átomos Clos[ing].

Aqui, portanto, o argumento é usado apenas para localizar o glifo pretendido.


Uma palavra sobre inputenc

Para simplificar, na descrição acima não mencionamos o fato de que a \mathcodeconsulta à tabela ocorre apenas para tokens de caracteres cujo código de categoria é 11 (letra) ou 12 (outro). Lembre-se que o entradaO pacote torna os caracteres nas posições 128… 255 ativos, e que os arquivos de definição de codificação podem atribuir um significado particular a alguns desses caracteres ativos, quando usados ​​no modo matemático. É claro que a substituição de tal personagem ativo pelo seu significado aconteceantes os processos descritos acima ocorrem. Para dar apenas um exemplo, o arquivo latin1.defcontém, entre muitas outras, a declaração

\DeclareInputMath{177}{\pm}

portanto, o caractere número 177 será sempre equivalente, quando usado no modo matemático, à sequência de controle \pm. Esta substituição é, evidentemente, completamente independente da \mathcodemaquinaria.

Responder2

A resposta do Gustavo contém muitos detalhes interessantes e vale a pena uma leitura cuidadosa. Mas a maior parte da questão é bastante fácil.

Depois \left, \middlee \rightapenas alguns tokens são legais:

  • um caractere (ou uma macro, em última análise, expandindo para um) tendo não-negativo \delcode;
  • uma macro cuja expansão final começa com \delimiterseguido por um número de 27 bits.

Observe que o TeX realiza a expansão após ter escaneado \left, \middleou \right, para encontrar o caractere necessário com \delcodeou não negativo \delimiter(que por sua vez acionará a expansão para procurar um número).

Restringindo ao TeX/LaTeX padrão (em oposição a XeTeX/LuaTeX com unicode-math), os únicos caracteres que não são negativos \delcodesão

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

Uma macro típica do segundo tipo é definida em TeX simples por

\def\rangle{\delimiter"526930B }

Em LaTeX isso está escrito

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

que é apenas um código padrão para dizer essencialmente a mesma coisa (de uma forma mais clara).

éuma diferença importante: em vez de conectar os números do grupo matemático (ou família) como no TeX simples, o LaTeX usa nomes simbólicos.

A \delcodeé um número de 24 bits; a diferença com um \delimitercódigo é que os três bits mais à esquerda de um \delimitercódigo especificam o tipo do símbolo, caso não seja usado no contexto de \left, \middleou \right(doravante LMR). Então, por exemplo, \rangleconstrói umFecharátomo no que diz respeito ao espaçamento (primeiro dígito hexadecimal 5 em planície, \mathcloseem LaTeX).

Ao contrário, quando usados ​​no LMR, esses três bits são ignorados, pois o TeX já conhece o tipo (Abrir,OrdemouFechar, respectivamente) para atribuir. O que significam os 24 bits mais à direita não é realmente relevante.

Como fazer \bigle \bigentrar \bigrno jogo junto com seus irmãos? Na verdade, eles estão \leftdisfarçados, mas enterrados em um comando de atribuição de tipo, respectivamente \mathopen, \mathorde \mathclose. Há também \bigmque constrói umRelátomo da mesma maneira:

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

está feito, onde está <token>o seguinte \bige amigos, <box>é uma caixa de tamanho apropriado (para distinguir entre ,,, \bige ) , e é ,,, ou , dependendo de qual entre ,,, e (ou amigos) é chamado. Em particular , e amigos constituem o contexto LMR.\Big\bigg\Bigg<X>openordcloserel\bigl\big\bigr\bigm\big

Não há diferença alguma entre

\big| \big\lvert \big\rvert

ou entre

\bigl| \bigl\lvert \bigl\rvert

Da mesma forma, \left|e \left\lvertsão \left\rvertexatamente iguais, porque e |todos apontam para o mesmo caractere (tecnicamente, os 24 bits menos significativos no código ou são iguais).\lvert\rvert\delcode\delimiter


Você deve ter notado isso >e \ranglecompartilha os 24 bits menos significativos respectivamente no \delcodee no \delimitercódigo; o mesmo acontece para <e \langle. Isto permite dizer

\left<
\bigl<
\Bigl<

(ou até \big<, mas seria errado) em vez de usar \langle; da mesma forma para \rangle.

A distinção entre |(ou o sinônimo \vert) \lverte \rverté significativa apenas quando eles não aparecem em um contexto LMR.

O exemplo mais simples onde isso pode ser visto está em

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

O correto é o último; o primeiro resultaria em

registro <thinmuskip>| <medmuskip>- <medmuskip>2|

enquanto o último dá a correta

log|-2|


Concluindo: use \bigl\lvertse você se sentir mais confortável, mas \bigl|é mais curto e dá no mesmo.

informação relacionada