如果你在 macOS 上写过毕业论文,大概率经历过这样的场景:Word 排中文版面还可以,但一插公式、一碰参考文献就抓狂,目录、编号、图表浮动能把人逼疯。我大约七年前第一次在 Mac 上装 LaTeX,折腾了好几个晚上才把环境彻底配好,后来陆续帮实验室同学配过近十台机器。这篇笔记就是一套完整的 macOS 下 LaTeX 论文写作流程,重点解决中英文混排的兼容问题,也覆盖了环境安装、模板结构、自动编译、辅助文件清理这些实操细节。
这套方案适合谁?准备写本科或研究生毕业论文的,准备给期刊投稿的,以及受不了 Word 排版但还没下定决心迁移的人。全文按我实际操作的顺序来写,不会讲太多玄学理论,尽量每一步都给出能直接复制的代码和配置。如果你之前只碰过 Overleaf 没配过本地环境,这篇可以作为第一次完整落地的参考。
1. 环境准备:macOS 上搭建 LaTeX 写作环境
1.1 发行版选型:MacTeX 全量、BasicTeX 与 Homebrew
macOS 上最主流的 LaTeX 发行版是 MacTeX,它本质上是 TeX Live 的 macOS 原生打包版。MacTeX 官网提供两种安装包:全量版和 BasicTeX。全量版安装文件大约 5.5 GB,装完占用接近 8 GB,里面包含了 TeX Live 几乎全部宏包,还附带 TeXShop、LaTeXiT、BibDesk 这些辅助工具;BasicTeX 只有一百多兆,相当于一个极简内核,大多数宏包都要事后用tlmgr手动补装。
我给你的建议是:新手直接装全量版,不要碰 BasicTeX。原因很现实:中英文论文写作要用的ctex、xeCJK、biblatex、booktabs、longtable在 BasicTeX 里全都不是预装的,你会在某个深夜连续执行一串tlmgr install,还会遇到依赖缺失、包版本不匹配的问题。我在帮同学配环境时用 BasicTeX 踩过一次坑,光补ctex相关依赖就补了二十多个包,最后想想完全不值得。
如果你习惯命令行,也可以用 Homebrew 安装:
brew install --cask mactex-no-gui末尾的mactex-no-gui表示不安装 TeXShop、LaTeXiT 这些图形工具,只保留命令行编译环境。这个变体对 VS Code 工作流来说刚刚好,既不占多余空间,也不会在启动台里多出一排用不上的图标。装完记得先验证一下:
xelatex --version latexmk --version能看到版本号就说明 TeX Live 已经进入 PATH。如果终端提示找不到命令,通常是安装包没有自动刷新环境变量,重开一个终端窗口即可。
1.2 编辑器选择:VS Code + LaTeX Workshop 为什么是最优选
macOS 上能写 LaTeX 的编辑器不少,我实际用过 TeXShop、Overleaf、VS Code,最后长期稳定用的是 VS Code 加 LaTeX Workshop 扩展。TeXShop 是 MacTeX 自带的编辑器,打开即用,但它更像一个“能用”的工具,没有目录大纲、没有代码补全、没有正反定位的顺滑体验,写长论文时效率偏低。
Overleaf 也很优秀,免配置、在线协作、模板库丰富,但本地环境始终绕不开:有些学校的模板需要本地编译才能通过,投期刊时往往还要自己处理图片路径、字体、宏包版本;而且 Overleaf 的免费版编译队列在高峰时期经常要排队,几十页的论文编译一次要等很久。
VS Code 的优势在于它把“编写、编译、预览、清理”整合在同一个界面里。LaTeX Workshop 扩展提供语法高亮、自动补全、错误提示、PDF 预览、SyncTeX 正反向定位,还能自定义编译配方。最关键的是一份settings.json配置可以跟着项目走,换台电脑也能快速还原环境。这套组合在 macOS 上的体验基本达到了本地写作的上限。
1.3 30 分钟完成安装并出第一份 PDF
下面是一条完整流程,照着走一遍,你就能从零到一看到第一份 PDF 出现在屏幕上。
- 安装 MacTeX 全量版,或者执行
brew install --cask mactex-no-gui。国内下载慢的话,可以从国内高校开源镜像站拉取安装包,速度会快很多。 - 安装 VS Code,扩展市场里搜索 LaTeX Workshop 并安装。
- 创建一个测试目录,新建文件
test.tex,写入下面这段最小代码:
\documentclass[UTF8, fontset=mac]{ctexart} \begin{document} 中文 LaTeX 测试:中英文混排 OK。 \end{document}- 在 VS Code 里按下
Cmd + Alt + B编译。第一次编译如果没反应,先确认 LaTeX Workshop 的默认配方选的是 XeLaTeX,或者稍后按第 4 章的方式配置配方。 - 编译完成后,右侧会弹出 PDF 预览。看到中文正常渲染出来,环境就算通了。
这一步值得多说一句:很多人在ctexart文档类上翻车,是因为fontset=mac需要 macOS 系统预装的宋体、黑体、楷体。如果你用的是精简版系统或者缺少中文字体,编译会直接报字体不可用。遇到这种情况,可以把fontset改成fandol,这是 ctex 宏包提供的开源中文字体方案,不依赖系统字体,后面第 2 章会细讲。
2. 中英文混排:XeLaTeX 与 ctex 的正确打开方式
2.1 为什么必须用 XeLaTeX:从 CJK 时代到 Unicode 时代
老用户都知道,LaTeX 早年处理中文是一场灾难。CCT、CJK、这些方案要么需要特殊格式的字体,要么需要复杂的转码工具,公式和中文标点还经常打架。2008 年之后情况完全变了,XeTeX 引擎可以直接调用 macOS 或 Windows 系统里的 TrueType、OpenType 字体,再加上xeCJK和ctex宏包的成熟,中文排版不再需要任何预处理,源文件直接用 UTF-8 保存即可。
编译论文的时候,一定要明确告诉引擎使用 XeLaTeX,而不是默认的 pdfLaTeX。这里我列一个简单对比:
| 编译引擎 | 中文支持 | 系统字体调用 | 适用场景 |
|---|---|---|---|
| pdfLaTeX | 需要 CJK 宏包,兼容性差 | 不支持 | 纯英文旧模板,不推荐新文档使用 |
| XeLaTeX | 原生支持,配合 ctex/xeCJK 效果极佳 | 支持 | 中英文混排论文、学位论文、期刊投稿 |
| LuaLaTeX | 原生支持,功能更强 | 支持 | 复杂排版,需要 Lua 脚本时 |
实际写作中,xelatex是最稳妥的选择,因为ctex宏包对 XeLaTeX 的支持最完善,学校模板里要求的宋体、黑体、Times New Roman 都可以直接映射到系统字体。不要因为听说 LuaLaTeX 很强大就一头扎进去,论文写作这种场景,稳定压倒一切。
2.2 ctex 宏包的工作方式与中文字体
ctex宏包的核心价值是把“中文字体选择、标点压缩、段落缩进、章节标题中文化、国标字号”这些事一次性做完。最基础的用法是:
\documentclass[UTF8, fontset=mac, zihao=-4]{ctexart}这里几个选项拆开讲:
UTF8:源文件编码,现代 macOS 上保存的.tex文件默认就是 UTF-8,显式声明能让编辑器和其他协作工具都明确这一点。fontset=mac:让 ctex 自动使用 macOS 的系统字体,宋体对应 Songti SC,黑体对应 Heiti SC,楷体对应 Kaiti SC。如果你没有完整的中文字体库,把这里改成fontset=fandol,ctex 会自动改用 Fandol 开源字体,效果也完全能打。zihao=-4:让正文使用“小四”字号。\zihao是 ctex 提供的中文字号命令,-4表示小四,4表示四号,这对国内学位论文的版式要求特别友好,比12pt这种西文字号表达更精确。
如果你需要单独控制中文字体和西文字体,比如中文宋体、英文 Times New Roman,可以在 preamble 里这样写:
\usepackage{fontspec} \setmainfont{Times New Roman} \usepackage{xeCJK} \setCJKmainfont{Songti SC}这里最容易犯的错是“只设置了\setmainfont,却不设置\setCJKmainfont”。结果英文正常、中文变成系统默认字体甚至直接报错,因为\setmainfont只会影响西文字体,中文字体必须交给xeCJK去处理。你可以把xeCJK理解为“中文字体分流器”,它在 XeLaTeX 编译时把每个汉字按你指定的话字体渲染,英文部分仍然走fontspec的路线。
2.3 论文常见的页面版式参数速查
写论文时,学校给的版式要求通常是“上 2.5 cm,下 2.5 cm,左 3 cm,右 2.5 cm,正文小四,行距 1.5 倍”。这些要求可以精确地用geometry和setspace实现:
\usepackage[a4paper, top=2.5cm, bottom=2.5cm, left=3cm, right=2.5cm]{geometry} \usepackage{setspace} \onehalfspacing下面这个表是我自己在多个学校模板里整理出来的版式参数,可以直接对应成 LaTeX 配置:
| 版式要求 | Word 里的说法 | LaTeX 里的写法 |
|---|---|---|
| 正文大小 | 小四号字 | \documentclass[zihao=-4]{ctexart} |
| 章节标题 | 黑体三号 | \zihao{3}\heiti{...} |
| 页边距 | 上2.5 下2.5 左3 右2.5 | \usepackage[margin...]{geometry} |
| 行距 | 1.5 倍行距 | \usepackage{setspace}+\onehalfspacing |
| 段首缩进 | 首行缩进两字符 | \parindent=2em |
需要提醒的是,右2.5cm并不是所有学校都要求,有的模板要求“左 2.5、右 2.5、上 3、下 3”,所以写模板时最好先确认学校的规范文档,再调整geometry参数,不要直接抄别人的数值。另外一个细节是,ctexart默认已经为章节标题做了中文字号处理,不要画蛇添足地再加载titlesec去手工改格式,除非你很清楚自己在干什么。
3. 论文结构:标题、摘要、正文、图表与参考文献
3.1 推荐的项目目录结构
本地写论文不是写 Hello World,几十章内容堆在一个文件里,编译速度会变慢,定位问题也会很痛苦。我长期使用的结构是这样的:
thesis/ ├── main.tex ├── refs.bib ├── chapters/ │ ├── ch01-introduction.tex │ ├── ch02-related-work.tex │ ├── ch03-method.tex │ ├── ch04-experiment.tex │ └── ch05-conclusion.tex ├── figures/ │ ├── architecture.png │ └── result.pdf └── settings.jsonmain.tex只放文档类和 preamble,正文用\include按章引入,这样每一章可以独立编辑,编译时也可以只编译当前章节来做局部调试。figures/单独放图,方便统一管理图片格式和命名。refs.bib放参考文献条目,使用 BibLaTeX 管理,后面 3.5 小节会细说。
3.2 主文档模板:一份可以直接套用的 preamble
下面这份 preamble 覆盖了前两章讲到的中文字体、页边距、行距、图表宏包和参考文献配置,你可以直接复制到main.tex里使用:
\documentclass[UTF8, fontset=mac, zihao=-4]{ctexart} \usepackage[a4paper, top=2.5cm, bottom=2.5cm, left=3cm, right=2.5cm]{geometry} \usepackage{setspace} \onehalfspacing \usepackage{amsmath, amssymb} \usepackage{graphicx} \usepackage{booktabs} \usepackage{longtable} \usepackage{caption} \usepackage[backend=biber, style=gb7714-2015]{biblatex} \addbibresource{refs.bib} \title{你的论文标题} \author{你的姓名} \date{\today} \begin{document} \maketitle \include{chapters/ch01-introduction} \include{chapters/ch02-related-work} \include{chapters/ch03-method} \include{chapters/ch04-experiment} \include{chapters/ch05-conclusion} \printbibliography[heading=bibliography] \end{document}这段代码有一个细节需要特别留意:\include会在每个被引入文件前自动执行\clearpage,章节会从新的一页开始。如果学校要求章节之间不换页,比如有些期刊投稿需要单栏连续排版,那你应该用\input而不是\include。\input只是把文件内容“拼接”进来,不会分页,适合要求紧凑排版的模板。我在给期刊投稿时通常用\input,写学位论文时用\include,这两者之间的选择本身就是排版需求的一部分。
3.3 中英文标题、作者、机构、摘要与关键词
国内期刊投稿最常见的排版要求是“标题、作者、机构、摘要、关键词单栏排版,正文单栏或双栏”。ctexart默认就是单栏排版,所以直接按顺序写就行。很多学校或期刊要求同时提供中英文双摘要,我的做法是直接复用abstract环境写两次,中文一段、英文一段:
\begin{abstract} 本文提出了一种基于……的方法。实验结果表明…… \textbf{关键词:}中文关键词A;中文关键词B;中文关键词C \end{abstract} \begin{abstract} This paper proposes a method based on ... Experimental results show ... \textbf{Key words:} keyword A; keyword B; keyword C \end{abstract}\textbf{关键词:}这种写法比较朴素,但很稳定。如果你希望“关键词”三个字和后续内容之间有更规范的间距,可以自定义一个简单的关键词环境:
\newcommand{\keywords}[1]{\par\noindent{\bfseries 关键词:}#1\par} % 使用时 \keywords{中文关键词A;中文关键词B;中文关键词C}页面顶部作者信息如果有多位作者、多个机构,常见做法是使用\thanks{}或者自定义\affiliation命令。简单场景下用\author{姓名}就够了,多机构场景我建议直接在小标题后面加脚注,或者改用学校的 LaTeX 模板,因为期刊对不同机构的编排格式差异很大,自己硬造很容易不符合要求。这里有一个很实用的技巧:如果你的模板要求“标题、作者、机构”居中,而摘要和关键词要左对齐或单栏显示,可以用\begin{center}包裹标题块,摘要与关键词则放在普通段落里,不需要额外塞center环境。
3.4 图表排版:图片位置、跨页表格与三线表
图片和表格是 LaTeX 新手最容易失控的地方。我在知乎上看到的提问里,十个有八个是“图片为什么不在我放的位置”。图片默认是浮动体,LaTeX 有一套自己的排版算法:图片会按htbp优先级移动到合适的位置,而不是你代码里写哪就是哪。正确用法是:
\begin{figure}[!htbp] \centering \includegraphics[width=0.8\linewidth]{figures/architecture.png} \caption{系统架构图} \label{fig:architecture} \end{figure}这里的!htbp含义是:优先放在当前位置(here),如果放不下就放到顶部(top)、底部(bottom),最后再放到单独的一页(page)。加上!是让 LaTeX 放宽位置限制。完全不建议使用[H]强制固定位置,虽然float宏包提供了这个选项,但很容易导致浮动对象顺序错乱,图表编号和正文引用对不上,这在长论文里是灾难性的体验。实在需要强制位置,我建议检查图表大小,或者用\clearpage控制当前页内容,而不是硬卡浮动物体。
表格方面,中文学位论文普遍要求“三线表”,也就是只有顶线、栏目线、底线,没有纵向分隔线。用booktabs宏包实现:
\begin{table}[!htbp] \centering \caption{实验结果对比} \label{tab:result} \begin{tabular}{lccc} \toprule 方法 & 准确率 & 召回率 & F1 \\ \midrule 方法A & 0.82 & 0.79 & 0.80 \\ 方法B & 0.85 & 0.83 & 0.84 \\ \bottomrule \end{tabular} \end{table}跨页长表格使用longtable宏包,它能自动把表格拆分到多页并重复表头,这是tabular做不到的。用法也简单,把table环境换成longtable,然后写\endhead声明重复表头的内容即可。如果你需要在表格里插入公式,直接在单元格里写$...$没有问题;但如果整列表格都需要比较宽的公式,建议缩小字号或改用p{}参数控制列宽。
3.5 参考文献:biblatex + biber + gb7714-2015
参考文献是论文写作里最不能出错的环节。老式的BibTeX配合\bibliographystyle也能用,但对中文参考文献和著者-出版年制的支持很差。我强烈建议新项目直接使用biblatex加biber后端,配合中文期刊常用的gb7714-2015样式:
\usepackage[backend=biber, style=gb7714-2015]{biblatex} \addbibresource{refs.bib}refs.bib里的内容直接用 BibTeX 格式维护:
@article{li2023method, author = {李雷 and 韩梅梅}, title = {基于深度学习的自然语言处理方法}, journal = {计算机学报}, year = {2023}, volume = {46}, number = {2}, pages = {123-135} }正文里用\cite{li2023method}引用,文末用\printbibliography输出参考文献表。这个组合最核心的优势是:引用数据与正文完全分离,改引用样式只需要改style参数,不用动正文。比如从著者-出版年制换成顺序编码制,只需要把style=gb7714-2015换成style=gb7714-2015ay再重新编译即可。
需要特别注意的是,biber不是bibtex,编译链不要搞混。我第一次配这个组合时,默认跑的是bibtex,结果refs.bib解析失败,所有引用都变成[?],排查了好一会儿才发现是编译配方里少了biber。后面第 4 章的自动编译配方会把biber加进去,这里先记住:用了 biblatex,就必须跑 biber。
3.6 图表编号与交叉引用
图表插入后,一定要用\label和\ref做交叉引用。比如你在正文里写“如图\ref{fig:architecture}所示”,编译后会自动显示“如图 1 所示”。这个机制是 LaTeX 相比 Word 最大的效率优势:你插入一张图片、调整章节顺序、删掉一个表格,编号会自动更新,绝不会出现“图 3 引用指向图 5”的乌龙。
使用\ref有一个前提:编译至少两遍。第一遍写.aux文件记录编号,第二遍才能读取编号并替换引用。所以新手如果看到??,第一反应不应该是代码写错,而是“我只编译了一遍”。后面用latexmk自动多次编译就能彻底解决这个问题。交叉引用还有一个进阶技巧:使用cleveref宏包可以自动生成“图 1”“表 2”这样的前缀,中英文文档都支持,但需要注意它和个别模板宏包的兼容性,我通常只会在自己没有强模板要求的小项目里用。
4. 编译提效:自动化编译与辅助文件清理
4.1 LaTeX 为什么要编译多次:latexmk 自动化解法
上面提到交叉引用需要多编几次,实际上一次常规编译产生的文件之间是有依赖关系的。引用、目录、参考文献、图表列表都会生成.aux文件,再被下一次编译读取。如果没有自动工具,我会运行xelatex main.tex、biber main、xelatex main.tex、xelatex main.tex四连击,非常容易漏。
latexmk就是解决这个问题的工具。它会在后台监听你的.tex文件变化,自动判断需要执行多少次编译器调用。直接命令行运行:
latexmk -xelatex -synctex=1 -interaction=nonstopmode main.tex-xelatex让它调用 XeLaTeX,-synctex=1开启源码与 PDF 的同步定位,-nonstopmode让编译遇到错误时不弹交互窗口直接退出。如果参考文献使用biber,你需要在latexmkrc配置文件里加一行:
$biblatex = 1;这样latexmk就会自动把biber加入编译链,全程无需手动干预。
4.2 LaTeX Workshop 自动化配置实操
VS Code 里最舒服的用法是把latexmk或四连击固化为配方,然后一键编译。以下是一份我长期使用的settings.json配置:
{ "latex-workshop.latex.recipes": [ { "name": "xelatex -> biber -> xelatex -> xelatex", "tools": ["xelatex", "biber", "xelatex", "xelatex"] } ], "latex-workshop.latex.tools": [ { "name": "xelatex", "command": "xelatex", "args": [ "-synctex=1", "-interaction=nonstopmode", "-file-line-error", "%DOC%" ] }, { "name": "biber", "command": "biber", "args": ["%DOC%"] } ], "latex-workshop.latex.clean.fileTypes": [ "*.aux", "*.log", "*.bbl", "*.blg", "*.out", "*.toc", "*.lof", "*.lot", "*.fls", "*.fdb_latexmk", "*.synctex.gz" ], "latex-workshop.view.pdf.viewer": "tab" }%DOC%是 LaTeX Workshop 的占位符,代表当前打开的.tex文件路径。编译时它会按顺序执行:xelatex编译、biber解析参考文献、再一次xelatex读取引用编号、最后一次xelatex稳定目录。之后每次保存文件,扩展都会自动重新编译并刷新 PDF 预览,基本把“编译”这件事变成了下意识动作。
工具栏里的清理命令对应上面第 5 个配置项,它会在项目目录中删除列出的辅助文件,让整个目录恢复到无编译残留的状态。这里我要特别推荐你在打完最终版 PDF 后执行一次清理,原因下面细说。
4.3 辅助文件清理:那些 .aux、.log、.synctex 是干嘛的
每次编译都会生成一堆“辅助文件”,它们不是论文内容,但却是 LaTeX 正常工作所必需的中间产物:
| 后缀 | 用途 | 能否删除 |
|---|---|---|
.aux | 交叉引用信息 | 可删,编译会重新生成 |
.log | 编译日志 | 可删 |
.toc/.lof/.lot | 目录、图表目录 | 可删,编译重新生成 |
.bbl/.blg | 参考文献排版与日志 | 可删 |
.synctex.gz | 源码与 PDF 双向定位 | 可删,失去正反定位而已 |
.fdb_latexmk/.fls | latexmk 状态记录 | 可删 |
这些文件看起来无害,但有两个真实痛点。第一,如果你用 Git 管理论文目录,提交时没清理就把.aux、.log全传上去了,仓库会越来越乱,别人克隆下来还会因为本地版本不同产生一堆无意义的 diff。第二,学校提交论文时通常要求的是.zip压缩包,没清理的文件夹里会混进大量中间文件,压缩包体积变大不说,导师打开后还会看到一堆不明所以的文件。我的习惯是:每次提交前执行latexmk -c,或者直接在 VS Code 命令面板里搜索LaTeX Workshop: Clean up auxiliary files。如果用的命令行,可以执行:
latexmk -c-c只删除辅助文件,保留最终 PDF;-CA会连 PDF 一起删掉,适合你确认最终版已经另存在别处时使用。
4.4 正反向定位:SyncTeX 提升编辑效率
写长论文时,经常需要在 PDF 里看到某段文字,然后立刻跳回源码修改;或者改完源码,想直接看 PDF 对应位置。SyncTeX 就是干这个用的。编译参数里已经加了-synctex=1,所以 PDF 已经携带同步数据。在 VS Code 的 LaTeX Workshop 预览窗口里,按住Cmd键点击 PDF 任意位置,光标会自动跳到源码对应行;反过来,在源码界面按Cmd + Option + J(或者使用扩展命令 “SyncTeX from cursor”)可以将当前行高亮并跳转到 PDF 对应位置。
正反向定位对论文调试的意义很大,尤其是图表编号、参考文献引用这类需要来回核对的内容。我在改第三章实验数据时,几乎全程用这个功能,省去了反复滚动查找的体力劳动。如果你用的是 TeXShop 或其他编辑器,Cmd + 鼠标点击的基本逻辑也大同小异,核心都是生成.synctex.gz文件。
5. 常见问题与避坑实录
5.1 中英文适配类报错速查
| 错误信息 | 原因 | 解决方案 |
|---|---|---|
Package ctex Error: CTeX fontset mac is unavailable | 系统缺少指定中文字体 | 把fontset=mac改成fontset=fandol,或安装中文字体 |
xeCJK Error: \setCJKmainfont not supported | 忘记使用 XeLaTeX/LuaLaTeX 编译 | 编译配方里的引擎换成xelatex |
| 中文正常但英文怪怪 | 只设置了\setCJKmainfont,没设置西文字体 | 用fontspec的\setmainfont{Times New Roman} |
| 中文引号、标点显示为半角 | 字体不支持全角标点或ctex选项被覆盖 | 不要手写全角标点,直接用中文输入法;不要加载冲突的标点宏包 |
“CTeX fontset mac is unavailable” 是我见过最多的一个报错。这一般不是代码问题,而是系统里真的没有对应字体。macOS 宋体族的 PostScript 名称是Songti SC,但如果你的系统是精简版或者字体被清理过,XeLaTeX 就搜不到。最省事的解决办法是fontset=fandol,fandol字体是 ctex 宏包内置的开源中文字体方案,无需自己安装,离线也能用。唯一的代价是字体观感和系统宋体略有差异,但论文评审判断不出区别。
5.2 编译过程类报错速查
| 错误信息 | 原因 | 解决方案 |
|---|---|---|
File 'xxx.cls' not found | 没有安装或找不到文档类 | 用tlmgr install ctex,或路径没包含模板文件夹 |
LaTeX Error: Unknown option 'UTF8' | 文档类不支持 UTF8 选项 | 换用ctexart,或删掉UTF8选项(新版本默认 UTF-8) |
Citation 'xxx' undefined | .bib条目不存在或biber没跑 | 检查refs.bib内 key 是否一致,确保编译链含biber |
Reference 'fig:xx' undefined | 没编译两遍或\label没写 | 用latexmk多次编译,检查\label是否在\caption之后 |
Runaway argument?等解析错误 | 大括号未闭合 | 用编辑器的括号高亮逐层检查 |
最典型的“Citation undefined”问题,我在第 3.5 小节已经预告过:用biblatex就必须在编译链中插入biber。很多人把 Overleaf 的全自动编译习惯搬到本地,以为自己执行了一次xelatex就万事大吉,结果参考文献全部变成[?]。所以我倾向于不用默认的 “latexmk” 配方,而是明确写上xelatex -> biber -> xelatex -> xelatex,每一步都在日志里能看到,出问题也好排查。
5.3 字体与模板类报错速查
| 错误提示 | 原因 | 解决方案 |
|---|---|---|
The font ... cannot be found | 指定了系统中不存在的字体名 | 用fc-list查看实际字体名,确认大小写和空格 |
Undefined control sequence \keywords | 文档类不提供关键词命令 | 自己定义\keywords命令,或用abstract环境自写 |
Creating PDF failed | 编译链路中断或宏包报错 | 查看.log文件定位真正错误行,不要只看最终提示 |
字体名大小写问题非常隐蔽。macOS系统字体在“字体册”里显示的是 “Songti SC”,但在 XeLaTeX 的字体搜索列表里,名称可能全部小写为 “Songti SC” 不一定可靠。我可以教大家一个验证命令:
fc-list | grep -i "songti"如果没有任何输出,说明系统字体库中找不到宋体;如果有输出,看第一列的字体路径和字体名,把实际显示的名字写进\setCJKmainfont。这里有个坑是:某些字体族可能叫 “Songti SC” 也可能叫 “Songti SC Regular”,原则上应该填写族名而不是字重全名,fc-list输出的通常是族名和字重的组合,你需要把 “Regular” 去掉再试。我在这上面浪费过半小时,最后发现只是字体名多写了一个 “Regular”。
5.4 我的几则真实踩坑经验
再分享两个没写在报错表里的经验。
第一个是关于“模板路径”的。很多期刊会给一个.cls文件,比如ieeeconf.cls。新手往往把它放到和main.tex同一级目录下,然后写\documentclass{ieeeconf},理论上没问题。但如果模板解压出来的.cls和.sty文件很多,放在根目录会让项目混乱,而且如果\include的章节里有相对路径,图片经常加载失败。我的做法是:保持模板文件结构不动,在main.tex里用\documentclass{./template/ieeeconf}这种方式指定相对路径,或者把模板目录加入TEXINPUTS环境变量。前者直观,后者一劳永逸。建议你拿到模板后先花五分钟读下README,看看有没有安装说明,不要硬猜。
第二个经验是“中英文期刊模板的字体替换”。部分 CCF 推荐期刊的中文模板已经默认配置好了一切,但英文模板里如果包含\usepackage{times},在 XeLaTeX 下会失效,因为times宏包是针对 pdfLaTeX 的。正确做法是改用fontspec:
\usepackage{fontspec} \setmainfont{Times New Roman}这就是我前文反复强调的:西文字体统一交给 fontspec,中文字体统一交给 xeCJK,两者不要混用。一旦理解了这个分工,绝大多数中英文排版问题都能靠调整这两个包的配置来解决。
最后再分享一个我个人的小习惯:每次交论文前,我会在项目目录里跑一遍latexmk -c清理所有辅助文件,再把整个文件夹打包发给对方。收到的人解压后直接编译就能出 PDF。这套流程帮我在三个实验室之间传模板时几乎没出过差错。如果你也打算在 macOS 上长期写论文,把这套流程跑通,以后从开题到投稿都能把精力放在内容本身,而不是排版工具上。