Comandos de estilo de fuente

Escriba {\bf\it x} en LaTeX y no obtendrá negrita cursiva: obtendrá cursiva. Invierta el orden a {\it\bf x} y lo que desaparece es la cursiva, dejando una negrita vertical. Los viejos comandos de dos letras sencillamente no se suman, y la razón cabe en una palabra de la línea 493 de article.cls. Lea esa línea y entenderá de golpe por qué el LaTeX moderno entrega cada cambio de fuente en dos formas. Esta página expone cómo se reparten esos comandos sobre tres ejes independientes —familia, serie y forma—, cuándo recurrir al \textbf{...} con argumento frente a la declaración \bfseries acotada por un grupo, y qué dice el registro cuando se piden versalitas negritas y sale negrita normal. Con mediciones en todo el recorrido.

La diferencia entre \textbf{...} y \bfseries

Cada cambio viene en dos formas. La forma de comando, que empieza por \text…, toma un argumento y solo afecta a lo que hay entre sus llaves. La forma de declaración, terminada en …family / …series / …shape, no toma argumento y sigue vigente desde ese punto hasta el final del grupo o entorno que la contiene. La elección la marca la longitud del tramo: unas pocas palabras piden \textbf{solo esto}; un párrafo entero o un entorno piden {\bfseries …} o \begin{quote}\itshape …\end{quote}. Si olvida encerrar una declaración en un grupo, seguirá vigente hasta el final del documento, así que compruebe el emparejamiento de { y }. El código de clases y paquetes también prefiere las declaraciones, porque no añaden nada propio y dejan el control del alcance a quien las invoca.

latex
% command form: for a short span
This is \textbf{bold} and this is \textit{italic}.

% declaration form: a group limits the scope
Normal here. {\bfseries Bold from here on.} Back to normal.

% declaration applied to a whole environment
\begin{quote}
  \itshape The whole quotation is set in italic.
\end{quote}

Más allá del alcance, ambas formas difieren en algo práctico: la forma de comando inserta por usted la corrección de cursiva y la declaración no. Un glifo inclinado sobresale hacia arriba y a la derecha, pero su anchura de composición no incluye ese saliente, de modo que una letra vertical que le siga choca con él. Medido, \textit{f}h da 10,74167 pt y {\itshape f}h, 8,62222 pt: los 2,11945 pt de diferencia son exactamente el espacio que falta. Con una declaración, el \/ final lo escribe usted: {\itshape f\/}h mide 10,74167 pt, coincidiendo al detalle con la forma de comando. Qué hace esa corrección lo detalla la página sobre el énfasis.

Familia, serie y forma: los tres ejes que eligen una fuente

Una fuente en LaTeX2e es la combinación de tres atributos mutuamente independientes: la familia es la forma de letra subyacente, la serie reúne grosor y anchura, y la forma es la inclinación o el trazo. Cambie un eje y los otros dos quedan intactos: esa ortogonalidad es el núcleo del diseño, y por eso «negrita pero seguir en sans-serif» o «cursiva pero seguir en negrita» se escriben sin rodeos. El esquema apareció como NFSS (New Font Selection Scheme) en 1989, alcanzó su segunda versión en 1993 y se incorporó como estándar con LaTeX2e en 1994; el anterior LaTeX 2.09 no tenía siquiera la noción de atributo de fuente. Conviene recordar que la serie es un solo eje que cubre grosor y anchura. Por eso la negrita de Computer Modern se escribe bx: bold extended, gruesa y ancha.

  • Familia — redonda, es decir con serifas, \textrm / \rmfamily; sans-serif \textsf / \sffamily; máquina de escribir, o sea monoespaciada, \texttt / \ttfamily.
  • Serie — media, el grosor por defecto, \textmd / \mdseries; negrita \textbf / \bfseries. El valor del atributo es una cadena de hasta dos letras que reúne grosor y anchura: m (medium), b (bold), bx (bold extended), c (condensed), etc.
  • Forma — vertical, el valor por defecto, \textup / \upshape; cursiva \textit / \itshape; inclinada \textsl / \slshape; versalitas \textsc / \scshape. Los valores son, respectivamente, n, it, sl y sc.
  • Cursiva e inclinada no son lo mismo. \itshape invoca un tipo dibujado aparte —cmti10 en Computer Modern—, mientras que \slshape invoca la redonda inclinada mecánicamente (cmsl10). Los propios trazos difieren: la a cursiva, por ejemplo, es de un solo piso.
ClaveEje y efectoForma de comando (tramo corto)Forma de declaración (acotada por un grupo)
romanFamilia: redonda (con serifas)\textrm{...}{\rmfamily ...}
sansFamilia: sans-serif\textsf{...}{\sffamily ...}
typewriterFamilia: máquina de escribir (monoespaciada)\texttt{...}{\ttfamily ...}
boldSerie: negrita (valor bx y afines)\textbf{...}{\bfseries ...}
mediumSerie: media (por defecto, valor m)\textmd{...}{\mdseries ...}
italicForma: cursiva (valor it)\textit{...}{\itshape ...}
slantedForma: inclinada (valor sl)\textsl{...}{\slshape ...}
small capsForma: versalitas (valor sc)\textsc{...}{\scshape ...}
uprightForma: vuelta a vertical (valor n)\textup{...}{\upshape ...}
reset allRestablecer los tres ejes al valor por defecto del documento\textnormal{...}{\normalfont ...}

Aplicar negrita y cursiva a la vez

Escriba \textbf{\textit{...}} y obtendrá cursiva negrita. El orden da igual, y con declaraciones basta con enumerarlas: {\bfseries\itshape ...}. Como los ejes son independientes, el segundo cambio nunca borra el primero. Medido, dentro de \textbf{\textit{Y}} la serie sigue siendo bx y solo la forma pasa a it, de modo que se carga la cursiva negrita de Computer Modern, cmbxti10. Con los tres ejes, \textsf{\textbf{\textit{...}}} da cursiva negrita sin serifas. Pero poder escribir una combinación no es lo mismo que la fuente la tenga: cuando el tipo solicitado no existe, LaTeX sustituye por algo cercano, y de eso trata la sección siguiente.

latex
% nest the command forms
\textsf{\textbf{\textit{Bold sans-serif italic}}}

% or list the declarations in one group (equivalent)
{\sffamily\bfseries\itshape Bold sans-serif italic\/}

% one word back to the document default inside a sans-serif run
{\sffamily A heading-like line with one \textnormal{normal} word}

Para restablecer los tres ejes de una vez al valor por defecto del documento se usan \textnormal{...} (forma de comando) y \normalfont (forma de declaración), cómodos cuando un título sin serifas necesita una palabra en la fuente de texto normal. Para restablecer un solo eje, invoque el comando que nombra su valor por defecto: \rmfamily, \mdseries, \upshape. De paso, conviene saberlo: las líneas 11158 a 11170 de latex.ltx son una serie de llamadas a \DeclareTextFontCommand, de modo que cada \text… aquí citado se fabrica mecánicamente a partir de su declaración correspondiente. Esa misma serie define además \textulc (vuelta a mayúsculas y minúsculas) y \textsw (swash), aunque muy pocas fuentes llevan de verdad esas formas.

Por qué \bf e \it se niegan a combinarse

Porque la definición de \bf lleva dentro un \normalfont. Las líneas 490 a 496 de article.cls enumeran así los viejos comandos de dos letras: \DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf}, \DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit}, y lo mismo para \rm, \sf, \tt, \sl y \sc. Así que \bf no significa «pon esto en negrita» sino «restablece los tres ejes al valor por defecto y luego ponlo en negrita». Componga {\bf\it x} y el \normalfont escondido dentro de \it tira por completo el \bfseries anterior: medido, la serie cae de bx a m y solo sobrevive la forma it. En el orden inverso, {\it\bf x}, la forma vuelve a n y solo sobrevive la serie bx. Mezclar lo viejo con lo nuevo da lo mismo: \textbf{\tt x} acaba con la familia cmtt pero la serie de vuelta en m, descartando el \textbf sin decir nada.

latex
% the old two-letter commands do not stack
{\bf\it x}          % italic only  -- the bold is thrown away
{\it\bf x}          % upright bold -- the italic is thrown away
\textbf{\tt x}      % typewriter, medium weight -- \textbf silently lost

% the modern commands do stack
{\bfseries\itshape x}
\textbf{\ttfamily x}

Esta falta de ortogonalidad no es un defecto, sino la conservación fiel del modelo de fuentes de LaTeX 2.09, anterior a 1994: allí «la fuente actual» era un único nombre y no un conjunto de atributos, de modo que todo cambio era una sustitución completa. LaTeX2e introdujo en 1994 los comandos apilables por eje y conservó los antiguos mediante \DeclareOldFontCommand como capa de compatibilidad para que los documentos existentes sigan compilando. Todavía funcionan sin error, y ese es justamente el problema: quien escribe {\bf\it importante} quiere cursiva negrita y no se enterará de lo contrario hasta mirar el PDF. Nótese además que el tercer argumento de \DeclareOldFontCommand es el significado en modo matemático, así que \bf se comporta como \mathbf dentro de una fórmula. Que un comando signifique una cosa en el texto y otra en las matemáticas es un motivo más para evitarlo. En código nuevo, use siempre la familia \textbf / \bfseries.

Cuando el registro dice Font shape ... undefined

No es un aviso de errata: dice que la fuente no tiene tipo para la combinación solicitada. El caso clásico son las versalitas en negrita: Computer Modern, en la codificación OT1 por defecto, no tiene ningún tipo que sea a la vez bx y sc. Componga \textsc{\textbf{...}} y el registro muestra el par de líneas que se reproduce más abajo: una línea Font shape y otra using ... instead. LaTeX no se detiene con un error: descarta las versalitas y sigue en negrita normal. Así que uno se entera cuando el PDF no muestra las versalitas pedidas. Por la misma razón, \textsw{...} avisa de que OT1/cmr/m/sw está sin definir.

log
LaTeX Font Warning: Font shape `OT1/cmr/bx/sc' undefined
(Font)              using `OT1/cmr/bx/n' instead on input line 8.

LaTeX Font Warning: Some font shapes were not available, defaults substituted.

Para esta advertencia concreta hay un arreglo de una línea: añada \usepackage[T1]{fontenc}. El Computer Modern codificado en T1 (las fuentes EC) sí tiene versalitas en negrita, así que el mismo \textsc{\textbf{...}} compila sin avisos; al recompilar con [T1]{fontenc} cargado, la advertencia de fuente desapareció por completo del registro. T1 mejora además el tratamiento de las letras acentuadas y la partición silábica en texto occidental, así que es una línea que este tipo de documentos acaba necesitando de todos modos. Si la advertencia nombra otra combinación, lea el nombre de cuatro partes del registro —OT1/cmr/bx/sc, es decir, codificación / familia / serie / forma— e identifique qué eje falta. Decida entonces: cambiar a una fuente que lo tenga, simplificar la petición un escalón, o aceptar la sustitución, y deje constancia de lo decidido.

latex
% OT1 Computer Modern has no bold small caps -> warning + silent fallback
% T1 (the EC fonts) does have it
\usepackage[T1]{fontenc}

\textsc{\textbf{Bold Small Capitals}}

% low-level NFSS: name the four attributes, then commit with \selectfont
{\fontfamily{cmr}\fontseries{bx}\fontshape{sc}\selectfont Explicit}

Como muestran esas dos últimas líneas, un comando de alto nivel como \textbf se expande internamente en los comandos de bajo nivel de NFSS. \fontfamily{...}, \fontseries{...} y \fontshape{...} reescriben los atributos, y \selectfont elige realmente una fuente a partir de lo que los cuatro atributos contengan en ese momento. Fijar los atributos por sí solo no hace nada: el tipo no cambia hasta que se llama a \selectfont. Rara vez hace falta tocar esta capa directamente, pero es a la que se recurre para invocar por nombre un tipo concreto, o para comprobar a qué se refiere el nombre de cuatro partes de una advertencia. Qué significa la codificación y cómo cargar ficheros de fuente reales corresponde a la página sobre el sistema de fuentes.

Cambiar de tipo japonés: mincho y gótica

En pLaTeX y upLaTeX, el texto japonés tiene ejes propios, y el eje de familia cuenta con dos miembros: mincho \textmc / \mcfamily y gótica \textgt / \gtfamily. Se definen a partir de la línea 1471 de plcore.ltx y conmutan \kanjifamily, un atributo exclusivo del lado japonés. Lo interesante es qué ocurre bajo \bfseries. Medido, la familia japonesa sigue siendo mc (mincho) y solo la serie pasa a bx. La línea 25 de jy1mc.fd dice entonces \DeclareFontShape{JY1}{mc}{bx}{n}{<->ssub*gt/m/n}{}: una petición de «mincho negrita» está definida para servirse con gótica en su grosor normal. Así que «lo puse en negrita y salió gótica» no es accidente ni recurso de emergencia: es una sustitución escrita explícitamente en el fichero de definición de fuentes, reflejo de la tradición de marcar el énfasis japonés cambiando de tipo y no de grosor.

Una regla de trabajo para manuscritos

Limite los comandos de fuente que escribe directamente en el cuerpo a los que portan significado. En una tesis o un documento técnico, cuanto más se dispersan los cambios de fuente como pequeños retoques visuales, más difícil se vuelve mantener el manuscrito. Reglas como «los títulos van en negrita», «los pies de figura son más pequeños», «los términos definidos van siempre sin serifas» pertenecen a la clase, a un paquete o a una macro semántica propia, no a un \textbf tecleado de nuevo cada vez. Intercale una capa —\newcommand{\term}[1]{\textsf{#1}}— y un cambio de criterio será una edición de una línea. A la inversa, para lo que su apariencia es el significado, como el nombre de un botón de la interfaz o de una tecla, usar \textsf o \texttt en línea está perfectamente bien. El criterio: ¿la apariencia es el fin, o hace de sustituto del significado?

  • Deje el énfasis a \emph. Incrustar una decisión visual en el cuerpo significa que ya no podrá cambiar después el aspecto del énfasis.
  • Use declaraciones para tramos largos. Para una cita entera o una nota al margen, declare \itshape al principio del entorno y deje que el entorno cierre el grupo.
  • Pruebe las combinaciones antes en un fichero mínimo. Componga \textsf{\textbf{...}} o \textsc{...} una vez en un documento corto y confirme que el registro no tiene advertencias de fuente antes de repartirlas por el manuscrito.
  • No deje las sustituciones a su aire. Si ignora los avisos, un mismo marcado puede verse distinto de un capítulo a otro. Cambie de fuente o simplifique la petición.
  • No mezcle los viejos comandos de dos letras. Si encuentra \bf o \it en un manuscrito colaborativo, sustitúyalos por \bfseries / \itshape o \textbf / \textit. Parecen funcionar, pero no se combinan.