Usando \grande| y \derecha| versus \bigr\rvert y \right\rvert

Usando \grande| y \derecha| versus \bigr\rvert y \right\rvert

Basado en las respuestas aesta pregunta(sobre \bigl, \bigr, \big, etc.) yesta pregunta(sobre \lvert,,, etc.), pensaría que cada vez que uno usara una barra vertical para delimitar a la derecha debería escribir ,, etc., o (o ) \rvert. Sin embargo, siento que los veo mezclados y combinados en algunas respuestas. Tomemos por ejemplo el extracto|\rvert\bigr\rvert\right\rvert\mright\rvert

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

deesta respuesta, o el extracto

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

deesta respuesta. ¿Por qué es apropiado utilizar aquí las diferentes combinaciones?

Respuesta1

Bien, la respuesta corta está en los comentarios; aquí está elmuuuuchouno.

Tenga en cuenta: Esta respuesta se aplica al TeX original de Knuth, a eTeX y a pdfTeX. No sé cómo se gestionan la entrada de caracteres en el modo matemático y las fuentes matemáticas en otros motores de composición tipográfica,p.ej, en XeTeX. Además, en principio laentradacEl paquete podría interferir en los procesos que se describen a continuación, y esto se analiza brevemente al final.

Las respuestas ya existentes que brindan información útil sobre este tema son, entre otras:


Fichas de personajes, sus códigos matemáticos y tipos de átomos.

Como sabe, cuando TeX lee del archivo de entrada una fórmula para componer, los tokens de entrada se procesan en "modo matemático". La mayoría de estos tokens de entrada serán caracteres simples como "x", "y", "+", "=", etc., que representan unidades sintácticas de la fórmula: por ejemplo, "x" e "y" son variables, “+” es una operación binaria, “=" es una relación, etcétera. Por supuesto, también hay muchos símbolos matemáticos que no pueden representarse mediante los caracteres simples utilizados en el texto normal y, por lo tanto, se introducen como secuencias de control: por ejemplo, \sum, \int, \cup, \cap, etc, pero también \langleo \rangle. Evidentemente, |entra dentro del primer caso, mientras que \vert, \lvert, y \rvertdentro del segundo.

Ahora, independientemente del método utilizado para ingresarlo, para cada carácter que TeX debecomponeren una fórmula, necesita saber:

  1. de dónde tomar el carácter, es decir, de qué fuente y desde qué posición dentro de esa fuente;

  2. qué tipo de entidad sintáctica representa el carácter, es decir, si es una variable, una operación binaria, una relación, etc.

TeX necesita la información mencionada en 2 porque el espacio entre caracteres adyacentes en una fórmula depende de ello: por ejemplo, en la fórmula ax+by=0, no se debe insertar ningún espacio entre las variables “a” y “x”, o entre “b” y “ y”, pero, por el contrario, los símbolos “+” y “=" deben estar separados de los elementos circundantes por una cierta cantidad de espacio (en realidad, "=" requiere un espacio más grueso que "+").

Ahora, surge el problema de cómo especificar toda esta información, para cada uno de los posibles tokens de entrada, de forma flexible y reconfigurable, de modo que, por ejemplo, se cumpla la convención de que “+” es un operador binario y “=" una relación El símbolo no está cableado en el código de TeX. Ya puedes adivinar que esto no es un problema en absoluto para secuencias de control como \cup, \vert, o \lvert: después de todo, las secuencias de control pueden representar “programas” arbitrarios, por lo que puedes empaquetar fácilmente tanta información como quieras dentro de ellas (veremos ver los detalles a continuación). Pero, ¿cómo se especifica esta información para caracteres simples como “x” o “+” (o “|”)?

Respuesta: asociando a cada carácter un llamado “código matemático”. TeX mantiene internamente una tabla que consta de 256 entradas, cada una de las cuales puede contener un número entero de 16 bits (aunque, con una excepción, en realidad sólo se utilizan valores de 15 bits): para cada carácter de entrada, el número entero contenido en su entrada asociada especifica la información necesaria. (Esto se llama \mathcodetabla y es muy similar a otras tablas TeX, como las tablas de \catcodes, de \sfcodes, de \uccodes, etc., que quizás ya conozcas). Más precisamente, si representamos un número entero como una cadena de cuatro dígitos hexadecimales

kfpp

conkvariando solo entre 0 y 7, entonces:

  • kda elktipo del símbolo que se va a componer: por ejemplo, 0 = símbolo ordinario, 1 = operador grande (como \sum), 2 = operador binario, etc.El libro de texto, pag. 154, para la lista completa);

  • Fespecifica elFont, a través de un mecanismo indirecto que no se discutirá aquí (y en el que el NFSS de LaTeX2e juega su papel);

  • páginasindica elpagPosición dentro de esa fuente.

Los detalles de cómo \mathcodese configura y administra esta tabla " " son muchomás complicados en LaTeX2e que en el formato TeX simple descrito en elEl libro de texto, e incluso tocarlos aquí es inviable (consulte la documentación de NFSS). Sin embargo, para responder a nuestra pregunta, basta saber que TeX tiene “algún lugar” donde mirar cuando necesita saber quéktipo de símbolo que está a punto de componer. Recapitulemos una vez más:

  • TeX mira la \mathcodetabla sólo cuando está procesando un token de carácter en modo matemático (en realidad, esta declaración debería refinarse, pero pasemos por alto las TeXnicalidades);

  • en caso afirmativo, busca la entrada correspondiente en la tabla, cuyo contenido especifica, entre otras cosas, el tipo de entidad sintáctica que representa el carácter en cuestión;

  • un átomo de ese tipo finalmente se agrega a la lista matemática actual, posiblemente después de adjuntarle un superíndice o un subíndice.


Caracteres matemáticos y tipos de átomo.

En modo texto, puede especificar un carácter a componer no sólo incluyendo ese carácter literal en la entrada, sino también mediante la \charprimitiva, equivalente al comando de LaTeX \symbol. Por ejemplo, en lugar de bubblehacerlo, podría escribir en su archivo fuente \char98 u\char98 \char98 ley obtener exactamente el mismo resultado. Por supuesto, la \char primitiva es realmente útil cuando necesitas escribir un carácter “extraño” como “¿”.

De manera similar, en el modo matemático, puede usar la \mathcharprimitiva para especificar cualquier carácter matemático (o símbolo matemático) que desee. Pero hay una diferencia importante entre \chary \mathchar: mientras que después de \char especificar solo un número de 8 bits, que proporciona solo el código interno que representa el carácter deseado, después \mathcharse espera un número entero de 15 bits, que contiene exactamente la misma información que encontrar en una \mathcodeentrada de tabla: akind, una fuenteFfamilia y un pagposición, especificada exactamente en el mismo formato. Así, por ejemplo,

\matchar"1350

es un comando (primitivo), válido sólo en modo matemático, que le dice a TeX que construya un átomo Operador (k= 1) que contiene el carácter que se encuentra en la fuente número 3 (F= 3), sea lo que sea que esto signifique, en la posición número 80 (páginas = 50 hexadecimales). En el entorno habitual, resulta ser el símbolo ∑.

Por supuesto, \mathcharlos comandos nunca se utilizan directamente, sino a través de secuencias de control que se han definido para actuar como comandos equivalentes. Por ejemplo, en la configuración habitual \sumse ha hecho equivalente a \mathchar"1350, y esto explica por qué escribir \sumen su archivo de entrada hace que se agregue un átomo Op que contiene el símbolo correcto a la lista matemática actual (con posibles subíndices/superíndices). Lo que hay que tener en cuenta aquí es que esta vez elkIndiana/Fen/pagLa información de posición no se busca en una tabla, como en el caso de las fichas de personajes "simples", sino que viene con el comando en sí, ya sea un \mathcharcomando primitivo o de nivel superior como \sum.

Ahora bien, suponiendo siempre que estén vigentes las convenciones consuetudinarias, resulta que,cuando se usan solos y no después de \lefto \bigo \biggro…:

  • \verteventualmente es equivalente a \mathchar"026A, por lo que genera un átomo ordinario [inario] (k= 0) que contiene un carácter encontrado en una determinada posición en una determinada fuente;

  • \lvertes eventualmente equivalente a \mathchar"426A, por lo que genera un átomo Open[ing] (k= 4) que contiene exactamente el mismo carácter que el anterior;

  • \lverteventualmente es equivalente a \mathchar"526A, por lo que genera un átomo de cierre (k= 5) que contiene nuevamente el mismo carácter.

Además, se puede ver que el \mathcodeasociado con el “|” El carácter "026Atambién lo es, de modo que un simple |en la entrada se comporta, al menos cuando se usa solo y no después \rightde o \Bigmo \Bigglo…, exactamente como \vert.

Pero ésta es sólo una versión simplificada de toda la historia: completaremos el cuadro en las dos secciones siguientes.


Delimitadores

Se espera que algunos símbolos matemáticos, como paréntesis y signos de raíz, crezcan con el tamaño de la subfórmula que abarcan y, por lo tanto, requieren un tratamiento especial. Para estos, TeX proporciona los conceptos de “delimitador” y de “radical”, de los cuales aquí sólo nos interesa el primero.

En el nivel primitivo (el nivel de “lenguaje de máquina” de TeX, por así decirlo), TeX trata un símbolo como un delimitador sólo en unos pocos casos bien definidos: después de un comando \lefto \right, y en conexión con ciertos comandos primitivos que tratan con fracciones. . Por ejemplo, (por sí solo se compone como “normal” (es decir, no delimitador), de acuerdo con las reglas detalladas anteriormente, pero \left(hace que TeX trate el paréntesis como un "delimitador", es decir, como un carácter que puede crecer. Para poder componer un carácter tan creciente, TeX necesita más información que en el caso de un carácter "normal", porque necesita saber dónde está el carácter. diferenteSe pueden encontrar los tamaños del delimitador. Entonces, en lugar de mirar el código matemático ( \mathcode) de ese carácter, TeX busca en otra de sus tablas internas, que nuevamente contiene una entrada para cada uno de los 256 códigos de caracteres posibles: cada entrada contiene el llamado “código delimitador” ( \delcode) del carácter asociado, que puede ser un número negativo, para caracteres como “x” o “+”, que nunca deben actuar como delimitadores, o un número no negativo de 24 bits, es decir, una secuencia de seis caracteres hexadecimales. dígitos

fppgqq

que especifican dos variantes del glifo en cuestión, utilizando una versión doble de una convención similar a la utilizada en la \mathcodetabla. Más precisamente, los primeros tres dígitos (fpp) indicar la fuenteFfamilia y elpagposición donde se puede encontrar el tamaño más pequeño del glifo, y los últimos tres (gqq) especifican de manera similar dónde se pueden encontrar los tamaños más grandes (en realidad,qqindicar la posición dentro de la fuente de la primera variante más grande; podrían estar disponibles variantes aún mayores, que se pueden encontrar a partir de la primera mediante información incluida en el propio archivo de métricas de fuentes). Es particularmente importante señalar que, en este caso, la información sobre la naturaleza sintáctica del símbolo en cuestión esnoincluido en su \delcode, porque esnonecesario: TeX ya conoce esta información del comando que hizo que buscara un delimitador ( \left, \rightu otros que no estamos considerando).

Ilustremos aún más este concepto con un ejemplo: cuando TeX encuentra, en la entrada, el token de carácter| por sí mismo, lo trata como un símbolo "normal": busca su \mathcode, descubre que es, digamos "026A, y del primer dígito \mathcodeaprende que el carácter en cuestión debe agregarse a la lista matemática actual como (el contenido de) un átomo [inario] ordinario; los otros tres dígitos le \mathcode indican a TeX dónde encontrar el glifo apropiado. Por otro lado, cuando TeX encuentra la entrada, digamos, \left|,ya sabe, desde el \left propio comando, que se requiere un delimitador de apertura, y solo tiene el problema de encontrar el glifo; para esto, y solo para esto, mira el \delcodesiguiente |, del cual recupera la información necesaria.

Esto funciona bien si el delimitador se puede especificar mediante un token de carácter, como es el caso de los paréntesis ( (, )), corchetes ( [, ]) o barras verticales ( |); pero ¿qué pasa con los delimitadores como llaves o barras verticales dobles? Estas, como sabes, se especifican mediante secuencias de control ( \lbrace, \rbrace, \Verto su sinónimo \|). Bueno, todas estas secuencias de control son en realidad macros que se expanden a invocaciones apropiadas de otro comando primitivo llamado \delimiter, que es vagamente análogo a \mathchar.


El \delimitercomando

El comando TeX primitivo \delimiterdebe ir seguido de un entero sin signo de 27 bits, que puede representarse como una cadena de siete dígitos hexadecimales.

kfppgqq

conkvariando solo entre 0 y 7. Este comando se puede usar en todos los lugares donde TeX busca un delimitador (es decir, después de \left, \righty con algunos otros comandos primitivos que tratan con fracciones), y en este caso los seis dígitos más a la derecha le dicen a TeX dónde encontrar el glifo para el delimitador exactamente de la misma manera que lo \delcodeharía a. Ahora,

\left \vert

funciona precisamente de esta manera: \vertes una macro que se expande a \delimiter "026A30C, por lo que la línea anterior se expande a

\left \delimiter "026A30C

y TeX sabe que tiene que construir un delimitador de apertura (debido al \leftcomando) cuya pequeña variante se encuentra en la fuenteFamily 2 (TeX sabe qué fuente es) enpagposición 106, y cuya primera variante más grande se encuentra en la fuente 3, posición 12. La pregunta es: ¿qué diablos es el dígito?k¿proporcionado para?

Bueno, todos sabemos que podemos usarlo \vertno solo después de \left or \right(o \bigl, etc.) sino también por sí mismo, y en este caso es completamente equivalente a un lone |. Esto se debe a que el \delimiter comando puede aparecer también en lugares donde se usa TeX.nobuscando un delimitador; en este caso, los últimos tres dígitos hexadecimales del número siguiente se eliminan y el comando se comporta como si fuera un \mathchar . En otras palabras, cuando lo hacenoseguir \left, etc.,

\delimiter "kfppgqq

actúa exactamente como

\mathchar "kfpp

Esta vez,es del dígito kque TeX aprende qué tipo de átomo tiene que construir, y esta es la razón para proporcionarlo. Por lo tanto, puede definir \vertexpandirse a \delimiter "026A30Cy esta definición funcionará en todas las situaciones.


¡La respuesta, por fin!

Por fin estamos en condiciones de responder a la pregunta que se ha formulado. Considere los siguientes ejemplos de entrada:

  • |por sí mismo: TeX mira el \mathcodeasociado con  |, del cual aprendeambosdónde encontrar el glifo relevante yqué tipo de átomo construir.

  • \left|o \right|: TeXya sabeque tiene que construir un delimitador izquierdo (o derecho) y mira el \delcodede  | just para saber dónde encontrar los glifos necesarios.

  • \vertpor sí mismo: esta es una macro que se expande a \delimiter "026A30C; en este contexto, esto actúa como antes \mathchar "026A, y el primer dígito del número "026A le dice a TeX qué tipo de átomo construir (los tres siguientes, dónde encontrar el glifo, usándose siempre su variante pequeña en este caso). Entonces, un átomo ordinario [inario] (k = 0) se construye aquí.

  • \left\verto \right\vert: el primero de ellos se expande a \left \delimiter "026A30C. TeX ya sabe que se solicita un delimitador izquierdo y, por lo tanto,ignorael primer dígito del número "026A30Cy utiliza los dígitos restantes para aprender dónde encontrar los glifos que necesita. El efecto de \right\vertes análogo.

  • \lvertpor sí mismo: esta es una macro que se expande a \delimiter "426A30C; en este contexto, esto actúa como antes \mathchar "426A, y el primer dígito del número "426A le dice a TeX qué tipo de átomo construir, que, esta vez, es un átomo abierto (k = 4); Los siguientes tres dígitos le indican a TeX dónde encontrar el glifo apropiado, utilizándose siempre su variante pequeña en este caso.

  • \left\lverto \right\lvert: el primero de ellos se expande a \left \delimiter "426A30C. TeX ya sabe que se solicita un delimitador izquierdo, por lo que ignora el primer dígito del número "426A30Cy usa los seis restantes solo para ubicar los glifos necesarios. De manera similar para \right\lvert.

  • \rvertpor sí solo: ejercicio. (Pista: \rvertse expande a \delimiter "526A30C;k = 5 significa átomo de cierre).

  • \left\rverto \right\rvert: ejercicio.

De lo anterior vemos que (asumiendo las \mathcodedefiniciones y s habituales) \left|, \left\vert, \left\lverte incluso \left\rvert son exactamente lo mismo. Y lo mismo para \right.


¿Qué pasa \biglcon los familiares?

Las secuencias de control \big, \bigl, \bigm, \bigr, \Big, etc. son macros con un argumento, cada una de las cuales fabrica un átomo de un tipo predeterminado que contiene un "pseudo-delimitador" (es decir, no un delimitador en sentido técnico) de un tamaño predeterminado; lo hacen por medio de una construcción \left... \rightque abarca solo un cuadro vacío del tamaño apropiado, que está explícitamente envuelto por un comando,, o ( \mathorden realidad \mathrelno se usa, porque está “implícito por defecto”). Más precisamente, como seguramente ya sabes:\mathopen\mathclose\mathord

  • la serie \big, \Big, … genera átomos [inarios] ordinarios;

  • la serie \bigl, \Bigl, … genera átomos abiertos;

  • la serie \bigm, \Bigm,… genera átomos de relación;

  • la serie \bigr,, \Bigr… genera átomos de cierre.

Por lo tanto, aquí el argumento se utiliza sólo para localizar el glifo deseado.


Unas palabras sobre la entrada

Para simplificar, en la descripción anterior no mencionamos el hecho de que la \mathcodebúsqueda en la tabla ocurre solo para tokens de caracteres cuyo código de categoría es 11 (letra) o 12 (otro). Recuerde que el entradacEl paquete activa los caracteres en las posiciones 128… 255, y los archivos de definición de codificación pueden asignar un significado particular a algunos de estos caracteres activos, cuando se usan en modo matemático. Por supuesto, la sustitución de un carácter tan activo por su significado ocurreantes se llevan a cabo los procesos descritos anteriormente. Por poner un solo ejemplo, el fichero latin1.defcontiene, entre muchas otras, la declaración

\DeclareInputMath{177}{\pm}

de modo que el carácter número 177 siempre será equivalente, cuando se use en modo matemático, a la secuencia de control \pm. Esta sustitución es, por supuesto, completamente independiente de la \mathcodemaquinaria.

Respuesta2

La respuesta de Gustavo tiene muchos detalles interesantes y vale la pena leerla detenidamente. Pero la mayor parte del asunto es bastante fácil.

Después \left, \middley \rightsólo algunos tokens son legales:

  • un carácter (o una macro que finalmente se expande a uno) que no tiene negativo \delcode;
  • una macro cuya expansión final comienza \delimiterseguida de un número de 27 bits.

Tenga en cuenta que TeX realiza la expansión después de haber escaneado \left, \middleo \right, para encontrar el carácter requerido que tenga \delcodeo no negativo \delimiter(lo que a su vez activará la expansión para buscar un número).

Restringiendo al estándar TeX/LaTeX (a diferencia de XeTeX/LuaTeX con unicode-math), los únicos caracteres que tienen caracteres no negativos \delcodeson

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

Una macro típica del segundo tipo se define en TeX simple por

\def\rangle{\delimiter"526930B }

En LaTeX esto está escrito.

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

que es sólo un código repetitivo para decir esencialmente lo mismo (de una manera más clara).

AlláesUna diferencia importante: en lugar de cablear los números del grupo (o familia) matemático como en TeX simple, LaTeX usa nombres simbólicos.

A \delcodees un número de 24 bits; la diferencia con un \delimitercódigo es que los tres bits más a la izquierda de un \delimitercódigo especifican el tipo de símbolo, en caso de que no se utilice en el contexto de \left, \middleo \right(en adelante LMR). Así, por ejemplo, \rangleconstruye unCercaátomo en lo que respecta al espaciado (primer dígito hexadecimal 5 en formato simple, \mathcloseen LaTeX).

Por el contrario, cuando se usan en LMR, estos tres bits se ignoran, porque TeX ya conoce el tipo (Abierto,ordenoCerca, respectivamente) para asignar. Lo que significan los 24 bits más a la derecha no es realmente relevante.

\bigl¿ Cómo \bigentran \bigral juego junto con sus hermanos? En realidad , están \leftdisfrazados, pero enterrados en un comando de asignación de tipos, respectivamente \mathopeny . También hay algo que construye un\mathord\mathclose\bigmrelátomo de la misma manera:

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

Una vez hecho esto, donde <token>está el siguiente \bigy sus amigos, <box>hay un cuadro de tamaño apropiado (para distinguir entre , \bigy ) , y es , , o , dependiendo de cuál entre , y ( o amigos) se llama. En particular y los amigos constituyen el contexto LMR.\Big\bigg\Bigg<X>openordcloserel\bigl\big\bigr\bigm\big

No hay diferencia alguna entre

\big| \big\lvert \big\rvert

o entre

\bigl| \bigl\lvert \bigl\rvert

De manera similar, \left|y \left\lvertson \left\rvertexactamente iguales, porque y |todos apuntan al mismo carácter (técnicamente, los 24 bits menos significativos del código o son iguales).\lvert\rvert\delcode\delimiter


Es posible que haya notado eso >y \ranglecomparta los 24 bits menos significativos respectivamente en \delcodey en el \delimitercódigo; lo mismo sucede para <y \langle. Esto permite decir

\left<
\bigl<
\Bigl<

(o incluso \big<, pero sería incorrecto) en lugar de usar \langle; de manera similar para \rangle.

La distinción entre |(o el sinónimo \vert), \lverty \rvertes significativa sólo cuando no aparecen en un contexto LMR.

El ejemplo más simple donde esto se puede ver es en

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

La correcta es la última; lo primero resultaría en

iniciar sesión <thinmuskip>| <medmuskip>- <medmuskip>2|

mientras que este último da la correcta

iniciar sesión|-2|


En conclusión: úsalo \bigl\lvertsi te sientes más cómodo, pero \bigl|es más corto y viene a lo mismo.

información relacionada