Jake's Resume:以 YAMLResume 的方式重建

YAMLResume 完整支援經典的 Jake's Resume LaTeX 模板——同樣簡潔、ATS 友善的外觀,但背後是結構化的 YAML 內容、schema 驗證、12 種語言、markdown 摘要,以及深度的版面自訂。

Jake's Resume 是有史以來最受歡迎的 LaTeX 履歷模板之一。它由 Jake Gutierrez 在 sb2nov 的履歷模板 基礎上建立,已在 GitHub 上獲得超過 2,800 顆星星,並因其簡潔、單欄、ATS 友善的設計,成為履歷社群中的預設推薦。

YAMLResume 在 v0.12 中將 Jake's Resume 收錄為官方 LaTeX 模板。在本文中,我們將展示 Jake's Resume 在 YAMLResume 上的樣貌,以及——更重要的是——YAMLResume 在原始模板之上做了哪些改進。

原版 Jake's Resume

原始模板是一個單獨的 resume.tex 檔案。在你寫下任何內容之前,你得先穿越約 100 行的前言(preamble):套件載入、邊界調整技巧、章節格式設定,以及 \resumeSubheading、\resumeItem 和 \resumeProjectHeading 等一整套自訂巨集。

接著,內容直接以 LaTeX 撰寫:

\section{Education}
  \resumeSubHeadingListStart
    \resumeSubheading
      {Southwestern University}{Georgetown, TX}
      {Bachelor of Arts in Computer Science, Minor in Business}{Aug. 2018 -- May 2021}
  \resumeSubHeadingListEnd

原版 Jake's Resume

成果很美,但撰寫體驗是純粹的 LaTeX:每個日期區間都要手工輸入、每個特殊字元都要跳脫(Texas A\&M University)、還要透過 LaTeX 出了名的隱晦錯誤日誌來除錯大括號不匹配。想換字型?註解和取消註解 \usepackage 行。想要第二種語言?重寫整個檔案。

供好奇的讀者參考,以下是完整的 218 行 resume.tex 原始碼:

原版 Jake's Resume——完整 LaTeX 原始碼(218 行)
%-------------------------
% Resume in Latex
% Author : Jake Gutierrez
% Based off of: https://github.com/sb2nov/resume
% License : MIT
%------------------------

\documentclass[letterpaper,11pt]{article}

\usepackage{latexsym}
\usepackage[empty]{fullpage}
\usepackage{titlesec}
\usepackage{marvosym}
\usepackage[usenames,dvipsnames]{color}
\usepackage{verbatim}
\usepackage{enumitem}
\usepackage[hidelinks]{hyperref}
\usepackage{fancyhdr}
\usepackage[english]{babel}
\usepackage{tabularx}
\input{glyphtounicode}


%----------FONT OPTIONS----------
% sans-serif
% \usepackage[sfdefault]{FiraSans}
% \usepackage[sfdefault]{roboto}
% \usepackage[sfdefault]{noto-sans}
% \usepackage[default]{sourcesanspro}

% serif
% \usepackage{CormorantGaramond}
% \usepackage{charter}


\pagestyle{fancy}
\fancyhf{} % clear all header and footer fields
\fancyfoot{}
\renewcommand{\headrulewidth}{0pt}
\renewcommand{\footrulewidth}{0pt}

% Adjust margins
\addtolength{\oddsidemargin}{-0.5in}
\addtolength{\evensidemargin}{-0.5in}
\addtolength{\textwidth}{1in}
\addtolength{\topmargin}{-.5in}
\addtolength{\textheight}{1.0in}

\urlstyle{same}

\raggedbottom
\raggedright
\setlength{\tabcolsep}{0in}

% Sections formatting
\titleformat{\section}{
  \vspace{-4pt}\scshape\raggedright\large
}{}{0em}{}[\color{black}\titlerule \vspace{-5pt}]

% Ensure that generate pdf is machine readable/ATS parsable
\pdfgentounicode=1

%-------------------------
% Custom commands
\newcommand{\resumeItem}[1]{
  \item\small{
    {#1 \vspace{-2pt}}
  }
}

\newcommand{\resumeSubheading}[4]{
  \vspace{-2pt}\item
    \begin{tabular*}{0.97\textwidth}[t]{l@{\extracolsep{\fill}}r}
      \textbf{#1} & #2 \\
      \textit{\small#3} & \textit{\small #4} \\
    \end{tabular*}\vspace{-7pt}
}

\newcommand{\resumeSubSubheading}[2]{
    \item
    \begin{tabular*}{0.97\textwidth}{l@{\extracolsep{\fill}}r}
      \textit{\small#1} & \textit{\small #2} \\
    \end{tabular*}\vspace{-7pt}
}

\newcommand{\resumeProjectHeading}[2]{
    \item
    \begin{tabular*}{0.97\textwidth}{l@{\extracolsep{\fill}}r}
      \small#1 & #2 \\
    \end{tabular*}\vspace{-7pt}
}

\newcommand{\resumeSubItem}[1]{\resumeItem{#1}\vspace{-4pt}}

\renewcommand\labelitemii{$\vcenter{\hbox{\tiny$\bullet$}}$}

\newcommand{\resumeSubHeadingListStart}{\begin{itemize}[leftmargin=0.15in, label={}]}
\newcommand{\resumeSubHeadingListEnd}{\end{itemize}}
\newcommand{\resumeItemListStart}{\begin{itemize}}
\newcommand{\resumeItemListEnd}{\end{itemize}\vspace{-5pt}}

%-------------------------------------------
%%%%%%  RESUME STARTS HERE  %%%%%%%%%%%%%%%%%%%%%%%%%%%%


\begin{document}

%----------HEADING----------
% \begin{tabular*}{\textwidth}{l@{\extracolsep{\fill}}r}
%   \textbf{\href{http://sourabhbajaj.com/}{\Large Sourabh Bajaj}} & Email : \href{mailto:sourabh@sourabhbajaj.com}{sourabh@sourabhbajaj.com}\\
%   \href{http://sourabhbajaj.com/}{http://www.sourabhbajaj.com} & Mobile : +1-123-456-7890 \\
% \end{tabular*}

\begin{center}
    \textbf{\Huge \scshape Jake Ryan} \\ \vspace{1pt}
    \small 123-456-7890 $|$ \href{mailto:x@x.com}{\underline{jake@su.edu}} $|$
    \href{https://linkedin.com/in/...}{\underline{linkedin.com/in/jake}} $|$
    \href{https://github.com/...}{\underline{github.com/jake}}
\end{center}


%-----------EDUCATION-----------
\section{Education}
  \resumeSubHeadingListStart
    \resumeSubheading
      {Southwestern University}{Georgetown, TX}
      {Bachelor of Arts in Computer Science, Minor in Business}{Aug. 2018 -- May 2021}
    \resumeSubheading
      {Blinn College}{Bryan, TX}
      {Associate's in Liberal Arts}{Aug. 2014 -- May 2018}
  \resumeSubHeadingListEnd


%-----------EXPERIENCE-----------
\section{Experience}
  \resumeSubHeadingListStart

    \resumeSubheading
      {Undergraduate Research Assistant}{June 2020 -- Present}
      {Texas A\&M University}{College Station, TX}
      \resumeItemListStart
        \resumeItem{Developed a REST API using FastAPI and PostgreSQL to store data from learning management systems}
        \resumeItem{Developed a full-stack web application using Flask, React, PostgreSQL and Docker to analyze GitHub data}
        \resumeItem{Explored ways to visualize GitHub collaboration in a classroom setting}
      \resumeItemListEnd

% -----------Multiple Positions Heading-----------
%    \resumeSubSubheading
%     {Software Engineer I}{Oct 2014 - Sep 2016}
%     \resumeItemListStart
%        \resumeItem{Apache Beam}
%          {Apache Beam is a unified model for defining both batch and streaming data-parallel processing pipelines}
%     \resumeItemListEnd
%    \resumeSubHeadingListEnd
%-------------------------------------------

    \resumeSubheading
      {Information Technology Support Specialist}{Sep. 2018 -- Present}
      {Southwestern University}{Georgetown, TX}
      \resumeItemListStart
        \resumeItem{Communicate with managers to set up campus computers used on campus}
        \resumeItem{Assess and troubleshoot computer problems brought by students, faculty and staff}
        \resumeItem{Maintain upkeep of computers, classroom equipment, and 200 printers across campus}
    \resumeItemListEnd

    \resumeSubheading
      {Artificial Intelligence Research Assistant}{May 2019 -- July 2019}
      {Southwestern University}{Georgetown, TX}
      \resumeItemListStart
        \resumeItem{Explored methods to generate video game dungeons based off of \emph{The Legend of Zelda}}
        \resumeItem{Developed a game in Java to test the generated dungeons}
        \resumeItem{Contributed 50K+ lines of code to an established codebase via Git}
        \resumeItem{Conducted  a human subject study to determine which video game dungeon generation technique is enjoyable}
        \resumeItem{Wrote an 8-page paper and gave multiple presentations on-campus}
        \resumeItem{Presented virtually to the World Conference on Computational Intelligence}
      \resumeItemListEnd

  \resumeSubHeadingListEnd


%-----------PROJECTS-----------
\section{Projects}
    \resumeSubHeadingListStart
      \resumeProjectHeading
          {\textbf{Gitlytics} $|$ \emph{Python, Flask, React, PostgreSQL, Docker}}{June 2020 -- Present}
          \resumeItemListStart
            \resumeItem{Developed a full-stack web application using with Flask serving a REST API with React as the frontend}
            \resumeItem{Implemented GitHub OAuth to get data from user’s repositories}
            \resumeItem{Visualized GitHub data to show collaboration}
            \resumeItem{Used Celery and Redis for asynchronous tasks}
          \resumeItemListEnd
      \resumeProjectHeading
          {\textbf{Simple Paintball} $|$ \emph{Spigot API, Java, Maven, TravisCI, Git}}{May 2018 -- May 2020}
          \resumeItemListStart
            \resumeItem{Developed a Minecraft server plugin to entertain kids during free time for a previous job}
            \resumeItem{Published plugin to websites gaining 2K+ downloads and an average 4.5/5-star review}
            \resumeItem{Implemented continuous delivery using TravisCI to build the plugin upon new a release}
            \resumeItem{Collaborated with Minecraft server administrators to suggest features and get feedback about the plugin}
          \resumeItemListEnd
    \resumeSubHeadingListEnd



%
%-----------PROGRAMMING SKILLS-----------
\section{Technical Skills}
 \begin{itemize}[leftmargin=0.15in, label={}]
    \small{\item{
     \textbf{Languages}{: Java, Python, C/C++, SQL (Postgres), JavaScript, HTML/CSS, R} \\
     \textbf{Frameworks}{: React, Node.js, Flask, JUnit, WordPress, Material-UI, FastAPI} \\
     \textbf{Developer Tools}{: Git, Docker, TravisCI, Google Cloud Platform, VS Code, Visual Studio, PyCharm, IntelliJ, Eclipse} \\
     \textbf{Libraries}{: pandas, NumPy, Matplotlib}
    }}
 \end{itemize}


%-------------------------------------------
\end{document}

YAMLResume 中的 Jake's Resume

在 YAMLResume 上,同一份履歷是純粹、結構化的 YAML。以下是 Jake Ryan 的履歷改寫版本:

resume.yml
# yaml-language-server: $schema=https://yamlresume.dev/schema.json

---
content:
  basics:
    name: Jake Ryan
    phone: 123-456-7890
    email: jake@su.edu
  profiles:
    - network: LinkedIn
      url: https://linkedin.com/in/jake
      username: linkedin.com/in/jake
    - network: GitHub
      url: https://github.com/jake
      username: github.com/jake
  education:
    - institution: Southwestern University
      degree: Bachelor
      area: Computer Science, Minor in Business
      startDate: Aug 2018
      endDate: May 2021
    - institution: Blinn College
      degree: Associate
      area: Liberal Arts
      startDate: Aug 2014
      endDate: May 2018
  work:
    - name: Texas A&M University
      position: Undergraduate Research Assistant
      startDate: Jun 2020
      summary: |
        - Developed a REST API using **FastAPI** and **PostgreSQL** to store data from learning management systems
        - Developed a full-stack web application using Flask, React, PostgreSQL and Docker to analyze GitHub data
        - Explored ways to visualize GitHub collaboration in a classroom setting
    - name: Southwestern University
      position: Information Technology Support Specialist
      startDate: Sep 2018
      summary: |
        - Communicate with managers to set up campus computers used on campus
        - Assess and troubleshoot computer problems brought by students, faculty and staff
        - Maintain upkeep of computers, classroom equipment, and 200 printers across campus
    - name: Southwestern University
      position: Artificial Intelligence Research Assistant
      startDate: May 2019
      endDate: Jul 2019
      summary: |
        - Explored methods to generate video game dungeons based off of *The Legend of Zelda*
        - Developed a game in Java to test the generated dungeons
        - Contributed 50K+ lines of code to an established codebase via Git
        - Conducted a human subject study to determine which video game dungeon generation technique is enjoyable
        - Wrote an 8-page paper and gave multiple presentations on-campus
        - Presented virtually to the World Conference on Computational Intelligence
  projects:
    - name: Gitlytics
      description: Python, Flask, React, PostgreSQL, Docker
      startDate: Jun 2020
      summary: |
        - Developed a full-stack web application with Flask serving a REST API and React as the frontend
        - Implemented GitHub OAuth to get data from user repositories
        - Visualized GitHub data to show collaboration
        - Used Celery and Redis for asynchronous tasks
    - name: Simple Paintball
      description: Spigot API, Java, Maven, TravisCI, Git
      startDate: May 2018
      endDate: May 2020
      summary: |
        - Developed a Minecraft server plugin to entertain kids during free time for a previous job
        - Published plugin to websites gaining 2K+ downloads and an average 4.5/5-star review
        - Implemented continuous delivery using TravisCI to build the plugin upon a new release
        - Collaborated with Minecraft server administrators to suggest features and get feedback about the plugin
  skills:
    - name: Languages
      keywords: [Java, Python, C/C++, SQL (Postgres), JavaScript, HTML/CSS, R]
    - name: Frameworks
      keywords: [React, Node.js, Flask, JUnit, WordPress, Material-UI, FastAPI]
    - name: Developer Tools
      keywords: [Git, Docker, TravisCI, Google Cloud Platform, VS Code, Visual Studio, PyCharm, IntelliJ, Eclipse]
    - name: Libraries
      keywords: [pandas, NumPy, Matplotlib]

locale:
  language: en

layouts:
  - engine: latex
    template: jake

然後建構它:

$ yamlresume build resume.yml

YAMLResume 渲染的 Jake's Resume

你會得到 Jake's Resume 的招牌外觀——置中的姓名、以 $|$ 分隔的聯絡資訊行、帶橫線的章節標題、對齊的日期區間——卻不需要寫任何一行 LaTeX。你也可以在我們的模板展示區瀏覽線上範例,並閱讀模板文件。

作為對照,以下是 YAMLResume 根據上述 YAML 產生的完整 LaTeX 原始碼。你永遠不需要手動撰寫或編輯這個檔案——它會在每次建構時從你的 YAML 重新產生:

YAMLResume 產生的 Jake's Resume——完整 LaTeX 原始碼(185 行)
\documentclass[a4paper,10pt]{article}

\usepackage{changepage}
\usepackage[usenames,dvipsnames]{color}
\usepackage{enumitem}
\IfFileExists{fontawesome7.sty}{%
  \usepackage{fontawesome7}%
}{%
  \usepackage{fontawesome5}%
}
\usepackage[hidelinks]{hyperref}
\usepackage{titlesec}

%% page layout/margins
\usepackage[top=2.5cm, bottom=2.5cm, left=1.5cm, right=1.5cm]{geometry}

% Disable page numbers
\pagenumbering{gobble}

%% Babel config for English language
\usepackage[english]{babel}

%% fontspec
\usepackage{fontspec}

\IfFontExistsTF{Linux Libertine}{
  \setmainfont[Ligatures={TeX, Common}, Numbers=OldStyle]{Linux Libertine}
}{}
\IfFontExistsTF{Linux Libertine O}{
  \setmainfont[Ligatures={TeX, Common}, Numbers=OldStyle]{Linux Libertine O}
}{}

%% CTeX
% CJK support, used to show CJK characters in the resume
%
% - fontset=none: disable builtin fontset but instead set the CJK font manually
% - heading=false: disable ctex heading
% - punct=kaiming: use kaiming punctuations styles for CJK
% - scheme=plain: use plain scheme, do not override \normalsize font size
% - space=auto: space settings for CJK characters
%
% ref:
% - http://ctan.mirrorcatalogs.com/language/chinese/ctex/ctex.pdf
\usepackage[UTF8, heading=false, punct=kaiming, scheme=plain, space=auto]{ctex}

\IfFontExistsTF{Noto Serif CJK SC}{
  \setCJKmainfont{Noto Serif CJK SC}
}{}
\IfFontExistsTF{Noto Sans CJK SC}{
  \setCJKsansfont{Noto Sans CJK SC}
}{}

%% line spacing
\usepackage{setspace}
\setstretch{1.125}

%% URL styling - use normal text instead of monospace
\urlstyle{same}

% Auto-underline all links
% Defer until \begin{document} so hyperref is already loaded
\AtBeginDocument{%
  \let\oldhref\href
  \renewcommand{\href}[2]{\oldhref{#1}{\underline{#2}}}%
}

%% PDF metadata
\hypersetup{
  pdfauthor={Jake Ryan},
  pdftitle={Jake Ryan},
  pdfkeywords={Languages, Frameworks, Developer Tools, Libraries},
  pdfsubject={Résumé of Jake Ryan},
  pdfcreator={YAMLResume (https://yamlresume.dev)},
}

% global itemize spacing
\setlist[itemize]{nosep}
\setlength{\parindent}{0pt}

% Sections formatting
\titleformat{\section}{
  \vspace{-4pt}\scshape\raggedright\large
}{}{0em}{}[\color{black}\titlerule \vspace{-5pt}]

% Custom commands
\newcommand{\resumeSubheading}[4]{
  \begin{tabular*}{\textwidth}[t]{l@{\extracolsep{\fill}}r}
    \textbf{#1} & #2 \\
    \textit{#3} & \textit{#4} \\
  \end{tabular*}
}


\begin{document}

\begin{center}
\textbf{\Huge \scshape Jake Ryan}\vspace{2pt}

{\Large }

{\small \faPhoneVolume}~\href{tel:123-456-7890}{123-456-7890} $|$ {\small \faEnvelope[regular]}~\href{mailto:jake@su.edu}{jake@su.edu}



{\small \faLinkedin}\ \href{https://linkedin.com/in/jake}{linkedin.com/in/jake} $|$ {\small \faGithub}\ \href{https://github.com/jake}{github.com/jake}
\end{center}

\section{Education}
\resumeSubheading
{Southwestern University}{}
{Bachelor, Computer Science, Minor in Business}{Aug 2018–May 2021}

\resumeSubheading
{Blinn College}{}
{Associate, Liberal Arts}{Aug 2014–May 2018}
\section{Work}
\resumeSubheading
{Undergraduate Research Assistant}{Jun 2020–Present}
{Texas A\&M University}{}
\begin{adjustwidth}{6pt}{6pt}
\begin{itemize}
\item Developed a REST API using \textbf{FastAPI} and \textbf{PostgreSQL} to store data from learning management systems
\item Developed a full-stack web application using Flask, React, PostgreSQL and Docker to analyze GitHub data
\item Explored ways to visualize GitHub collaboration in a classroom setting
\end{itemize}
\end{adjustwidth}

\resumeSubheading
{Information Technology Support Specialist}{Sep 2018–Present}
{Southwestern University}{}
\begin{adjustwidth}{6pt}{6pt}
\begin{itemize}
\item Communicate with managers to set up campus computers used on campus
\item Assess and troubleshoot computer problems brought by students, faculty and staff
\item Maintain upkeep of computers, classroom equipment, and 200 printers across campus
\end{itemize}
\end{adjustwidth}

\resumeSubheading
{Artificial Intelligence Research Assistant}{May 2019–Jul 2019}
{Southwestern University}{}
\begin{adjustwidth}{6pt}{6pt}
\begin{itemize}
\item Explored methods to generate video game dungeons based off of \textit{The Legend of Zelda}
\item Developed a game in Java to test the generated dungeons
\item Contributed 50K+ lines of code to an established codebase via Git
\item Conducted a human subject study to determine which video game dungeon generation technique is enjoyable
\item Wrote an 8-page paper and gave multiple presentations on-campus
\item Presented virtually to the World Conference on Computational Intelligence
\end{itemize}
\end{adjustwidth}
\section{Skills}
\begin{adjustwidth}{6pt}{6pt}
\textbf{Languages} \hfill \textbf{Keywords}: Java, Python, C/C++, SQL (Postgres), JavaScript, HTML/CSS, R

\textbf{Frameworks} \hfill \textbf{Keywords}: React, Node.js, Flask, JUnit, WordPress, Material-UI, FastAPI

\textbf{Developer Tools} \hfill \textbf{Keywords}: Git, Docker, TravisCI, Google Cloud Platform, VS Code, Visual Studio, PyCharm, IntelliJ, Eclipse

\textbf{Libraries} \hfill \textbf{Keywords}: pandas, NumPy, Matplotlib
\end{adjustwidth}
\section{Projects}
\resumeSubheading
{Gitlytics}{Jun 2020–Present}
{Python, Flask, React, PostgreSQL, Docker}{}
\begin{adjustwidth}{6pt}{6pt}
\begin{itemize}
\item Developed a full-stack web application with Flask serving a REST API and React as the frontend
\item Implemented GitHub OAuth to get data from user repositories
\item Visualized GitHub data to show collaboration
\item Used Celery and Redis for asynchronous tasks
\end{itemize}
\end{adjustwidth}

\resumeSubheading
{Simple Paintball}{May 2018–May 2020}
{Spigot API, Java, Maven, TravisCI, Git}{}
\begin{adjustwidth}{6pt}{6pt}
\begin{itemize}
\item Developed a Minecraft server plugin to entertain kids during free time for a previous job
\item Published plugin to websites gaining 2K+ downloads and an average 4.5/5-star review
\item Implemented continuous delivery using TravisCI to build the plugin upon a new release
\item Collaborated with Minecraft server administrators to suggest features and get feedback about the plugin
\end{itemize}
\end{adjustwidth}
\end{document}

我們保留了什麼

我們刻意保留了讓 Jake's Resume 之所以是 Jake's Resume 的設計 DNA。事實上,在將模板適配到 YAMLResume 的架構之後,原始前言中只有兩個部分倖存下來:

% Sections formatting
\titleformat{\section}{
  \vspace{-4pt}\scshape\raggedright\large
}{}{0em}{}[\color{black}\titlerule \vspace{-5pt}]

% Custom commands
\newcommand{\resumeSubheading}[4]{
  \begin{tabular*}{\textwidth}[t]{l@{\extracolsep{\fill}}r}
    \textbf{#1} & #2 \\
    \textit{#3} & \textit{#4} \\
  \end{tabular*}
}
  • \titleformat —— 帶橫線的小型大寫字母(small caps)章節標題
  • \resumeSubheading —— 雙行條目標頭、日期靠右對齊,用於工作經歷、學歷、專案及所有其他附日期的章節

再加上置中的頁首、$|$ 聯絡資訊分隔符,以及緊湊的 nosep 項目清單,這些承載了模板的整體視覺識別。其餘的一切——大約一打的套件和整整一頁的巨集——都被 YAMLResume 的共享渲染管線取代了。

我們改進了什麼

保留外觀是簡單的部分。真正的價值在於 YAMLResume 在其周圍加入的一切。

內容,終於與呈現分離

在原始模板中,你的履歷就是 LaTeX 程式碼。在 YAMLResume 中,你的履歷是資料。切換模板只是一行的變動:

layouts:
  - engine: latex
    template: jake                  # or moderncv-banking, moderncv-casual, ...

而且因為 layouts 是一個清單,一個 YAML 檔案就能產生 Jake's Resume 的 PDF、可直接上網的 HTML 頁面,以及一份給純文字申請表單使用的 Markdown 副本——全部在一次 yamlresume build 中完成。

結構化資料與 schema 驗證

每個欄位都定義在公開的 JSON Schema 中。只要在檔案頂部加上 yaml-language-server 指令,你的編輯器就會在你輸入時提供自動補全、內嵌文件說明和驗證。學位、語言流暢度、技能等級和個人檔案網站都是列舉值——錯字在你編譯之前就會被抓出來,而不是在一份 40 行的 LaTeX 錯誤日誌之後才發現。

不再需要手動跳脫

原始模板強迫你寫 Texas A\&M University。在 YAMLResume 中你寫 Texas A&M University 即可——LaTeX 跳脫會在渲染時自動、一致地套用到所有地方。

結構化、在地化的日期

日期是資料(startDate: Aug 2018),而不是寫死在巨集裡的字串。YAMLResume 會在整份文件中以一致的方式格式化日期,空白的 endDate 會渲染為「Present」——並翻譯成你履歷的語言。

真正的國際化

原始模板被寫死為英文。YAMLResume 支援 12 種區域語言——英語、中文(簡體、繁體香港、繁體台灣)、西班牙語、法語、挪威語、荷蘭語、日語、德語、印尼語和巴西葡萄牙語。章節標題、學位、流暢度等級和日期格式都會自動翻譯,並針對每種語言設定 babel,透過 ctex 和 Noto 字型提供完善的 CJK 排版。

Markdown 摘要

每個 summary 欄位都接受實用的 markdown 子集——粗體、斜體、清單和連結——並會被轉換成正確的 LaTeX。在原始模板中,你得手寫 \textbf{} 和 itemize 環境。

排版與版面控制

在原始模板中需要編輯前言才能做的事,在這裡只是一個設定選項:

layouts:
  - engine: latex
    template: jake
    page:
      paperSize: a4            # a4 | letter
      showPageNumbers: true
      margins:
        top: 2.5cm
        bottom: 2.5cm
        left: 1.5cm
        right: 1.5cm
    typography:
      fontSize: 11pt           # 10pt | 11pt | 12pt
      lineSpacing: relaxed     # tight | snug | normal | relaxed | loose
      fontFamily: Linux Libertine O
    advanced:
      showIcons: true
      showUrls: true

邊界由 geometry 套件處理,而不是原版的負邊界 \addtolength 技巧;字型則透過 \IfFontExistsTF 備援機制解析,而不是註解/取消註解的輪盤遊戲。

章節別名與重新排序

無需碰觸 LaTeX,就能重新命名任何章節標題或調整章節順序——例如,把 Projects 放在 Work 之前,或把「Work」改名為「Experience」:

layouts:
  - engine: latex
    template: jake
    sections:
      aliases:
        work: Experience
      order:
        - projects
        - work

詳情請參閱章節別名和章節重新排序。

現代化的連結、圖示與 PDF 詮釋資料

頁首的聯絡資訊行會有可點擊的 tel: 和 mailto: 連結、隱藏連結框線的底線 \href,以及可選的 FontAwesome 圖示(並自動從 fontawesome7 降級到 fontawesome5)。產生的 PDF 還帶有完善的詮釋資料——作者、標題,以及從你的技能推導出的關鍵字——這些都是原始模板從未設定的。

經過測試、持續維護

Jake 渲染器附帶超過 700 行的單元測試,涵蓋前言、每個章節和每個版面選項,而且它是建構在與我們 moderncv 模板相同的共享 LatexRenderer 基礎之上——因此對渲染管線的改進會自動降臨到 Jake's Resume 上。

一覽比較

原版 Jake's ResumeYAMLResume template: jake
撰寫格式原始 LaTeX結構化 YAML
驗證LaTeX 編譯錯誤JSON Schema + IDE 自動補全
特殊字元手動跳脫自動處理
日期手工輸入的字串結構化、在地化
語言僅英文12 種區域語言,CJK 就緒
富文字內嵌 LaTeX 巨集Markdown 摘要
模板一個檔案、一種設計一行即可切換
輸出格式僅 PDFPDF、HTML、Markdown
版面自訂編輯前言設定選項
章節改名/排序重寫巨集設定選項

立即試用

$ npm install -g yamlresume
$ yamlresume new resume.yml
# edit resume.yml, set `template: jake`
$ yamlresume build resume.yml

或者開啟 playground,將模板切換為 jake,直接在瀏覽器中查看效果。

致謝

原始設計的所有功勞歸於 Jake Gutierrez 和 sb2nov,他們以 MIT 授權釋出了各自的模板,為社群帶來了一個現代經典。我們的適配工作記錄於議題 #88 和 #179,並隨 YAMLResume v0.12 發布。

一如往常,歡迎在 GitHub 上提供意見並參與貢獻。祝建構愉快!

Written by

Xiao Hanyu

At

Sat Oct 03 2026