
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 \langle
o \rangle
. Evidentemente, |
entra dentro del primer caso, mientras que \vert
, \lvert
, y \rvert
dentro del segundo.
Ahora, independientemente del método utilizado para ingresarlo, para cada carácter que TeX debecomponeren una fórmula, necesita saber:
de dónde tomar el carácter, es decir, de qué fuente y desde qué posición dentro de esa fuente;
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
\mathcode
tabla y es muy similar a otras tablas TeX, como las tablas de \catcode
s, de \sfcode
s, de \uccode
s, 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 \mathcode
se 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
\mathcode
tabla 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
\char
primitiva, equivalente al comando de LaTeX \symbol
. Por ejemplo, en lugar de bubble
hacerlo, podría escribir en su archivo fuente \char98 u\char98 \char98 le
y 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 \mathchar
primitiva para especificar cualquier carácter matemático (o símbolo matemático) que desee. Pero hay una diferencia importante entre \char
y \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 \mathchar
se espera un número entero de 15 bits, que contiene exactamente la misma información que encontrar en una \mathcode
entrada 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, \mathchar
los 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 \sum
se ha hecho equivalente a
\mathchar"1350
, y esto explica por qué escribir \sum
en 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 \mathchar
comando 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 \left
o \big
o
\biggr
o…:
\vert
eventualmente 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;\lvert
es 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;\lvert
eventualmente 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 \mathcode
asociado con el “|” El carácter "026A
también lo es, de modo que un simple |
en la entrada se comporta, al menos cuando se usa solo y no después \right
de o \Bigm
o \Biggl
o…, 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 \left
o \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 \mathcode
tabla. 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
, \right
u 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 \mathcode
aprende 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
\delcode
siguiente |
, 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
, \Vert
o 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 \delimiter
comando
El comando TeX primitivo \delimiter
debe 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
,
\right
y 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 \delcode
haría a. Ahora,
\left \vert
funciona precisamente de esta manera: \vert
es 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
\left
comando) 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 \vert
no 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 \vert
expandirse a \delimiter "026A30C
y 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\mathcode
asociado 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\delcode
de|
just para saber dónde encontrar los glifos necesarios.\vert
por 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\vert
o\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"026A30C
y utiliza los dígitos restantes para aprender dónde encontrar los glifos que necesita. El efecto de\right\vert
es análogo.\lvert
por 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\lvert
o\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"426A30C
y usa los seis restantes solo para ubicar los glifos necesarios. De manera similar para\right\lvert
.\rvert
por sí solo: ejercicio. (Pista:\rvert
se expande a\delimiter "526A30C
;k = 5 significa átomo de cierre).\left\rvert
o\right\rvert
: ejercicio.
De lo anterior vemos que (asumiendo las \mathcode
definiciones y s habituales) \left|
, \left\vert
, \left\lvert
e incluso \left\rvert
son exactamente lo mismo. Y lo mismo para \right
.
¿Qué pasa \bigl
con 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
... \right
que abarca solo un cuadro vacío del tamaño apropiado, que está explícitamente envuelto por un comando,, o ( \mathord
en realidad \mathrel
no 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 \mathcode
bú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.def
contiene, 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 \mathcode
maquinaria.
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
, \middle
y \right
só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
\delimiter
seguida de un número de 27 bits.
Tenga en cuenta que TeX realiza la expansión después de haber escaneado \left
, \middle
o \right
, para encontrar el carácter requerido que tenga \delcode
o 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 \delcode
son
( "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 \delcode
es un número de 24 bits; la diferencia con un \delimiter
código es que los tres bits más a la izquierda de un \delimiter
código especifican el tipo de símbolo, en caso de que no se utilice en el contexto de \left
, \middle
o \right
(en adelante LMR). Así, por ejemplo, \rangle
construye unCercaátomo en lo que respecta al espaciado (primer dígito hexadecimal 5 en formato simple, \mathclose
en 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 \big
entran \bigr
al juego junto con sus hermanos? En realidad , están \left
disfrazados, pero enterrados en un comando de asignación de tipos, respectivamente \mathopen
y . También hay algo que construye un\mathord
\mathclose
\bigm
relátomo de la misma manera:
\math<X>{\left<token><box>\right.\kern-\nulldelimiterspace}
Una vez hecho esto, donde <token>
está el siguiente \big
y sus amigos, <box>
hay un cuadro de tamaño apropiado (para distinguir entre , \big
y ) , 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>
open
ord
close
rel
\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\lvert
son \left\rvert
exactamente 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 \rangle
comparta los 24 bits menos significativos respectivamente en \delcode
y en el \delimiter
có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
), \lvert
y \rvert
es 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\lvert
si te sientes más cómodo, pero \bigl|
es más corto y viene a lo mismo.