Lo que de verdad decide cómo envejece una instalación de LaTeX no es memorizar la lista de opciones de tlmgr, sino saber dónde poner un archivo. Imprima la ruta de búsqueda TEXMF y verá una marca !! delante de unos árboles y no de otros. Significa «no recorras el disco; consulta solo la base ls-R», y esos dos caracteres deciden si un archivo colocado a mano se encuentra al instante o permanece invisible hasta que se ejecuta mktexlsr. Esta página cubre cómo añadir y actualizar paquetes con tlmgr, el reparto entre el árbol personal TEXMFHOME y el árbol del sistema TEXMFLOCAL, la instalación manual desde CTAN y la gestión de los mapas de fuentes (updmap), con los valores medidos en una instalación real de TeX Live 2024.
Añadir un paquete: cómo funciona tlmgr install
La forma estándar de añadir un paquete de LaTeX cabe en una línea, tlmgr install <nombre>, y sus dependencias llegan por defecto. Se pueden nombrar paquetes uno a uno o traer una colección entera como collection-fontsrecommended. Instalar en un árbol del sistema exige permisos de administrador (sudo tlmgr install … en Unix, un shell elevado en Windows). Añada --no-depends cuando no quiera las dependencias, y --reinstall cuando quiera sobrescribir archivos que se han estropeado.
# Install a package; dependencies come along by default
tlmgr install siunitx
tlmgr install collection-fontsrecommended
# Skip dependencies, or overwrite a broken install
tlmgr install --no-depends siunitx
tlmgr install --reinstall siunitx
# A system-wide tree needs admin rights
sudo tlmgr install siunitxLo que más importa en la práctica es el camino que va del mensaje de error al nombre del paquete. Ante un LaTeX Error: File siunitx.sty not found, dejar caer en la carpeta del manuscrito un .sty encontrado en un buscador es la peor jugada posible. Separe el nombre de archivo del nombre de paquete: el archivo es siunitx.sty, el paquete es siunitx —normalmente coinciden, pero a menudo no: tikz.sty vive en el paquete pgf—. tlmgr search --global --file responde a «qué paquete trae este archivo», y ese es el puente. Si solo recuerda el nombre a medias, tlmgr search --global <palabra>; si quiere saber qué es un paquete, tlmgr info <nombre> imprime descripción, licencia, tamaño y lista de archivos.
# From "File siunitx.sty not found" to an installed package
kpsewhich siunitx.sty # is it already here?
tlmgr search --global --file siunitx.sty # which package ships it?
tlmgr install siunitx # install it properly
# Half-remembered name, or curious about a package
tlmgr search --global siunit
tlmgr info siunitxUn comportamiento fácil de pasar por alto: ni tlmgr install ni tlmgr remove refrescan los enlaces simbólicos de directorios del sistema como /usr/local/bin. Si su PATH apunta directamente al directorio bin de TeX Live, esto nunca importa; pero si usa tlmgr path add para tender enlaces de ejecutables, páginas man y páginas info, tendrá que volver a ejecutar tlmgr path add usted mismo tras instalar un paquete que traiga un ejecutable nuevo (y tlmgr path remove tras retirar uno). Si la línea de comandos no es lo suyo, TeX Live incluye además tlshell, una interfaz Tcl/Tk que busca, instala, elimina, actualiza en bloque y cambia de repositorio desde una ventana, y que muestra el registro de los comandos subyacentes, lo que la convierte en una entrada suave a tlmgr.
Actualizar: --self y --all van juntos
El gesto estándar cabe en una línea, tlmgr update --self --all: --self pone al día tlmgr mismo —la infraestructura— y --all todo lo demás. El orden no es cuestión de gusto. El manual de tlmgr dice de --all que actualiza todos los paquetes instalados salvo tlmgr mismo, y que si hay actualizaciones para tlmgr, esto da un error a menos que se pase también --force o --self. Un tlmgr desfasado se detiene e insiste en reemplazarse primero. Déle ambas opciones y hará exactamente eso: se actualiza y, si lo consigue, se reinicia bajo la nueva versión para terminar el resto.
# The standard move: infrastructure first, then everything else
tlmgr update --self --all
# See what would change before committing to it
tlmgr update --list
# Update one package only
tlmgr update siunitxConviene saber qué más hace esa actualización. Los paquetes retirados de una colección en el servidor se desinstalan automáticamente, y los recién añadidos a una colección que usted tiene se instalan automáticamente; --list muestra ambos antes de comprometerse. De dónde se descarga lo fija el ajuste de repositorio, por defecto la redirección automática de espejos de CTAN. Si la conexión es lenta o quiere fijar un espejo, cambie de forma permanente con tlmgr option repository; para usar otro espejo solo en una ejecución, añada --repository <url>. Valores por defecto como el tamaño de papel también viven en tlmgr: tlmgr paper a4 pone A4 en todas las herramientas de golpe (o por programa, tlmgr dvips paper a4). tlmgr option show imprime la configuración actual de una vez.
# Where tlmgr fetches from, and other stored defaults
tlmgr option repository ctan # automatic CTAN mirror redirection
tlmgr option repository https://example.org/CTAN/systems/texlive/tlnet
tlmgr option show
# Use a different mirror for one run only
tlmgr install --repository https://example.org/CTAN/systems/texlive/tlnet siunitx
# Paper size defaults are stored here too
tlmgr paper a4
tlmgr dvips paper a4TEXMFHOME frente a TEXMFLOCAL
Los archivos que tlmgr no gestiona —la clase de un congreso, un estilo escrito por usted, un paquete bajado a mano de CTAN— van a uno de dos sitios: TEXMFHOME solo para usted, TEXMFLOCAL para toda la máquina. Ambos se buscan antes del árbol propio de la distribución (TEXMFDIST), de modo que un archivo homónimo colocado ahí gana. Las rutas reales varían, así que imprímalas en lugar de suponerlas. En este Mac, kpsewhich -var-value=TEXMFHOME devuelve /Users/wedd/Library/texmf, no ~/texmf. En Linux el valor por defecto sí es ~/texmf, y por eso seguir al pie de la letra unas instrucciones de Linux en un Mac deja el archivo invisible para siempre. Aquí TEXMFLOCAL vale /usr/local/texlive/texmf-local, y lo llamativo es que queda fuera del directorio del año: lo que se deposite allí sobrevive al salto a la cosecha siguiente.
# Never guess these paths - print them
kpsewhich -var-value=TEXMFHOME # your own tree (differs on macOS and Linux)
kpsewhich -var-value=TEXMFLOCAL # machine-wide tree, outside the year directory
kpsewhich -var-value=TEXMFDIST # the distribution itself - do not edit by hand
# The whole search order, including the !! markers
kpsewhich -expand-path='$TEXMF'Elegir entre ambos es sencillo: los archivos para sus propios manuscritos van a TEXMFHOME; lo que todo el mundo deba tener en una máquina compartida va a TEXMFLOCAL. TEXMFHOME no exige permisos de administrador y viaja con su directorio personal si reinstala el sistema. Dentro, siga la misma disposición que usa la distribución (la TDS): un estilo de LaTeX va bajo tex/latex/. El panorama completo de esa disposición pertenece a «Estructura y rutas del directorio TeX»; en la práctica, la jerarquía del ejemplo de abajo cubre casi todo. Una advertencia: no deje una copia vieja de un .sty en la carpeta del manuscrito. TeX busca primero el directorio actual, así que la copia rancia sigue ganando incluso después de que tlmgr actualice la buena, y eso produce un fallo dificilísimo de diagnosticar.
# A personal class file, in the tree that belongs to you
HOME_TREE="$(kpsewhich -var-value=TEXMFHOME)"
mkdir -p "$HOME_TREE/tex/latex/local"
cp mythesis.cls "$HOME_TREE/tex/latex/local/"
kpsewhich mythesis.cls # should print the path immediately
# Let tlmgr manage that tree too, with no root required
tlmgr init-usertree
tlmgr --usermode install siunitxCuándo hacen falta de verdad mktexlsr y texhash
La respuesta es limpia: hace falta cuando ha colocado un archivo a mano en TEXMFLOCAL o en un árbol del sistema, y no hace falta cuando lo ha puesto en TEXMFHOME. La razón es el !! del principio. Expanda TEXMF en esta máquina y encontrará !! delante de /usr/local/texlive/texmf-local y de texmf-dist, pero no delante de ~/Library/texmf. !! le dice a kpathsea: «para este árbol no mires el disco; fíate solo de la base ls-R». Así que mientras no se regenere ls-R, un archivo nuevo es como si no existiera. Lo corrobora que TEXMFDBS, la lista de árboles que llevan ls-R, no incluye TEXMFHOME en absoluto. Y el índice se gana el sueldo: texmf-dist/ls-R tiene aquí 276.953 líneas, y por eso TeX no necesita recorrer más de 220.000 archivos en cada pasada.
El comando que reconstruye el índice es mktexlsr, que regenera ls-R en cada árbol listado en TEXMFDBS. texhash no es otro comando: comprobado en esta máquina, texhash es un enlace simbólico a mktexlsr, es decir, literalmente el mismo programa con dos nombres. Cualquiera de los dos sirve. Como escribe en árboles del sistema, necesita sudo. Nótese además que tlmgr y getnonfreefonts se encargan solos del refresco, así que en la práctica el único momento en que se teclea es después de copiar archivos a mano.
# The same file in the system tree DOES need the index rebuilt
LOCAL_TREE="$(kpsewhich -var-value=TEXMFLOCAL)"
sudo mkdir -p "$LOCAL_TREE/tex/latex/local"
sudo cp mythesis.cls "$LOCAL_TREE/tex/latex/local/"
sudo mktexlsr # texhash is a symlink to this same program
kpsewhich mythesis.cls # now it resolves
kpsewhich -all mythesis.cls # and shows every copy, if several collideInstalar a mano desde CTAN: .dtx e .ins
Solo se hace a mano con lo que tlmgr no tiene: una clase que la propia revista distribuye, un paquete publicado la semana pasada, una versión que solo existe en la web del autor. Algunos paquetes de CTAN traen un .sty a secas, pero muchos llegan por pares: .dtx, que reúne el código fuente y su documentación, e .ins, el archivo de instrucciones que lo extrae. Ejecute tex foo.ins y generará foo.sty a partir del .dtx; luego cópielo al lugar adecuado bajo TEXMFHOME. El formato .dtx es programación literaria en estado puro: ejecute pdflatex foo.dtx y obtendrá un manual en PDF con el código fuente comentado dentro.
# A package that ships as .dtx + .ins: extract, then place
tex foo.ins # writes foo.sty (and foo.cls, if any)
pdflatex foo.dtx # optional: build the annotated manual
HOME_TREE="$(kpsewhich -var-value=TEXMFHOME)"
mkdir -p "$HOME_TREE/tex/latex/foo"
cp foo.sty "$HOME_TREE/tex/latex/foo/"
kpsewhich foo.styEn MiKTeX: mpm y la instalación automática
MiKTeX no tiene tlmgr. Su línea de comandos es mpm (el MiKTeX Package Manager) y su interfaz gráfica la MiKTeX Console, y por ahí pasan tanto las actualizaciones como las incorporaciones de paquetes. La diferencia principal es la instalación al vuelo: un paquete que el documento pide y usted no tiene se descarga a mitad de ejecución y la compilación sigue (la Console permite elegir: instalar siempre, preguntar cada vez o nunca). Esa automatización tiene una condición: aunque MiKTeX se haya instalado para todos los usuarios, los paquetes traídos al vuelo aterrizan en el AppData\Roaming del usuario que ejecuta. En una máquina compartida conviene instalar de antemano lo necesario en modo administrador.
Gestionar los mapas de fuentes: updmap y getnonfreefonts
Un mapa de fuentes es una tabla línea a línea que dice: «la fuente que TeX llama con este nombre es en realidad ese archivo, y así se incrusta en el PDF». Existen pdftex.map para pdftex y dvipdfmx, psfonts.map para dvips, kanjix.map para el japonés y otros. Nunca se escriben a mano: los genera updmap. Para hacerse una idea de la escala, cuente las líneas: pdftex.map tiene aquí 45.443 líneas. Instalar un paquete de fuentes y dejar que updmap se ejecute es lo que actualiza esa tabla, y solo entonces puede incrustarse la fuente en un PDF.
updmap tiene dos caras —updmap-sys para todo el sistema y updmap-user solo para usted— y ahí se esconde la trampa más dolorosa de la configuración de TeX Live. El propio updmap --help avisa: una vez ejecutado updmap-user, aunque sea una sola vez, ejecutar updmap-sys deja de tener efecto alguno. Se crea un archivo de configuración personal que a partir de entonces tapa al del sistema. updmap-sys sí emite un aviso cuando esto ocurre, pero si no se conoce la causa uno puede pasar mucho tiempo preguntándose por qué ejecutarlo como administrador no cambia nada. La regla segura es usar solo updmap-sys y no tocar nunca updmap-user.
La incrustación de fuentes japonesas, chinas y coreanas tiene su propia puerta de entrada: kanji-config-updmap-sys. Llama a updmap por debajo y cambia qué familia de fuentes CJK se incrusta en los PDF. Pásele status y le informará del estado actual: en esta máquina la familia japonesa actual es haranoaji, con haranoaji, ipa e ipaex como familias a las que puede cambiar. Dicho de otro modo, las fuentes japonesas que vienen dentro de TeX Live son Harano Aji e IPA / IPAex, y Noto CJK y Source Han no están incluidas. Para usarlas hay que apuntar a las fuentes instaladas en el sistema operativo, o instalarlas aparte.
# Ask, without changing anything: which CJK family is embedded?
kanji-config-updmap-sys status
# Switch the embedded Japanese family, machine-wide
sudo kanji-config-updmap-sys haranoaji
# Rebuild the map files after a manual font install
sudo updmap-sys # never updmap-user: it permanently shadows updmap-sysPor último, las fuentes que no pueden viajar con la distribución. Una fuente con licencia de «uso libre, pero no venta» no puede empaquetarse dentro de TeX Live, que también se distribuye en un DVD que se vende. El script getnonfreefonts de TUG existe justo para eso: trae la fuente y sus archivos de apoyo para TeX desde CTAN y lo configura todo para que TeX las encuentre. La clave está en --user (hacia TEXMFHOME) frente a --sys (hacia el árbol del sistema). El comando aparte getnonfreefonts-sys que aparece en textos antiguos ya no existe: para todos los usuarios de la máquina, ejecute getnonfreefonts --sys … con permisos de administrador. --lsfonts enumera lo disponible.
# See what is on offer, then install into your own tree
getnonfreefonts --user --lsfonts
getnonfreefonts --user luximono
# Or system-wide, for everyone on the machine
sudo getnonfreefonts --sys luximono- Instale los paquetes de uso general con
tlmgr. Una copia rancia dejada en la carpeta del manuscrito sigue ganando tras una actualización y produce fallos que nadie sabe explicar. - Los archivos que solo pertenecen a una plantilla de congreso pueden vivir en el repositorio del manuscrito, porque forman parte de ese envío y no de la distribución.
- En máquinas compartidas y en CI, anote en el README o en el
.latexmkrcel año de TeX Live, los nombres de los paquetes añadidos y cualquier repositorio o etiqueta Docker fijados. «Lo instalé una vez en mi portátil» no es reproducibilidad. - No ejecute
tlmgr update --self --alljusto antes de una entrega. Estaría generando el PDF con paquetes distintos a los de ayer. Pruebe las actualizaciones otro día. - No use nunca
updmap-user. Basta con ejecutarlo una vez para queupdmap-sysdeje de surtir efecto, y después la causa es dificilísima de detectar.