用 LaTeX 写情书?这个开源项目把浪漫编译成了 PDF
> 用 LaTeX 排版一封给女友的情书,把程序员的浪漫编译成 PDF。
## 项目简介
`my-girlfriend-jingtian-latex` 是一个用 TeX/LaTeX 编写的情书模板项目,作者 HEJustinSun 用它向女友“景天”表达爱意,并将源码开源。项目在 GitHub 上已获得 3771 颗星,语言标注为 TeX,本质上是一份完整、可编译、带精美排版的 LaTeX 文档,内容包含封面、情书正文、诗歌、时间线、照片页等。它既是一封情书,也是一个展示 LaTeX 排版能力的极佳范例。
## 它解决什么痛点?
程序员表达情感的方式往往被误解为“木讷”或“缺乏仪式感”。传统情书用 Word 写太普通,用 HTML 太粗糙,用手写又怕字丑。这个项目提供了一种**极客式浪漫**:用严谨的排版语言,把情感编码进结构化文档,最终输出一份印刷级 PDF——既保留了程序员的专业身份认同,又满足了仪式感和美感需求。
更深层的痛点是:**LaTeX 学习曲线陡峭,很多人想用但不知道如何开始一个“非论文”的实际项目**。这个仓库恰好是一个“非学术”的完整示例,展示了如何用 LaTeX 做封面设计、目录、彩色页眉、自定义命令、图片排版、诗歌格式等,比任何教程都生动。
## 快速上手:安装与编译
### 1. 安装 TeX 发行版
- **macOS**: 安装 MacTeX(约 4GB)或更轻量的 BasicTeX + 额外宏包。
bash
brew install --cask mactex
- **Windows**: 安装 MiKTeX 或 TeX Live。
bash
# MiKTeX 控制台安装后,命令行可用
- **Linux**: 安装 texlive-full。
bash
sudo apt install texlive-full
### 2. 克隆项目
bash
git clone https://github.com/HEJustinSun/my-girlfriend-jingtian-latex.git
cd my-girlfriend-jingtian-latex
### 3. 编译主文件
假设主文件为 `main.tex`(或 `love.tex`),使用 XeLaTeX 或 LuaLaTeX 编译(因为可能涉及中文或特殊字体):
bash
xelatex main.tex
或使用 latexmk 自动处理多次编译:
bash
latexmk -xelatex main.tex
编译后生成 `main.pdf`,即为一封排版精美的情书。
### 4. 自定义修改
打开 `.tex` 文件,替换名字、日期、照片路径、诗句内容即可。例如:
latex
% 自定义命令示例
\newcommand{\girlfriendName}{景天}
\newcommand{\myName}{Justin}
\newcommand{\loveDate}{2024年5月20日}
% 在正文中使用
亲爱的\girlfriendName:
从我们相识的那一天起,\loveDate{} 便成了我生命中最特别的时刻……
## 核心亮点深度剖析
### 1. 结构化的情感表达
项目不是简单一段文字,而是分层结构:
- **封面**:大标题 + 作者 + 日期,用 `\maketitle` 或自定义 `tikz` 背景。
- **序言/目录**:用 `\tableofcontents` 列出章节,如“相识”、“相知”、“相爱”、“未来”。
- **正文**:每章用 `\chapter` 或 `\section` 组织,穿插诗歌、引用、照片。
- **附录**:时间线(用 `tikz` 绘制)、纪念日列表、愿望清单。
这种结构化让情感有了“文档架构”,阅读体验像翻一本精装书。
### 2. 排版细节的极致追求
- **字体**:使用 `fontspec` 加载系统字体(如宋体、楷体、思源黑体),中文排版美观。
- **颜色**:定义主题色(如玫瑰红 `\definecolor{rose}{RGB}{255,105,180}`),用于页眉、标题、分隔线。
- **间距与断行**:利用 `\setlength` 调整段落间距,避免孤行寡字。
- **页眉页脚**:用 `fancyhdr` 设置“景天 & Justin”的页眉,每章不同样式。
### 3. 技术技巧展示
- **TikZ 绘图**:绘制爱心、路径、时间轴,甚至可以用 `\draw` 画一朵花。
- **自定义环境**:定义 `lovequote` 环境用于引用情话。
- **超链接**:用 `hyperref` 让目录可点击,PDF 书签完整。
- **多语言支持**:使用 `ctex` 宏包处理中文,或 `babel` 支持英文。
### 4. 可复用性
任何人都可以 fork 后修改为自己的故事。项目没有硬编码女友名字,而是通过变量替换,体现了良好的工程习惯。
## 适用场景
- **告白/纪念日礼物**:打印成实体书,配相框,比买花更有心意。
- **LaTeX 教学实例**:适合作为大学 LaTeX 课程的项目作业,比“写论文”更有趣。
- **程序员婚礼请柬**:改造为婚礼邀请函,或婚礼现场展示的“我们的故事”册子。
- **个人网站 PDF 下载**:作为个人主页的“关于我们”页面下载版。
- **极客求婚道具**:把求婚誓言编译成 PDF,扫码查看。
## 同类项目对比
| 项目 | 语言 | 特点 | 对比本项目的优劣 |
|------|------|------|------------------|
| `love-letter`(常见 JS 项目) | HTML/CSS/JS | 网页动画情书,交互性强 | 本项目更静态、更正式、可打印;网页版适合手机浏览,但缺乏印刷质感 |
| `beautiful-love-letter`(Python 生成 PDF) | Python + ReportLab | 代码生成 PDF,但排版粗糙 | 本项目用 LaTeX,排版精度远超 ReportLab,且支持数学公式、复杂表格 |
| 手写情书 | 纸笔 | 最真诚,但不可复制 | 本项目可无限复刻,且能插入照片、二维码链接到视频 |
| 普通 Word 文档 | - | 易编辑但丑 | LaTeX 的字体、间距、对齐是 Word 无法企及的,尤其中文排版 |
**结论**:本项目在“技术浪漫”领域是标杆,它将编程技能与情感表达完美结合,且完全开源可定制。
## 技术实现细节(进阶)
### 编译链说明
由于可能使用了 `ctex` 或 `xeCJK`,必须用 XeLaTeX 编译。如果出现字体缺失,需在系统安装中文字体(如宋体、黑体)。
### 常用宏包清单
latex
\usepackage{ctex} % 中文支持
\usepackage{tikz} % 绘图
\usepackage{hyperref} % 超链接
\usepackage{fancyhdr} % 页眉
\usepackage{geometry} % 页面边距
\usepackage{amsmath} % 数学(如果写诗句中的公式,例如“我爱你=∞”)
\usepackage{xcolor} % 颜色
### 示例代码片段(改编自项目风格)
latex
\documentclass[12pt,a4paper]{book}
\usepackage{ctex}
\usepackage{tikz}
\usetikzlibrary{decorations.pathmorphing}
\usepackage{xcolor}
\definecolor{loveRed}{RGB}{220,20,60}
\begin{document}
\begin{titlepage}
\begin{tikzpicture}[remember picture, overlay]
\draw[thick, loveRed] (current page.south west) rectangle (current page.north east);
\node[font=\Huge, loveRed] at (current page.center) {To 景天};
\end{tikzpicture}
\end{titlepage}
\chapter{初见}
\begin{quote}
\itshape 那天阳光正好,你穿白裙,我心跳漏了一拍。
\end{quote}
\begin{tikzpicture}
\draw[decorate, decoration={coil, aspect=0.5}] (0,0) -- (5,0);
\node at (2.5,0.5) {心跳曲线};
\end{tikzpicture}
\end{document}
## 总结与推荐理由
这个项目看似“无聊”(一封情书而已),实际上是一个**浓缩的 LaTeX 最佳实践库**。它让你看到:
1. **技术可以承载情感**,且不失去专业性。
2. **LaTeX 不只是论文工具**,它可以做任何精美文档。
3. **开源精神延伸到个人生活**,把自己的浪漫分享给全世界。
如果你是一名程序员,想给另一半一个特别的礼物,或者你想学习 LaTeX 排版而厌倦了“Hello World”,这个项目是最佳起点。
最后,向作者 HEJustinSun 致敬——你不仅赢得了女友的心,也赢得了数千名开发者的 star。
项目链接:[https://github.com/HEJustinSun/my-girlfriend-jingtian-latex](https://github.com/HEJustinSun/my-girlfriend-jingtian-latex)