Funciones tipo log y mod

\mathrm{sin} y \sin dan sobre el papel exactamente el mismo “sin”. Aun así el primero es incorrecto, y la diferencia vale 3.33325pt. Al medir $a\operatorname{op}b$ en LaTeX se obtienen 23.46638pt; $a\mathrm{op}b$ da 20.13313pt. La forma recta es idéntica, pero \mathrm no lleva espacio alguno alrededor. Esos 3.33325pt no son adorno: son exactamente dos espacios finos, los que TeX coloca a ambos lados de un átomo Op. Esta página parte de ese átomo, luego localiza los 32 nombres de función integrados en las fuentes de LaTeX, explica por qué exactamente diez de ellos colocan el subíndice debajo, muestra qué cambia la estrella de \DeclareMathOperator y separa las cuatro formas modulares \bmod, \pmod, \mod y \pod por su anchura medida.

Por qué \mathrm{sin} está mal: la clase de átomo fija el espaciado

En modo matemático cada letra se toma como nombre de una variable y se compone en cursiva matemática, así que escribir sin x produce no «seno» sino el producto de cuatro cantidades s, i, n, x. Hasta ahí es bien sabido, y el remedio que muchos escogen es \mathrm{sin}, porque en cuanto la letra queda recta el problema parece resuelto. Pero \mathrm cambia solo la fuente. Para TeX, la clase de átomo sigue siendo Ord, un símbolo ordinario.

TeX clasifica los elementos de una fórmula en clases de átomo —Ord (ordinario), Op (operador), Bin (operador binario), Rel (relación) y alguna más— y decide el espaciado únicamente según qué clases quedan contiguas. Entre Ord y Ord no hay espacio. Entre Op y Ord hay un espacio fino (\thinmuskip, 3mu). \sin es un Op; \mathrm{sin} es un Ord. De ahí la diferencia. Medir las cuatro expresiones siguientes en un documento a 10pt convierte ese mecanismo directamente en cifras.

measured on TeX Live 2024, 10pt article
\DeclareMathOperator{\myop}{op}
% \sbox0{$...$}\message{\the\wd0}

$a\operatorname{op}b$        23.46638pt
$a\myop b$                   23.46638pt   % identical to \operatorname
$a\mathop{\mathrm{op}}b$     23.46638pt   % same font as \mathrm, but Op class
$a\mathrm{op}b$              20.13313pt   % 3.33325pt narrower

$\mkern3mu$  1.66663pt        % one thin space; two of them = 3.33326pt

La tercera línea lo zanja. \mathop{\mathrm{op}} usa exactamente la misma fuente que \mathrm y aun así coincide con \operatorname hasta la cienmilésima de punto. Lo que crea la diferencia no es, pues, la fuente sino la clase Op que confiere \mathop. Y los 3.33325pt de diferencia son precisamente dos espacios finos de 1.66663pt: uno entre a y “op” y otro entre “op” y b. El dicho de que «\mathrm estropea el espaciado» queda así explicado hasta el último decimal. La conclusión práctica es simple: escribe siempre los nombres de función con el comando dedicado o con \operatorname, nunca con \mathrm.

Los 32 nombres de función integrados y dónde están escritos

Las definiciones de \log y \sin no viven en ningún paquete: viven en latex.ltx, el propio archivo de formato de LaTeX. En TeX Live 2024 ocupan las líneas 12487 a 12518 —exactamente 32 líneas— cada una con la forma \DeclareRobustCommand\log{\mathop{\operator@font log}\nolimits}. La lista es aún más antigua: casi el mismo conjunto está en el plain.tex de Knuth, líneas 1058–1085. Así que poder escribir \sin no se debe a amsmath; funciona desde el principio sin paquete alguno (solo declarar los propios requiere amsmath, véase más abajo).

  • Trigonométricas: \sin \cos \tan \cot \sec \csc, y las inversas \arcsin \arccos \arctan.
  • Hiperbólicas: \sinh \cosh \tanh \coth; conviene notar que \sech y \csch no están incluidas: hay que declararlas uno mismo.
  • Logaritmos y exponencial: \log (general), \ln (natural), \lg (base 2, común en teoría de la información), \exp.
  • Álgebra, geometría y afines: \deg (grado), \dim (dimensión), \ker (núcleo), \hom, \arg (argumento), \det (determinante).
  • Los 10 que colocan los índices debajo: \lim \limsup \liminf \max \min \sup \inf \det \Pr \gcd.

Bases y exponentes se añaden con el mecanismo ordinario de índices: \log_2 x pone un 2 abajo a la derecha de “log” y \sin^2\theta lo pone arriba a la derecha, dando el habitual sin²θ. Un detalle que solo se advierte leyendo la fuente: \limsup está definido como \mathop{\operator@font lim\,sup}hay un espacio fino \, colocado a mano entre “lim” y “sup”. No es una palabra continua sino dos palabras deliberadamente algo separadas.

latex
\[
  \sin^2\theta + \cos^2\theta = 1, \qquad
  \log_2 8 = 3, \qquad \ln e = 1.
\]

Los 10 con índices debajo y por qué \limits no surte efecto

De los 32, veintidós terminan su definición con \nolimits, así que sus índices salen abajo a la derecha. A los diez restantes —\lim, \limsup, \liminf, \max, \min, \sup, \inf, \det, \Pr, \gcdles falta el \nolimits. Como el valor por defecto de \mathop en estilo display es «índices debajo», son exactamente esos diez los que colocan x→0 bajo \lim en una fórmula en display. La convención de que un límite o un máximo muestre bien visible «sobre qué rango» está escrita directamente en las definiciones. En estilo de texto (en línea), los diez vuelven abajo a la derecha.

latex
\[
  \lim_{x \to 0} \frac{\sin x}{x} = 1, \qquad
  \max_{1 \le i \le n} a_i .
\]

Es natural pensar que bastaría con aplicar \limits, que sí funciona en \sum e \int, también a un nombre de función. Pero con amsmath cargado, \log\limits_{k} no hace absolutamente nada: ni error ni aviso, ignorado en silencio. La razón está en la línea 27 de amsopn.sty: \def\nolimits@{\@ifnextchar\limits{\nolimits\@gobble}{\nolimits}}. Toda definición de nombre de operador termina llamando a ese \nolimits@, y si el siguiente token es \limits, emite \nolimits y luego se come ese \limits. La medición lo confirma.

measured on TeX Live 2024, 10pt article
% depth of the box tells us where the script went (bigger = below the operator)

% WITHOUT amsmath — \log is \mathop{...}\nolimits, and \limits overrides it
$\displaystyle\log_{k}x$          d = 2.44443pt
$\displaystyle\log\limits_{k}x$   d = 9.47220pt   % moved below

% WITH amsmath — the \limits is swallowed by \nolimits@
$\displaystyle\log_{k}x$          d = 2.44443pt
$\displaystyle\log\limits_{k}x$   d = 2.44443pt   % unchanged: nothing happened

De modo que la regla general sobre \limits —aplicable a operadores grandes como \sum, tratada en «Sumas, integrales y operadores grandes»— no se extiende a los nombres de operador bajo amsmath. El sentido contrario pasa sin obstáculo: \lim\nolimits_{k} sí empuja el índice de \lim abajo a la derecha. Para un índice debajo, la respuesta correcta no es \limits sino la declaración con estrella de la sección siguiente.

\DeclareMathOperator y \operatorname: qué decide la estrella

Para un nombre que no está en la lista —la función signo sgn, la traza tr, el rango rank, ess sup, argmax—, entra amsmath. Para un uso puntual escribe \operatorname{sgn} x; para uso repetido, decláralo en el preámbulo con \DeclareMathOperator{\sgn}{sgn}. Como muestra la medición del comienzo, un \sgn declarado tiene exactamente la misma anchura que \operatorname{sgn}: ambos llaman al mismo \qopname y son literalmente lo mismo. La ventaja de declarar no es la calidad sino tenerlo todo en un sitio: cambiar de notación más adelante cuesta una sola línea del preámbulo.

preamble
\usepackage{amsmath}
\DeclareMathOperator{\sgn}{sgn}            % scripts to the right, like \log
\DeclareMathOperator*{\argmax}{arg\,max}   % scripts underneath, like \lim

% in the body:
% \[ \sgn x, \qquad \argmax_{x \in S} f(x) \]

La estrella solo decide dónde van los índices. Sin ella obtienes un miembro de la familia \log (abajo a la derecha); con ella, uno de la familia \lim (debajo, en display). Para un uso puntual, \operatorname*{…} hace lo mismo. Esto también se mide: componiendo el mismo op en display con _{n\to\infty}, la profundidad de la caja es 2.44443pt sin estrella y 8.94444pt con ella. Esa profundidad extra es el índice colgando bajo el símbolo. El \, dentro del nombre (arg\,max) está ahí por la misma razón que en la definición de \limsup: dejar la separación adecuada entre las dos palabras.

amsmath añade además vocabulario en torno a los límites superior e inferior. \varlimsup y \varliminf son variantes con una barra encima (o debajo) de “lim”, más simbólicas que la grafía “lim sup” de \limsup. \injlim y \projlim componen los límites directo e inverso como “inj lim” y “proj lim”, mientras que \varinjlim y \varprojlim dan la forma familiar en teoría de categorías, con una flecha → (o ←) bajo “lim”. Todas ellas, como una declaración con estrella, ponen los índices debajo. Cuál elegir depende de la convención de tu campo; en caso de duda, comprueba si la hoja de estilo de la revista ya define alguna.

\bmod, \pmod, \mod, \pod: distinguir las cuatro midiendo

Las cuatro formas modulares confunden porque todas imprimen “mod” y difieren solo en el espaciado y los paréntesis. \bmod y \pmod están en el LaTeX estándar; \mod y \pod vienen de amsmath. La diferencia de diseño salta a la vista en las definiciones: solo \bmod está definido con \mathbin{…}, es decir, como un átomo Bin, la misma clase que + y -, mientras que los otros tres se limitan a insertar un espacio y componer su contenido, a modo de anotación pospuesta.

amsmath.sty, lines 905-912
\DeclareRobustCommand{\bmod}{\nonscript\mskip-\medmuskip\mkern5mu\mathbin
  {\operator@font mod}\penalty900
  \mkern5mu\nonscript\mskip-\medmuskip}
\DeclareRobustCommand{\pod}[1]{\allowbreak
  \if@display\mkern18mu\else\mkern8mu\fi(#1)}
\DeclareRobustCommand{\pmod}[1]{\pod{{\operator@font mod}\mkern6mu#1}}
\DeclareRobustCommand{\mod}[1]{\allowbreak\if@display\mkern18mu
  \else\mkern12mu\fi{\operator@font mod}\,\,#1}

Fíjate en \if@display. \pod y \pmod insertan 18mu en display y 8mu en línea, y \mod inserta 18mu y 12mu. \bmod no tiene esa bifurcación: como operador binario, coloca sencillamente \mkern5mu de forma simétrica a ambos lados, lo que lo convierte en el único de los cuatro cuya anchura no cambia entre display y texto corrido. Medir la misma expresión a … n a 10pt convierte el diseño directamente en cifras.

ComandoSalidaAnchura en línea → displayCuándo usarlo
a \bmod na mod n36.01039pt → 36.01039pt (sin cambio)Cuando te refieres al resto como valor. Átomo Bin, por eso es simétrico. LaTeX estándar
a \pmod{n}a (mod n)46.01036pt → 51.56578ptEl cierre habitual de una congruencia, x \equiv y \pmod{n}. LaTeX estándar
a \mod{n}a mod n40.45473pt → 43.78798ptPara congruencias en estilos sin paréntesis; espacio previo más ancho que \bmod. Requiere amsmath
a \pod{n}a (n)23.51038pt → 29.06580ptParéntesis sin la palabra “mod”, cuando el módulo se sobreentiende. Requiere amsmath

Resta la anchura en línea de la anchura en display y las definiciones reaparecen exactamente. Para \pmod y \pod la diferencia es 5.55542pt: 18mu − 8mu = 10mu, y a 10pt 9.99976 − 4.44434 = 5.55542pt. Para \mod es 3.33325pt, es decir 18mu − 12mu = 6mu. Para \bmod es cero. La elección es cuestión de significado: usa \bmod cuando te refieras al resto como valor (5 \bmod 3 = 2), y \pmod cuando afirmes que dos números son congruentes módulo n (17 \equiv 5 \pmod{12}). Confundirlos priva al lector de la distinción entre un valor y una relación.

latex
\[
  5 \bmod 3 = 2, \qquad
  17 \equiv 5 \pmod{12}.
\]