Sistema de fuentes (NFSS / codificación)

Cuando cambias de fuente con \textbf o \sffamily, ¿qué ocurre por debajo? Esta página cubre la maquinaria detrás de los comandos de fuente. LaTeX especifica una fuente mediante cinco atributos independientes (NFSS) y compone mediante una codificación que asigna los caracteres de entrada a glifos reales. Dejando la lista de comandos para otra página, aquí profundizamos en los selectores de bajo nivel confirmados con \selectfont, las diferencias entre codificaciones como OT1 / T1 / TU y por qué se escribe \usepackage[T1]{fontenc} en pdfLaTeX.

NFSS: una fuente son cinco atributos

La selección de fuentes en LaTeX2e se apoya en el NFSS (New Font Selection Scheme). Su idea central es que cualquier fuente de texto queda completamente determinada por cinco atributos. El fntguide (la guía de selección de fuentes de LaTeX2e) los nombra así: encoding, family, series, shape y size.

  • Codificación — el orden de los caracteres dentro de la fuente (el mapa de carácter de entrada a ranura de glifo). Para texto, las comunes son OT1 (TeX text) y T1 (TeX extended text, la llamada Cork). Se detalla en la sección siguiente.
  • Familia — una colección de fuentes que comparten forma de letra. Los códigos son cmr para Computer Modern Roman, cmss para su Sans, cmtt para su Typewriter; en fuentes comerciales, ptm (Times), phv (Helvetica), pcr (Courier).
  • Serie — un eje que combina peso y anchura: m (medium = valor por defecto), b (bold), bx (bold extended), c (condensed), sb (semi-bold), etc.
  • Forma — la forma de las letras: n (vertical/romana), it (itálica), sl (inclinada/oblicua), sc (mayúsculas y versalitas). Menos común es ui (una itálica enderezada artificialmente).
  • Tamaño — el tamaño de diseño, una dimensión como 10pt; si no hay unidad, se supone pt.

La sutileza clave es que series es un eje que fusiona peso y anchura. En el esquema estándar, los pesos van de ul a ub (ultra light a ultra bold) y las anchuras de uc a ux (ultra condensed a ultra expanded). Ambos se concatenan en un solo valor, salvo que m se elimina, excepto cuando peso y anchura son medium; entonces queda un único m. Así, “negrita, anchura media” es b, “negrita extendida” es bx y “peso medio, condensada” es c.

Estos cinco atributos, escritos como encoding/family/series/shape/size, forman el nombre formal de una fuente dentro de LaTeX. Por ejemplo, OT1/cmr/m/n/10 significa “Computer Modern Roman en codificación OT1, peso medio, vertical, 10 puntos”. La cadena \OT1/cmr/m/n/10 que ves en una advertencia de overfull box es exactamente eso. Los comandos de alto nivel que usas normalmente, como \textbf, no son más que operaciones que reescriben uno de estos cinco atributos.

Selectores de bajo nivel y \selectfont

Debajo de los comandos de alto nivel están los selectores de bajo nivel que establecen un atributo cada vez: \fontencoding{T1}, \fontfamily{ptm}, \fontseries{b}, \fontshape{it}, \fontsize{12}{14}. Pero hay una regla crucial: establecerlos no hace nada hasta llamar a \selectfont. El fntguide advierte que debe haber un comando \selectfont inmediatamente después de cualquier ajuste de parámetros de fuente, antes de cualquier texto posterior.

latex
% 正しい:設定 → \selectfont → テキスト / Correct: set, then \selectfont, then text
\fontfamily{ptm}\fontseries{b}\selectfont Some text.

% 誤り:設定とテキストの間に文字を挟んではいけない / Wrong: no text between a setting and \selectfont
\fontfamily{ptm} Some \fontseries{b}\selectfont text.

Un atajo que establece estos atributos de una vez es \usefont{encoding}{family}{series}{shape}. Equivale a los comandos \font... correspondientes seguidos de \selectfont, con el tamaño tomado del valor actual. Es útil para invocar una fuente concreta una sola vez. Cambiar \fontencoding también requiere un \selectfont posterior para surtir efecto.

Rara vez escribes estos atributos directamente: \textbf llama a \fontseries por ti, \sffamily llama a \fontfamily, etc. La lista de comandos y la elección entre forma de comando y de declaración están en la página “Font style commands”. Solo se baja al nivel inferior para nombrar una fuente específica o conectar una fuente nueva a una clase o paquete.

Macros por defecto: \rmdefault y compañía

La familia que seleccionan \textrm o \rmfamily no está fijada en el código: se guarda en una macro. Hay tres: \rmdefault (romana), \sfdefault (sans), \ttdefault (typewriter), con valores por defecto cmr, cmss, cmtt en la clase article. Por eso, si se quiere poner el cuerpo en Times, Helvetica y Courier, se sustituyen estas macros en lugar de reescribir comandos.

latex
% 文書全体の3ファミリを差し替える / Re-point the three families for the whole document
\renewcommand{\rmdefault}{ptm}  % roman   → Times
\renewcommand{\sfdefault}{phv}  % sans    → Helvetica
\renewcommand{\ttdefault}{pcr}  % mono    → Courier

La fuente del cuerpo se define mediante \encodingdefault / \familydefault / \seriesdefault / \shapedefault, con valores por defecto OT1, \rmdefault, m, n. Como \familydefault apunta a \rmdefault, cambiar \rmdefault cambia la fuente del cuerpo. El peso de la negrita lo guarda \bfdefault (por defecto bx); con fuentes que no tienen negrita bx, como muchas PostScript, quizá tengas que bajarlo a b.

Codificaciones de fuente: de entrada a glifo

Una codificación de fuente es el orden de los glifos dentro de una fuente: el acuerdo sobre a qué ranura (glifo) se asigna cada carácter de entrada. Es el primero de los cinco atributos y, a la vez, el único sin comando para autores como \textbf. Como señala el fntguide, cambiar de codificación es algo que proporciona un paquete como fontenc.

Para texto, lo esencial es esto. OT1 es la codificación original de 7 bits “TeX text” de Knuth (por defecto). Como solo caben 128 caracteres, letras acentuadas como é o ñ se construyen componiendo una letra base con un acento (\accent). Esa composición es el problema: las palabras acentuadas no se parten con guion, y se copian mal desde el PDF. T1 (“TeX extended text”, de la conferencia TUG de 1990 en Cork, por eso codificación Cork) es una codificación de 8 bits y 256 glifos que contiene cada letra acentuada como un solo glifo. Así las lenguas de Europa occidental, y algunas orientales, se dividen correctamente y se copian y pegan bien.

TU (TeX Unicode) permite usar fuentes OpenType instaladas en el sistema directamente por punto de código Unicode, y es el valor por defecto en XeLaTeX y LuaLaTeX. Como fontspec lo configura automáticamente, rara vez escribes TU a mano en un motor Unicode. Además hay codificaciones especializadas: T2A (cirílico), LGR (griego, la codificación principal usada actualmente para esa lengua) y TS1 (la codificación Text Companion, un conjunto de glifos de símbolos de texto como copyright y monedas, gestionado por textcomp). Para matemáticas se asignan OML (itálica matemática), OMS (símbolos matemáticos) y OMX (símbolos matemáticos grandes).

CodificaciónQué cubreAnchura / notas
OT1“TeX text” original de Knuth (por defecto)7 bits; acentos compuestos → sin partición
T1TeX extended text (Cork); lenguas occidentales8 bits, 256 glifos; acentos únicos → partición funciona
TUTeX Unicode; fuentes OpenType directasPor defecto en Xe/LuaLaTeX; lo configura fontspec
T2ACirílico8 bits (también T2B / T2C)
LGRGriegoCodificación de 256 glifos hoy estándar para griego
TS1Text Companion (símbolos de texto)Copyright, monedas, etc.; gestionado por textcomp

Codificación de entrada frente a codificación de fuente

Separemos dos cosas que se confunden fácilmente. La codificación de entrada gobierna cómo se leen como caracteres los bytes del archivo fuente .tex (UTF-8 y similares); históricamente era trabajo del paquete inputenc. La codificación de fuente gobierna a qué glifo de la fuente de salida va cada uno de esos caracteres, y es trabajo de fontenc. Piensa en ello como entrada (inputenc) frente a salida (fontenc).

En pdfLaTeX moderno, el fuente se lee como UTF-8 por defecto, así que casi nunca necesitas cargar inputenc explícitamente. Sin embargo, la codificación de fuente sigue mereciendo la pena. fontenc es un paquete para pdfLaTeX; en XeLaTeX o LuaLaTeX se usa fontspec en su lugar (y como TU es el valor por defecto allí, el problema casi no aparece).

En pdfLaTeX, carga T1

Si compones con pdfLaTeX, la convención es poner \usepackage[T1]{fontenc} en el preámbulo. Esto cambia la codificación de fuente del documento a T1 y elimina los problemas de OT1 por defecto: palabras acentuadas que no se parten y texto que se corrompe al copiarlo desde el PDF. La documentación de fontenc dice lo mismo: da soporte a lenguas occidentales extendidas como francés, alemán, italiano y polaco, y permite que LaTeX divida palabras con letras acentuadas y que la salida pueda copiarse y pegarse.

Cuando enumeras varias codificaciones como opciones de fontenc, la última de la lista se convierte en la predeterminada (\encodingdefault se establece en ella). Por ejemplo, en un documento que mezcla griego, escribe \usepackage[LGR,T1]{fontenc} para que el cuerpo siga en T1 por defecto y puedas cambiar a LGR donde haga falta.

document.tex
\documentclass{article}
\usepackage[T1]{fontenc}   % フォントエンコーディングを T1 に / font encoding -> T1
% pdfLaTeX では入力は UTF-8 が既定(inputenc は通常不要)
% Input is UTF-8 by default on pdfLaTeX (inputenc usually unneeded)
\begin{document}
% T1 ならアクセント付きの語も正しくハイフネーションされる
% With T1, accented words hyphenate correctly
Na\"ive r\"esum\"e, \"uberfl\"ussig, Stra\ss{}e.
\end{document}

Selectores de bajo nivel en la práctica

Por último, un solo documento confirma cómo se usan los selectores de bajo nivel y \usefont. \usefont da cuatro de los cinco atributos a la vez (encoding, family, series, shape) y confirma en el acto; \fontfamily más \selectfont establece atributos individualmente y confirma. Si cualquiera se encierra en un grupo { }, el efecto se limita a ese tramo.

document.tex
\documentclass{article}
\usepackage[T1]{fontenc}
\begin{document}
% \usefont で 4 属性を一括指定 / \usefont sets four attributes at once
{\usefont{T1}{ptm}{b}{it} Bold italic Times}

% 低水準セレクタを個別に設定し \selectfont で確定
% Set selectors individually, then commit with \selectfont
{\fontfamily{phv}\fontseries{b}\selectfont Bold Helvetica}

% サイズだけ変える(baselineskip は現在値を流用)
% Change only the size (reuse the current baselineskip)
{\fontsize{14}{\f@baselineskip}\selectfont Fourteen point}
\end{document}

Aquí {\usefont{T1}{ptm}{b}{it} ...} selecciona “Times en codificación T1, negrita itálica”; al salir del grupo se restaura la fuente anterior. Pasar la macro interna \f@baselineskip como segundo argumento de \fontsize es el modismo para cambiar solo el tamaño de letra dejando intacto el interlineado (no debes reescribir macros internas directamente, pero leer una para pasarla como argumento está bien).