CV y cartas

El currículum es uno de los poquísimos documentos cuyo lector juzga la tipografía antes de leer una sola línea del contenido. Y sin embargo, la razón para componerlo en LaTeX no es que quede bonito: es que el CV del año pasado sigue compilando este año y que cada ajuste hecho para una empresa queda registrado como un diff de git. Este es además el rincón de LaTeX donde los consejos que circulan por la red han envejecido peor: varias clases citadas rutinariamente como «la opción estándar» no están en TeX Live 2024 en absoluto, y una de las que sí están lanza un error en su primera compilación. Esta página enumera solo lo que funciona de verdad en TeX Live 2024, comprobado con kpsewhich y compilando. La segunda mitad trata de las cartas: la clase estándar letter, scrlttr2 de KOMA-Script y la práctica epistolar japonesa.

Qué clases de CV trae TeX Live 2024 (y cuáles no)

Respuesta breve: moderncv, europecv, europasscv, currvita, komacv y limecv están en TeX Live 2024, pero altacv y awesome-cv —los dos nombres que más repiten las entradas de blog y las reseñas de plantillas de Overleaf— no lo están. En local, \documentclass{altacv} se detiene con ! LaTeX Error: File 'altacv.cls' not found. (el mensaje es idéntico para awesome-cv). Ambos se distribuyen desde GitHub y la galería de plantillas de Overleaf, no desde CTAN, así que usarlos implica clonar el repositorio y dejar el .cls junto al propio documento. Es la primera trampa con la que topa quien intenta recompilar en su máquina un CV hecho en Overleaf. Ejecute kpsewhich altacv.cls: si no imprime nada, no está instalado.

Clase / paqueteEn TeX Live 2024Qué aporta
moderncvsí (v2.3.1)cinco estilos, siete colores, CV y carta de presentación en una sola clase
europecvsí (requiere un rodeo)el formato Europass de la UE; etiquetas para 29 idiomas
europasscvla revisión Europass de 2013; su README indica que los formatos de 2020 no están implementados
currvitaun paquete, no una clase: añade los entornos cv y cvlist sobre article
komacvsí (v1.1.2)el aspecto de moderncv reconstruido sobre KOMA-Script
limecvsí (v0.1.12)diseño moderno con barra lateral: la respuesta a altacv más cercana dentro de la distribución
altacvnose distribuye por GitHub / Overleaf; kpsewhich altacv.cls no devuelve nada
awesome-cvnoigual; aparece ! LaTeX Error: File 'awesome-cv.cls' not found.

Cómo usar moderncv: \moderncvstyle y \cventry

moderncv se apoya en una sola idea: decidir la apariencia en dos líneas y luego escribir únicamente estructura. \moderncvstyle{...} elige una de cinco maquetas (casual [predeterminada], classic, banking, oldstyle, fancy) y \moderncvcolor{...} uno de siete colores (blue, black, burgundy, green, grey, orange, purple, red). Compilar los cinco estilos con pdfLaTeX contra la v2.3.1 que trae TeX Live 2024 no produjo ningún error. El caballo de batalla es \cventry{years}{title}{institution}{location}{grade}{description}, seis argumentos en los que un {} vacío hace que esa columna desaparezca. Las entradas de una línea usan \cvitem{header}{text}, dos en paralelo \cvdoubleitem, y las viñetas \cvlistitem. La estructura es el documento; el estilo solo es una piel encima — por eso cambiar casual por banking para otra empresa no altera un solo carácter del contenido.

latex
\documentclass[11pt,a4paper,sans]{moderncv}
\moderncvstyle{casual}   % casual | classic | banking | oldstyle | fancy
\moderncvcolor{blue}
\usepackage[scale=0.75]{geometry}

\name{Taro}{Yamada}
\title{Software Engineer}
\address{1-1 Chiyoda}{Tokyo}{Japan}
\phone[mobile]{+81~90~0000~0000}
\email{[email protected]}

\begin{document}
\makecvtitle

\section{Experience}
% {years}{title}{institution}{location}{grade}{description}
\cventry{2020--2024}{Engineer}{ABC Inc.}{Tokyo}{}{Web development.}
\cvitem{Skills}{LaTeX, C, Python}
\end{document}

¿Está abandonado moderncv? Su propio README responde

«Abandonado» solo es cierto a medias, y el README.md que viene dentro de TeX Live 2024 dice a qué mitad: esta distribución es un fork cuyo objetivo es mantener moderncv vivo dentro de CTAN, porque el proyecto original está muerto desde 2016. El autor original es Xavier Danaux; la entrada del CHANGELOG para la v2.1.0 (21 de enero de 2021) anota «maintainer change: now team maintained», y ahí empieza el rescate voluntario. TeX Live 2024 incluye la v2.3.1, con fecha 21 de febrero de 2022. La descripción exacta no es «muerto» sino «huérfano en 2016 y adoptado en 2021», y compila sin errores en TeX Live 2024. Los servicios \social añadidos y el paso a fontawesome5 también son obra de ese equipo.

Eso sí, conserva las marcas de un paquete rescatado. moderncv no tiene manual: el README.md avisa con franqueza de que «hasta que se escriba un manual decente» conviene leer template.tex (el moderncv_userguide.pdf incluido sigue fechado en enero de 2021). Y el directorio de documentación contiene tal cual un archivo llamado KNOWN_BUGS, que enumera cosas como el espacio sobrante alrededor de la bibliografía en el estilo fancy, el lonely \item--perhaps a missing list environment que aparece con bibentry, y la interacción entre CJK y fancyhdr. Si el CV va a llevar una lista de publicaciones, leer ese único archivo antes de decidirse por la clase es la investigación más barata que hará. texdoc -l moderncv indica dónde está.

Cómo arreglar el Sorting rule for 'begindocument' hook applied too late. de europecv

El arreglo cabe en una línea: cargar \usepackage{hyperref} (o bookmark) uno mismo en el preámbulo y el error desaparece. La causa está en la clase. europecv.cls carga hyperref desde dentro de \AtBeginDocument{...\RequirePackage{hyperref}...}, es decir, mientras \begin{document} ya se está ejecutando. El nameref.sty que arrastra hyperref ejecuta \DeclareHookRule{begindocument}{showkeys}{before}{nameref}, pero para entonces el gancho begindocument ya ha arrancado, así que el núcleo de LaTeX lanza ! LaTeX hooks Error: Sorting rule for 'begindocument' hook applied too late. Cargar hyperref antes por cuenta propia hace que nameref llegue cuando su regla de gancho todavía cuenta.

latex
% europecv on TeX Live 2024: the class loads hyperref inside \AtBeginDocument,
% so nameref's hook rule arrives too late. Load hyperref yourself first.
\documentclass[a4paper,helvetica]{europecv}
\usepackage{graphicx}   % europecv calls \includegraphics but does not load it
\usepackage{hyperref}   % <- this line removes the "hook applied too late" error
\ecvname{Yamada, Taro}
\ecvemail{[email protected]}
\begin{document}
\begin{europecv}
  \ecvpersonalinfo
  \ecvsection{Work experience}
  \ecvitem{2020--2024}{Engineer, ABC Inc., Tokyo}
\end{europecv}
\end{document}

Que se trate de un defecto de la clase y no de un error de principiante puede comprobarse con el ejemplo que la propia europecv distribuye: pase doc/latex/europecv/examples/minimal.tex —el archivo mínimo oficial— por pdfLaTeX y obtendrá el mismo error. En cambio templates/cv_template_en.tex compila limpiamente, y la única diferencia pertinente es que allí figura \usepackage{bookmark}, que arrastra hyperref primero. Además, europecv.cls llama a \includegraphics sin cargar graphicx por su cuenta, así que con el logotipo y la bandera activados aparece también ! Undefined control sequence. \draweuropasslogo. Añada \usepackage{graphicx} o pase la opción de clase nologo.

Sobre el formato Europass en sí, conviene no confundir las dos clases de nombre parecido. europecv implementa el linaje del formato europeo común lanzado en 2002 e incluye archivos de etiquetas para 29 idiomas, de ecvbg.def a ecvsv.def. europasscv implementa la maqueta de la revisión de 2013, y su README sigue llevando la advertencia de que «por el momento esta clase no implementa los formatos europass más recientes, lanzados en 2020». La UE revisa su plantilla, así que cuando una convocatoria pide «un CV en formato Europass», el primer paso práctico es averiguar a qué edición se refiere.

La clase estándar letter: varios destinatarios desde un solo archivo

La verdadera ventaja de la clase letter es que se obtienen tantas cartas como entornos letter se escriban. El remitente (\address) y la firma (\signature) se escriben una sola vez en el preámbulo; después basta apilar bloques \begin{letter}{destinatario} para que cada uno produzca su propia carta, en su propia página, del mismo remitente. Diez cartas de recomendación, o el mismo aviso a treinta empresas, salen de un único archivo. Dentro solo hay tres partes: \opening{saludo}, el cuerpo y \closing{despedida}. La fecha la inserta \today automáticamente; \encl{...} se imprime como encl:, \cc{...} como cc:, y \ps{...} coloca una posdata bajo la firma. Dos cartas dentro, dos páginas fuera: eso se comprueba compilando.

latex
\documentclass[11pt]{letter}
\address{Taro Yamada\\1-1 Chiyoda\\Tokyo 100-0001}
\signature{Taro Yamada}
\begin{document}

\begin{letter}{Hiring Manager\\ABC Inc.\\Osaka}
  \opening{Dear Hiring Manager,}
  I am writing to apply for the position.
  \closing{Sincerely,}
  \encl{CV, transcript}   % prints as "encl:"
  \cc{Personnel}          % prints as "cc:"
  \ps{P.S. Available from April.}
\end{letter}

% a second letter, same sender, second page
\begin{letter}{Second Recipient\\XYZ Ltd.}
  \opening{Dear Sir or Madam,}
  A second letter from the same source file.
  \closing{Yours faithfully,}
\end{letter}

\end{document}

scrlttr2 y scrletter: marcas de plegado y sobres con ventana

Lo que separa decisivamente a scrlttr2 de la clase letter simple es que también se ocupa de doblar la hoja y meterla en el sobre. Imprime finos filetes en los puntos de plegado (foldmarks) y coloca el bloque de dirección para que asome por la ventana. Todo ese ajuste está extraído a archivos .lco —letter class options— que se cargan con \LoadLetterOption{DIN}. KOMA-Script incluye DIN, DIN5008A, DIN5008B, DINmtext, NF (Francia), SN y SNleft (Suiza), UScommercial9 y UScommercial9DW, además de visualize, que imprime la geometría para verla. Todo se configura con variables de la forma \setkomavar{fromname}{...}, de modo que valores y presentación quedan del todo separados. Reeditar la misma carta para otra norma de sobre cambia exactamente una línea: el \LoadLetterOption.

La otra cosa que conviene conocer es scrletter: no es una clase sino un paquete, y permite colocar un entorno letter en medio de un documento scrartcl o scrbook. Una carta de acompañamiento anexa a un informe, o una nota al final de un contrato, ya no tiene que convertirse en un segundo documento. De hecho, un archivo con \documentclass{scrartcl} más \usepackage{scrletter}, con un \begin{letter}{...} justo después de un \section{...}, compila tal cual. scrlttr2 y scrletter usan las mismas variables y los mismos .lco, así que no hay nada que reaprender.

latex
\documentclass[fontsize=11pt,foldmarks=true,parskip=half]{scrlttr2}
\LoadLetterOption{DIN}          % or NipponEL, KakuLL, UScommercial9, SN, NF ...
\setkomavar{fromname}{Taro Yamada}
\setkomavar{fromaddress}{1-1 Chiyoda\\Tokyo 100-0001}
\setkomavar{signature}{Taro Yamada}
\setkomavar{subject}{Application for the advertised position}
\setkomavar{place}{Tokyo}
\begin{document}
\begin{letter}{Hiring Manager\\ABC Inc.\\Osaka}
  \opening{Dear Hiring Manager,}
  I am writing to apply for the position.
  \closing{Sincerely,}
  \encl{CV\\Transcript}
\end{letter}
\end{document}

¿Hay una clase de carta japonesa? \挨拶 y los .lco de sobres Nippon

En TeX Live 2024 no existe una clase de carta japonesa dedicada. Buscar *letter*.cls devuelve scrlttr2, g-brief, dinbrief, akletter y otras clases occidentales, pero nada para correspondencia japonesa. Hay, con todo, dos respuestas prácticas. La primera atañe al sobre: KOMA-Script incluye archivos .lco cortados para sobres japonesesNipponEL, NipponEH, NipponLL, NipponLH y NipponRL cubren los formatos Chou y You 3 y 4, y KakuLL el Kaku A4 (ventanas de 90×45 mm o 90×55 mm). El soporte existe desde KOMA-Script 2.97e, y un capítulo del apéndice del manual, escrito por Gernot Hassenpflug, lo explica hasta la diferencia entre los papeles de las series A y B del JIS.

Archivo .lcoSobreTamaño de ventana
DINsobres DIN europeos (el punto de partida habitual)
NipponELChou / You tamaños 3 y 490 × 45 mm
NipponEHlos mismos, con ventana más alta90 × 55 mm
NipponRLChou / You con la ventana a la derecha90 × 45 mm
KakuLLKaku A490 × 45 mm
visualizeno es una norma de sobre: imprime la geometría para comprobarla

La otra respuesta está en cómo arranca la carta. okumacro.sty —la colección de macros de Haruhiko Okumura, distribuida con jsclasses en TeX Live— define una orden cuyo nombre está escrito en japonés, \挨拶 («saludo»): escribirla sola produce 拝啓 seguido de la fórmula estacional que corresponde al mes en curso. La implementación es un llano \ifcase\month de doce ramas: desde enero, 厳寒, 春寒, 早春, 陽春, 新緑, 向暑, 猛暑, 残暑, 初秋, 仲秋, 晩秋, 初冬, cerrado por の候,ますますご清栄のこととお喜び申し上げます。 Compilado en agosto con upLaTeX imprime efectivamente 拝啓 残暑の候,ますますご清栄のこととお喜び申し上げます。 Que una secuencia de control pueda escribirse en japonés es una peculiaridad de la familia pTeX, prueba de que aquí el japonés se trata como lengua y no como simples datos de caracteres.

latex
% Japanese letter opening: okumacro defines a Japanese-named command that
% emits the salutation plus the seasonal formula for the current \month.
% Build with:  uplatex jl.tex && dvipdfmx jl.dvi
\documentclass[uplatex,a4paper]{jsarticle}
\usepackage{okumacro}
\begin{document}
\挨拶

このたびは大変お世話になりました。

\hfill 敬具
\end{document}

En la práctica: cuál elegir y qué guardar en git

La elección suele venir dictada por los requisitos de presentación. Si se exige Europass, será europecv o europasscv (tras averiguar qué edición se pide). Si necesita un rirekisho japonés con sus recuadros al estilo JIS, conviene construirlo con tabular antes que con una clase de CV: todas las clases de CV presuponen el currículum occidental en forma de lista y encajan mal en un formulario con casillas de nombre, fotografía y sello. Para un CV corriente en inglés, moderncv; para un aspecto de dos columnas más actual, limecv; si ya vive dentro de KOMA-Script, komacv. Y elija lo que elija, no olvide escribir la carta de presentación en la misma clase. moderncv ofrece \recipient, \opening, \makelettertitle, \makeletterclosing y \enclosure, de modo que títulos, tipografía y color coinciden en ambos documentos. Dos hojas hechas con dos plantillas distintas suelen delatarse en cuanto se ponen una al lado de la otra.

  • Guarde las diferencias por empresa en archivos separados, no en ramas: un cv-body.tex común que cada cv-empresa-a.tex se limite a \input deja un único sitio que actualizar.
  • Incluya la clase y la plantilla en el repositorio. Lo que no está en la distribución —altacv, por ejemplo— es justo lo que hará tropezar a su yo de dentro de tres años.
  • Use un nombre de salida explícito en lugar del \jobname de turno. Un adjunto llamado main.pdf se pierde en la carpeta de descargas del destinatario.
  • Revise los metadatos del PDF. El nombre de autor y el título que muestra pdfinfo viajan con el archivo hasta la empresa.
  • Pruebe una carta japonesa hasta imprimirla y doblarla. Si va en sobre con ventana, la opción visualize de scrlttr2 imprime la geometría para que la compruebe.

Por último, dónde gana LaTeX de verdad aquí. Un CV es un documento de diseño y, por pura apariencia, no vencerá a InDesign ni a una plantilla de Canva. La ventaja de LaTeX está en otro sitio: un .tex de hace cinco años sigue produciendo hoy el mismo PDF, la reescritura hecha para cada empresa se lee como un git diff, y una lista de publicaciones puede generarse desde un .bib. Dicho de otro modo, permite tratar el CV como un activo que se mantiene y no como una pieza que se hace una vez. Justamente por eso, al elegir una clase lo primero que hay que comprobar no es su aspecto sino si seguirá compilando dentro de tres años: existencia con kpsewhich, salud con una compilación real, en ese orden.