Las normas de envío dicen «todas las fuentes deben ir incrustadas» y no tienes ni idea de si las tuyas lo están. Un pasaje que compusiste en itálica se niega a inclinarse. Escribiste Numbers=OldStyle en fontspec y no cambió nada. Lo que zanja estos casos no es la intuición sino las herramientas de inspección. Esta página alinea las utilidades de comprobación de fuentes en torno a LaTeX, cada una con salida capturada de una ejecución real: pdffonts, fc-list, otfinfo, \fontname\font, nfssfont para imprimir una tabla de glifos, y vftovp para abrir una fuente virtual (.vf) en texto legible. De paso, descifraremos por qué una fuente de TeX se llama phvbc8t.
¿Qué fuente es exactamente? \fontname y \showthe\font
En cualquier punto de un documento, \fontname\font responde con el nombre de archivo real y \showthe\font con las cinco coordenadas NFSS. El primero devuelve el nombre de la métrica que TeX cargó de verdad —cmr10, cmbx10, cmti10— y el segundo imprime > \OT1/cmr/m/n/10 . en el registro. Nunca se contradicen: el segundo es la petición y el primero el resultado. Mirando ambos se ve de un vistazo si llegó la fuente pedida o si hubo una sustitución por el camino.
% \typeout{fontname = \fontname\font} in a default article
fontname = cmr10
bf fontname = cmbx10
it fontname = cmti10
% \showthe\font stops the run and prints the NFSS name
> \OT1/cmr/m/n/10 .
% \showfont is NOT a LaTeX command; it belongs to ConTeXt.
% In LaTeX it fails with:
! Undefined control sequence.Aquí toca una corrección. \showfont no es un comando de LaTeX. Se cita a menudo como la forma de informar de la fuente actual, pero no existe ni en el núcleo de LaTeX2e ni en ningún paquete, y ejecutarlo da ! Undefined control sequence. (ConTeXt sí tiene un comando con ese nombre). Para hacer lo mismo en LaTeX, súmale a los dos anteriores la lectura directa de las macros internas: dentro de \makeatletter, \f@encoding, \f@family, \f@series, \f@shape y \f@size permiten hacer \typeout de las cinco coordenadas con el formato que quieras.
Para rastrear la carga de fuentes en sí está el paquete tracefnt. Con \tracingfonts=2, cada vez que se carga una fuente real el registro anota qué fuente externa se cargó bajo qué nombre NFSS. Para dar con el origen de una sustitución, resulta más informativo que el propio aviso. Eso sí, la salida es voluminosa: en la práctica conviene extraer antes la \section problemática a un documento mínimo.
% \usepackage{tracefnt} + \tracingfonts=2, document set in T1
LaTeX Font Info: External font `ecbx1000 at10.0pt' loaded as
(Font) T1/cmr/bx/n/10 on input line 6.
LaTeX Font Info: External font `ecti1000 at10.0pt' loaded as
(Font) T1/cmr/m/it/10 on input line 6.Comprobar las fuentes incrustadas en el PDF — pdffonts
pdffonts (viene con Poppler y Xpdf) tabula qué fuentes hay en un PDF terminado, en qué formato y si están incrustadas, una línea por fuente. Importan tres columnas: emb para la incrustación, sub para el subconjunto (solo se conservaron los glifos realmente usados) y uni para la correspondencia inversa a Unicode (si se puede copiar texto del PDF). La comprobación previa al envío es solo este comando, y si toda la columna emb dice yes, nadie devolverá el archivo por fuentes sin incrustar.
# a document compiled with pdfLaTeX and \usepackage[T1]{fontenc}
$ pdffonts pf.pdf
name type encoding emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
OSZFFG+SFRM1000 Type 1 Custom yes yes yes 4 0
PCDLRW+SFBX1000 Type 1 Custom yes yes yes 5 0
IEKZWO+SFTI1000 Type 1 Custom yes yes yes 6 0
GFIBPT+CMMI10 Type 1 Builtin yes yes yes 8 0
# the same document via XeLaTeX + fontspec with an OpenType face
$ pdffonts pfx.pdf
PPMQXL+TeXGyrePagella-Regular-Identity-H CID Type 0C Identity-H yes yes yes 4 0
AXDTQU+TeXGyrePagella-Bold-Identity-H CID Type 0C Identity-H yes yes yes 6 0La salida sirve además de huella del motor. pdfLaTeX incrusta fuentes Type 1 con codificaciones Custom o Builtin, mientras que XeLaTeX y LuaLaTeX con una fuente OpenType vía fontspec producen CID Type 0C e Identity-H: basta para saber con qué se construyó un PDF que te han enviado. Las seis letras antepuestas a cada nombre (OSZFFG+ y compañía) son etiquetas de subconjunto; subconjunta la misma fuente dos veces y obtendrás dos prefijos distintos. A la inversa, una fila con emb en no significa que esa fuente queda a merced de la máquina del lector: inofensivo con las catorce fuentes PostScript estándar, pero motivo de rechazo al enviar.
Averiguar qué fuentes tiene el sistema — fc-list y otfinfo
El nombre que le pasas a fontspec tiene que ser el nombre propio de la fuente; inventarse uno no funciona. Para listar lo instalado, con los nombres emparejados a los archivos, está fc-list (parte de fontconfig). Sin argumentos lo imprime todo; fc-list : family solo los nombres de familia; un patrón acota la lista. Del lado de LuaTeX, el equivalente es luaotfload-tool: --find resuelve un nombre y --update reconstruye la base de datos de nombres de fuente. Ojo: fontconfig es estándar en Linux, pero no viene instalado por defecto en macOS (se añade aparte, por Homebrew o similar).
# every installed font, one line each (this machine reports 2799 lines)
$ fc-list | wc -l
2799
# narrow to one family: file, then all its names, then the style
$ fc-list "Hiragino Mincho ProN" file family style
/System/Library/Fonts/HiraginoMinchoProN.ttc: Hiragino Mincho ProN,\
Hiragino Mincho ProN W6:style=W6,Regular
# what would fontconfig pick for a generic request?
$ fc-match sans
Verdana.ttf: "Verdana" "Regular"Lo que una fuente puede hacer de verdad es competencia de otfinfo (de lcdf-typetools, incluido en TeX Live). -i da nombres, versión y copyright; -f lista las etiquetas de características OpenType; -s las escrituras y lenguas admitidas; -t las tablas. -f es el de mayor valor práctico: comprobar aquí si existen onum o smcp antes de escribir Numbers=OldStyle o Letters=SmallCaps en fontspec evita la mayoría de los casos de «lo escribí y no pasó nada». Nombrar una característica que la fuente no tiene se ignora sin más, en silencio.
$ otfinfo -i $(kpsewhich texgyrepagella-regular.otf)
Family: TeX Gyre Pagella
Subfamily: Regular
PostScript name: TeXGyrePagella-Regular
Version: Version 2.501;PS 2.501;ffdkm 0.1
Copyright: Copyright 2006-2018 for TeX Gyre extensions by B. Jackowski,
J.M. Nowacki, et al. Vietnamese characters were added by Han The Thanh.
$ otfinfo -f $(kpsewhich texgyrepagella-regular.otf)
c2sc Small Capitals From Capitals
dlig Discretionary Ligatures
kern Kerning
liga Standard Ligatures
lnum Lining Figures
onum Oldstyle Figures
size Optical Size
smcp Small Capitals
ss01 Stylistic Set 1Esa salida de -i conserva además una pequeña conexión. Los caracteres vietnamitas de TeX Gyre Pagella los añadió Hàn Thế Thành, el autor de pdfTeX y el hombre cuya tesis doctoral trajo la microtipografía a TeX, tema de la página microtype de este sitio. Los avisos de copyright de las fuentes guardan más historia de la que uno esperaría.
Imprimir todos los glifos de una fuente — nfssfont.tex y fonttable
Para ver con tus propios ojos qué glifos lleva una fuente, imprime una tabla de glifos. La herramienta interactiva que TeX distribuye desde hace décadas es nfssfont.tex: al arrancar pregunta Input external font name, e.g., cmr10; responde cmr10, escribe \table para la tabla y \bye para terminar. Una corrección aquí: la invocación tan repetida tex nfssfont no funciona. La línea 48 de nfssfont.tex es \documentclass{article}; es un documento LaTeX, y bajo plain TeX muere con ! Emergency stop. El comando correcto es latex nfssfont o pdflatex nfssfont.
$ pdflatex nfssfont
Input external font name, e.g., cmr10
(or <enter> for NFSS classification of font): cmr10
Now type a test command or \help for help [ \table \bye ]: \table
...
Output written on nfssfont.pdf (1 page, 71803 bytes).
# \help lists the whole repertoire:
# \init switches to another font; \stop or \bye finishes the run;
# \table prints the font layout in tabular format;
# \text prints a sample text, assuming TeX text font conventions;
# \sample combines \table and \text;
# \lowers \uppers \digits \math \punct \names \bigtest ...
# Knuth's original is plain TeX and does start under tex:
$ tex testfont
Name of the font to test = cmr10
Now type a test command (\help for help): \tableSi el diálogo resulta engorroso, el paquete fonttable hace lo mismo desde dentro de un documento. \fonttable{cmr10} toma un nombre de fuente (estrictamente, un nombre de .tfm) y compone una tabla con todos los glifos —\fonttable{pzdr} para asomarse a Zapf Dingbats—; \xfonttable{T1}{cmr}{m}{n} la especifica mediante los cuatro atributos NFSS. \fontrange{<low>}{<high>} acota la tabla a bloques de 16 glifos, hasta 256. Y si lo que quieres es texto de muestra compuesto en la fuente en lugar de una cuadrícula, eso es \fonttext{cmr10}. Buena parte del código del paquete es un nfssfont.tex editado, y sus comandos de prueba reimplementan el testfont.tex de Knuth: tres caras de una misma herramienta. De paso: pulsar intro en el primer aviso de nfssfont sin escribir nombre lo cambia a designar la fuente por sus cinco atributos NFSS.
Fuentes virtuales (.vf): una capa que fabrica glifos que no existen
Una fuente virtual (.vf) es una capa que traduce la única fuente lógica que ve TeX a glifos reales y operaciones tipográficas de bajo nivel. En palabras de la TeX FAQ, las fuentes virtuales son «a means of collecting bits and pieces together to make the glyphs of a font», y esas piezas vienen de otras fuentes, filetes y comandos de composición con posicionamiento. Suena abstracto hasta que abres una. Destripa el Times codificado en T1 (ptmr8t) con vftovp y la ranura de la ligadura ff dice: pon una f, retrocede 0,025 em, pon otra f. El Times crudo no tiene glifo ff, así que la fuente virtual lo construye sobre la marcha.
$ vftovp $(kpsewhich ptmr8t.vf) $(kpsewhich ptmr8t.tfm) ptmr8t.vpl
$ head -5 ptmr8t.vpl
(VTITLE )
(FAMILY UNSPECIFIED)
(CODINGSCHEME EXTENDED TEX FONT ENCODING - LATIN)
(DESIGNSIZE R 10.0)
(MAPFONT D 0 (FONTNAME ptmr8r) ...)
# slot O 33 (octal) is the ff ligature of T1 - assembled from two f glyphs
(CHARACTER O 33
(CHARWD R 0.640991)
(CHARHT R 0.677991)
(MAP
(SETCHAR C f)
(MOVERIGHT R -0.025)
(SETCHAR C f)
)
)El mecanismo reparte el trabajo. TeX solo necesita las dimensiones —ancho, alto, profundidad— que lee del archivo compañero .tfm (TeX Font Metric). Cómo se dibuja realmente cada glifo vive en el .vf, y lo lee el controlador DVI (dvips, dvipdfmx). Una fuente virtual es, por tanto, siempre una pareja: un .tfm más un .vf. Los binarios son ilegibles, así que toda distribución trae dos programas que convierten hacia y desde el formato legible .vpl (Virtual Property List). Las métricas simples tienen la misma disposición con el formato .pl (Property List): ábrelo con tftopl y podrás leer los siete parámetros de FONTDIMEN y la LIGTABLE de ligaduras y kernings.
vftovp—.vf+.tfm(binario) →.vpl(texto). Orden de argumentos: fuente virtual, métrica, salida. Es el que sirve para desmontar una fuente virtual existente.vptovf—.vpl(texto) →.vf+.tfm(binario). Orden de argumentos: descripción, fuente virtual, métrica. Recompila una descripción editada.tftopl/pltotf— la misma ida y vuelta para una métrica occidental simple. Úsalos para leer lo que hay dentro de un.tfm(FONTDIMEN,LIGTABLE).ppltotf/ptftopl— los equivalentes japoneses del par anterior, para los JFM binarios de la familia pTeX.- En todos ellos se puede omitir la extensión;
.vf,.tfmy.vplse añaden solos.
Coloca el .tfm resultante bajo .../fonts/tfm/<supplier>/ y el .vf bajo .../fonts/vf/<supplier>/ en el árbol texmf, refresca la base de nombres con mktexlsr y kpsewhich ptmr8t.vf los encontrará. Las tablas que emparejan un nombre de TFM con el archivo de fuente real —los font maps— las gestiona updmap. En la práctica actual, sin embargo, nadie escribe un .vpl a mano: generar métricas de TeX y fuentes virtuales a partir de fuentes PostScript u OpenType es tarea de fontinst. Una fuente virtual no es tanto algo que se escriba desde cero como algo que se abre, se lee y se retoca después de que una herramienta la produzca.
Por qué los nombres de fuente de TeX parecen claves — texdoc fontname
La respuesta es que solo había ocho caracteres disponibles. El esquema Fontname, que abre texdoc fontname, no oculta el motivo: declara sin rodeos que los nombres se limitan a ocho caracteres por compatibilidad con los sistemas de archivos DOS y con ISO 9660, la norma usada para la distribución en CD-ROM. Los caracteres admitidos son minúsculas a–z, dígitos y el guion bajo. Esos ocho se reparten como S TT W [V...] [N] [E] [DD] —proveedor, tipo, peso, variantes, codificación, anchura, tamaño de diseño— y ese es todo el esquema.
| Parte de phvbc8t | Posición en el esquema | Significado |
|---|---|---|
p | proveedor (S) | Adobe — la nota de supplier.map dice «p de PostScript» |
hv | tipo (TT) | Helvetica (hv helvetic en typeface.map) |
b | peso (W) | negrita (weight.map tiene b Bold) |
c | anchura (E) | condensada — del lado de NFSS se fusiona con b en bc |
8t | codificación (N) | variant.map dice 8t ECEncoding CorkEncoding, es decir T1 |
Lee esa tabla una vez y los nombres de tus archivos .fd y del registro empiezan de pronto a hablar. ptmr8t es el Times regular de Adobe en T1; pcrr8t, el Courier regular en T1; ptmb8c, el Times negrita en TS1 (8c es Text Companion). 7t significa «TeX text encoding», o sea OT1, y 8r es TeX Base 1, la codificación que recibe un Type 1 crudo: la fuente real sobre la que se apoya una fuente virtual T1. Es justo lo que vimos en la sección anterior, donde ptmr8t.vf llevaba ptmr8r en su MAPFONT. Fontname, por cierto, admite que ocho caracteres se quedan cortos y dedica una sección aparte a los nombres largos.
Métricas japonesas: el JFM y sus clases de caracteres
La composición japonesa necesita algo que un .tfm occidental no puede dar. Kanji y kana se sitúan por defecto en una caja cuadrada (de ancho completo), y el espacio entre ellos no es espacio entre palabras: los huecos se abren y cierran solo alrededor de la puntuación, paréntesis y signos de cierre. La estructura que lo contiene es el JFM (Japanese Font Metric). pTeX y upTeX usan un JFM binario parecido a un .tfm; LuaTeX-ja expresa la misma función como una tabla Lua. El primero se convierte a texto y desde texto con ppltotf y ptftopl; la segunda ya es texto y se lee sin más.
La diferencia principal con un TFM occidental es que un JFM agrupa los caracteres en «character classes». Como especifica el manual de LuaTeX-ja, todas las longitudes de un JFM son números en coma flotante en unidades de tamaño de diseño, ancladas a zw (el ancho completo) y zh (el alto completo, height + depth); cada clase lleva luego sus propios width, height, depth e italic (corrección itálica). La clase 0 siempre existe y contiene la gran mayoría de caracteres japoneses, los que no pertenecen a ninguna otra. La puntuación va en clases aparte, y una tabla del glue o kern que se inserta entre una clase y otra produce el espaciado alrededor de signos y paréntesis.
-- A LuaTeX-ja JFM (excerpt); all lengths are in design-size units
luatexja.jfont.define_jfm {
version = 3,
dir = 'yoko', -- horizontal writing
zw = 1.0, zh = 1.0, -- full width, full height
[0] = { -- class 0: most kanji and kana
chars = { '漢' },
width = 1.0, height = 0.88, depth = 0.12, italic = 0.0,
},
[1] = { -- a class for stops and commas
chars = { '。', '、' },
width = 0.5, height = 0.88, depth = 0.12, italic = 0.0,
},
}En la familia pTeX, JAglue —el espacio insertado entre dos caracteres japoneses y entre un carácter japonés y texto occidental— se añade automáticamente al componer. El JFM fija el hueco entre clases; entre caracteres japoneses sin clase se aplica el kanjiskip por defecto, y en una frontera japonés/occidental, xkanjiskip. Junto con el kinsoku, las reglas que impiden ciertos caracteres al inicio o al final de línea, sostienen el aspecto de la composición japonesa. LuaTeX-ja incluye JFM estándar para distintas necesidades: jfm-ujis.lua es el predeterminado, basado en upnmlminr-h.tfm, una métrica usada en upTeX (la mayoría de caracteres cuadrados); jfm-jis.lua corresponde a jis.tfm, muy usado en pTeX; jfm-min.lua corresponde al min10.tfm por defecto de pTeX. En una definición de fuente se elige uno con jfm=, como en \jfont\F=HaranoAjiMincho-Regular:jfm=ujis.