履歴書・レター

履歴書・CV は、読み手が中身を読むより先に見た目で判断してしまう、ほとんど唯一の文書です。それでも LaTeX で書く理由は「きれいだから」ではありません——去年の履歴書が今年もそのままコンパイルでき、応募先ごとの差し替えが git の差分として残る、その一点にあります。ところがこの分野は、ネット上の助言がもっとも古びている場所でもあります。「定番」として名前の挙がるクラスのいくつかは TeX Live 2024 にそもそも入っておらず、入っていても最初のコンパイルでエラーを吐くものがあります。このページでは TeX Live 2024 で実際に動くものだけを、kpsewhich と実コンパイルで確かめながら並べます。後半は レター——標準の letter クラス、KOMA-Script の scrlttr2、そして日本語の手紙です。

TeX Live 2024 に入っている CV クラス、入っていないクラス

結論から言うと、moderncveuropecveuropasscvcurrvitakomacvlimecv は TeX Live 2024 に入っていますが、ブログ記事や Overleaf のテンプレート紹介でよく名前の挙がる altacvawesome-cv は入っていません。手元で \documentclass{altacv} と書くと ! LaTeX Error: File 'altacv.cls' not found. で止まります(awesome-cv も同文)。この二つは CTAN ではなく GitHub と Overleaf のテンプレート置き場で配られていて、使うにはリポジトリごと持ってきて .cls を自分の文書と同じディレクトリに置くしかありません。Overleaf で作った CV を手元で組み直そうとして最初に踏むのが、たいていこの罠です。まず kpsewhich altacv.cls を叩いて、何も返ってこなければ手元には無い、と判断してください。

クラス / パッケージTeX Live 2024何をくれるか
moderncvあり (v2.3.1)5 スタイル・7 色・CV とレターを同じクラスで
europecvあり(要回避策)EU の Europass 形式。29 言語のラベル定義を同梱
europasscvありEuropass の 2013 年改訂版。README が「2020 年版は未実装」と明記
currvitaありクラスではなくパッケージ。article の上に cvcvlist 環境を足す
komacvあり (v1.1.2)moderncv 風の外見を KOMA-Script の上に載せたもの
limecvあり (v0.1.12)サイドバー付きの現代的なレイアウト。altacv の代わりに近い
altacvなしGitHub / Overleaf 配布。kpsewhich altacv.cls は何も返さない
awesome-cvなし同上。! LaTeX Error: File 'awesome-cv.cls' not found. になる

moderncv の使い方——\moderncvstyle\cventry

moderncv の設計は「見た目を 2 行で決め、中身は構造だけ書く」というものです。\moderncvstyle{...} で 5 種類のレイアウト(casual〔既定〕・classicbankingoldstylefancy)を、\moderncvcolor{...} で 7 色(blueblackburgundygreengreyorangepurplered)を選びます。TeX Live 2024 同梱の v2.3.1 で 5 スタイルすべてを pdfLaTeX でコンパイルしたところ、いずれもエラーなしで通りました。本体は \cventry{年}{肩書き}{所属}{場所}{評価}{説明} の 6 引数で、要らない引数は空の {} にしておけば列ごと詰まります。一行で済む項目は \cvitem{見出し}{本文}、二段に並べたいなら \cvdoubleitem、箇条書きなら \cvlistitem です。この構造化が moderncv の本体で、スタイルはその上に載る皮——だから応募先に合わせて casualbanking に書き換えても、本文には一文字も触らずに済みます。

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}

moderncv は放棄されているのか——README が答えている

「放棄されている」というのは半分だけ正しい話です。TeX Live 2024 に同梱されている moderncv の README.md には、こう書かれています——この配布物は upstream が 2016 年から死んでいるため、CTAN の中で moderncv を維持することを目的としたフォークである、と。原作者は Xavier Danaux で、CHANGELOG の v2.1.0(2021 年 1 月 21 日)の項に「maintainer change: now team maintained」とあり、そこから有志チームによる引き取りが始まっています。同梱版は v2.3.1(2022 年 2 月 21 日)。つまり、原作者の手を離れて久しいけれども、拾い直されて CTAN に残っている、というのが正確な状態です。実際 TeX Live 2024 上ではエラーなしにコンパイルできますし、\social の追加サービスや fontawesome5 への移行もこのチームの仕事です。

ただし、拾い直されたパッケージにありがちな癖も残っています。moderncv にはマニュアルが無くREADME.md は「まともなマニュアルが書かれるまでは template.tex を見てほしい」と正直に断っています(同梱の moderncv_userguide.pdf は 2021 年 1 月の日付のまま)。そして doc ディレクトリには KNOWN_BUGS というファイルがそのまま置かれていてfancy スタイルでの参考文献まわりの余白、bibentry を使ったときの lonely \item--perhaps a missing list environment、CJK と fancyhdr の相性といった既知の不具合が列挙されています。CV に業績リストを載せる予定があるなら、クラスを決める前にこの 1 ファイルを読んでおくのが安上がりです。ファイルの場所は texdoc -l moderncv で分かります。

europecv が出す Sorting rule for 'begindocument' hook applied too late. の直し方

直し方は一行です——プリアンブルに \usepackage{hyperref}(または bookmark)を自分で書く。それだけで消えます。原因はクラス側にあり、europecv.cls\AtBeginDocument{...\RequirePackage{hyperref}...} の形で hyperref を \begin{document} の最中に 読み込みます。hyperref が連れてくる nameref.sty\DeclareHookRule{begindocument}{showkeys}{before}{nameref} を実行しますが、そのときすでに begindocument フックは走り出しているので、LaTeX カーネルが ! LaTeX hooks Error: Sorting rule for 'begindocument' hook applied too late. を出します。自分で先に hyperref を読み込んでおけば nameref は正しい時点で読み込まれ、フック規則も間に合います。

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}

これが「よくある落とし穴」ではなくクラス自身の欠陥であることは、europecv が同梱している例で確かめられます。doc/latex/europecv/examples/minimal.tex ——公式の最小例——をそのまま pdfLaTeX に流すと、同じエラーが出ます。一方、templates/cv_template_en.tex のほうは通ります。違いは、そちらが \usepackage{bookmark} を書いていて、bookmark が hyperref を先に引き込んでいるからです。なお europecv.cls\includegraphics を呼びますが graphicx を自分では読み込まないので、ロゴや旗を出す設定のままだと ! Undefined control sequence. \draweuropasslogo も併発します。\usepackage{graphicx} を足すか、クラスオプション nologo を付けてください。

Europass 形式そのものについても、名前の似た二つのクラスを取り違えないでください。europecv は 2002 年に始まった欧州共通様式の系譜を実装したもので、ecvbg.def から ecvsv.def まで 29 言語ぶんのラベル定義ファイルを同梱しています。europasscv のほうは 2013 年に出た改訂版のレイアウトを実装したもので、その README には「現時点でこのクラスは 2020 年に登場した最新の Europass レイアウトを実装していない」と警告が置かれたままです。EU の様式は改訂されるので、応募要件に「Europass 形式で」と書いてあるときは、まず先方が求めているのがどの版かを確かめる——これがこの二つを扱ううえでの実務です。

標準の letter クラス——1 ファイルから複数の宛先へ

letter クラスの本当の売りは、letter 環境を並べた数だけ手紙ができることです。差出人(\address)と署名(\signature)はプリアンブルで一度書き、\begin{letter}{宛先} を並べれば、同じ差出人から別々の宛先へ宛てた手紙が 1 通 1 ページずつ出てきます——推薦状を 10 人に出す、同じ案内を 30 社に送る、という場面がこれ一本で片づきます。中身は \opening{頭語}・本文・\closing{結語} の 3 つ。日付は \today が自動で入り、\encl{同封物}encl:\cc{写し}cc: と刷り、\ps{...} は追伸を署名の下に置きます。二通ぶん書いて 2 ページ、という素朴な確認は実際に取れます。

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}

scrlttr2scrletter——折り目と窓付き封筒

scrlttr2 が標準の letter に対して持っている決定的な差は、紙を折って封筒に入れるところまで面倒を見ることです。折り目の位置に薄い線を刷り(foldmarks)、宛名を窓の位置に合わせて配置します。その調整は .lco(letter class option)というファイルに切り出されていて、\LoadLetterOption{DIN} のように読み込みます。KOMA-Script 同梱の .lco には DINDIN5008ADIN5008BDINmtextNF(フランス)・SNSNleft(スイス)・UScommercial9UScommercial9DW、そして規格を目に見えるように刷る visualize があります。設定はすべて \setkomavar{fromname}{...} 形式の変数で行うので、値と体裁が完全に分離されます。同じ内容を別の封筒規格で刷り直すのに、変えるのは \LoadLetterOption の 1 行だけです。

もう一つ知っておくと得なのが scrletter です。こちらはクラスではなくパッケージなので、scrartclscrbook の途中に letter 環境をそのまま埋め込めます。報告書の付録に送付状を付ける、契約書の末尾に添え状を挟む、といった場面で、文書を 2 つに分けずに済みます。実際 \documentclass{scrartcl}\usepackage{scrletter} を足し、\section{...} の直後に \begin{letter}{...} を置いた文書はそのまま通ります。scrlttr2scrletter はどちらも同じ変数と .lco を使うので、覚え直しは要りません。

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}

日本語の手紙に専用クラスはあるか——\挨拶 と長形封筒の .lco

専用クラスは TeX Live 2024 にはありません*letter*.cls を探すと scrlttr2g-briefdinbriefakletter など欧文向けばかりで、和文の手紙クラスは見つかりません。ですが実務上の答えは二つあります。ひとつは封筒側で、KOMA-Script が 日本の封筒に合わせた .lco を同梱していること——NipponELNipponEHNipponLLNipponLHNipponRL が長形・洋形 3 号/4 号に、KakuLL が角形 A4 に対応します(窓の寸法は 90×45 mm または 90×55 mm)。これは KOMA-Script 2.97e から入っている機能で、マニュアルの付録一章が Gernot Hassenpflug の手で書かれ、JIS の A 判・B 判の違いまで説明しています。

.lco ファイル対応封筒窓の寸法
DIN欧州 DIN 規格の封筒(既定の出発点)
NipponEL長形/洋形 3 号・4 号90 × 45 mm
NipponEH同上、窓が高いもの90 × 55 mm
NipponRL窓が右寄りの長形/洋形90 × 45 mm
KakuLL角形 A490 × 45 mm
visualize封筒規格ではなく、寸法を紙面に刷って確認するための補助

もうひとつの答えは、本文の書き出しのほうにあります。TeX Live に入っている jsclassesokumacro.sty(奥村晴彦氏のマクロ集)には、\挨拶 という日本語の名前を持つ命令が定義されていて、これを書くだけで「拝啓」に続けて その月にふさわしい時候の挨拶 が入ります。実装は \ifcase\month で 12 分岐する素朴なもので、1 月から順に 厳寒・春寒・早春・陽春・新緑・向暑・猛暑・残暑・初秋・仲秋・晩秋・初冬 が並び、末尾に「の候,ますますご清栄のこととお喜び申し上げます。」が付きます。実際に 8 月に upLaTeX でコンパイルすると「拝啓 残暑の候,ますますご清栄のこととお喜び申し上げます。」と出ます。制御綴の名前が日本語であること自体が pTeX 系の特徴で、和文が単なる文字データではなく言語として扱われている証拠でもあります。

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}

実務——どれを選び、何を git に入れるか

選び方はほぼ提出要件で決まります。提出先が Europass を指定しているなら europecveuropasscv(どの版かを確認してから)。日本語の履歴書で JIS 様式の枠が要るなら、CV クラスではなく tabular で枠を組むほうが早い——CV クラスはどれも欧文の「箇条書き型」履歴書を前提にしていて、氏名欄・写真欄・押印欄の並ぶ様式には合いません。それ以外の一般的な英文 CV なら moderncv、もっと現代的な 2 段組が欲しければ limecv、KOMA-Script に慣れているなら komacv。そして、どれを選んでも忘れないでほしいのが、カバーレターを同じクラスで書くことです。moderncv\recipient\opening\makelettertitle\makeletterclosing\enclosure を持っていて、CV とレターの見出し・書体・色がそろいます。別々のテンプレートで作った 2 枚は、並べるとたいてい気づかれます。

  • 応募先ごとの差分はブランチではなくファイル分割で持つ。cv-body.tex を共通にし、cv-company-a.tex\input するだけにすると、更新が 1 か所で済みます
  • クラスとテンプレートをリポジトリに同梱する。altacv のようにディストリビューションに入らないものは、3 年後の自分がまず確実に困ります
  • \jobname ではなく明示的な出力名を使う。main.pdf を添付されると相手のダウンロードフォルダで迷子になります
  • PDF のメタデータを確認する。 pdfinfo で見える作成者名やタイトルは、そのまま応募先に届きます
  • 和文の履歴書は印刷して折るところまで試す。窓付き封筒に入れるなら scrlttr2visualize オプションで位置を刷り出せます

最後に、この分野で LaTeX が本当に強いのはどこか。履歴書はデザイン文書なので、見た目だけを比べれば InDesign にも Canva のテンプレートにも勝てません。LaTeX の取り柄は別のところにあります——5 年前の .tex が今日も同じ PDF を出すこと、応募先ごとの書き換えが git diff で読めること、業績リストを .bib から自動生成できること。つまり CV を「一度作る作品」ではなく「維持する資産」として扱えることです。だからこそ、クラス選びで最初に確認すべきは見た目ではなく、そのクラスが 3 年後もコンパイルできるか——kpsewhich で存在を、実コンパイルで健全さを確かめる、という順序になります。