ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Overleaf 中文文档排版实战:XeLaTeX、ctex、字体与修订模式

Overleaf 中文文档排版实战:XeLaTeX、ctex、字体与修订模式 1. 中文文档放到 Overleaf 上先把三件事想明白1.1 真正卡住你的不是 LaTeX 语法而是编译链路大多数人第一次在 Overleaf 里写中文文档遇到的症状无非三种编译能过但中文全部消失或者变成空白方块一编译就红字报错日志里翻来覆去说某个字体找不到还有一种是中文能出来但标点、缩进、行距全都不对看着像排版软件出了故障。这三种现象看起来很像是Overleaf 不支持中文实际上根源都在同一条链路上引擎选错了字体没接上版式没人管。LaTeX 本身只是一套描述排版的标记语言真正把 .tex 文件变成 PDF 的是编译引擎。老牌的 pdfLaTeX 按单字节编码理解输入遇到 UTF-8 编码的中文字节会直接读不懂只能靠年代久远的 CJK 宏包配位图字库硬撑出来的中文放大之后边缘发虚。XeLaTeX 和 LuaLaTeX 才是一路走 Unicode 的引擎能直接吃 UTF-8 文本也能调用系统里安装的 TrueType、OpenType 字体。所以在 Overleaf 上写中文第一个动作就是把编译器切到 XeLaTeX这一步没有例外也没有替代方案。字体这一环更值得提前想清楚。英文文档能一直用默认的 Computer Modern是因为这套字体跟着 TeX 发行版一起分发永远找得到中文字体动辄十几兆不可能全塞进去。Overleaf 服务器上实际兜底的是一套体积极小的开源中文字体 Fandol分成宋、黑、楷、仿宋四款。它的优点是永远存在、不挑环境缺点是字库不全——生僻字、部分全角符号会缺而且字重很少。想用思源宋体、思源黑体这类更完整的字体要么确认服务器上已经装了要么自己上传字体文件。这个判断会直接影响后面第三章的所有写法。1.2 什么内容值得搬到 Overleaf什么内容留在别处更省事我不太赞成把要不要用 LaTeX讲成一个立场问题它更像一次成本核算。公式多、交叉引用多、图表编号要求严、有现成的期刊或学校模板、需要长期维护和版本回溯这几条占了两条以上Overleaf 的收益就很明显如果文档主要是大段文字加几个简单表格而且需要别人直接在稿子上划改那留在原来的工具里效率更高。场景特征更适合 Overleaf更适合常规文字处理工具公式与符号数量多、需要自动编号与引用零星几个手动敲也能接受图表编号需要图 3-2式 (2.5)这类自动编号编号固定不需要频繁增删协作者多人同时在线改同一份文件一个人交付别人只审阅审阅方式评论、版本对比、宏包留痕直接在文字上批注、划删除线长期维护需要半年一年后还能改得动一次成稿交付即结束真正需要提前想清楚的是审阅环节的衔接。如果合作方只在 PDF 上做批注或者习惯用修订模式直接在正文上改字你就要准备好两条出路一条是把修改留痕做进 PDF 里另一条是把版本对比讲清楚。这两条路在第五章会展开。1.3 免费额度够不够用先算清楚账Overleaf 的免费档能建无限项目、能在线编译、有完整的版本历史这一点对个人写论文完全够用。会被卡住的地方主要有两处一是协作者名额有限免费档大概只能加一名协作者多人协作的项目要提前规划谁来做那个名额二是编译超时比较短粗略在二十秒这个量级具体数值以官网套餐页为准因为不同时期会有调整。超时这件事的实际影响比想象中大。一份带几十张高清位图、若干张 tikz 绘图、正文几万字的学位论文完整编译一遍很容易顶到超时线然后你就看到一个没有报错信息的失败提示。应对办法很朴素插图先压缩到够用的分辨率、把正文按章拆成多个文件、用只编译当前章节的方式绕开全文开销。这些具体做法放在第六章。提示套餐内容和额度会变动动手之前先在自己的账号里确认一次别照搬别人两年前的经验。2. 从新建项目到第一个正常显示的中文字符2.1 编译器设置菜单里那一次切换决定后面所有事新建一个空白项目之后先别急着敲内容。左上角打开 Menu进 Settings找到 Compiler 一项把默认的 pdfLaTeX 改成 XeLaTeX回到编辑器点一次 Recompile。如果你是用某个模板创建的项目模板通常会带上自己的编译器设置但空白项目基本都会落到 pdfLaTeX所以这一次手动确认不能省。有个反复出现的新手操作值得提前拦住一看到中文不显示就去搜中文乱码怎么解决照着几年前的老帖子往导言区加\usepackage{CJK}或者\usepackage[utf8]{inputenc}。在 XeLaTeX 下这两个都不该出现——前者会和 ctex 直接打架后者在 Unicode 引擎下没有意义有时还会刷一堆警告。正确的做法是中文字体相关的宏包一个都别手动加全部交给 ctex 处理需要微调时再用它提供的接口。2.2 ctexart 还是\usepackage{ctex}两种写法怎么选ctex 提供两条接入路径选错不会报错但会在后面埋下格式不统一的问题。% 路线一直接用中文文档类适合从零写一份中文文档 \documentclass[UTF8, a4paper, zihao-4]{ctexart} % 路线二把中文能力挂到英文文档类上适合套用已有英文模板 \documentclass{article} \usepackage[UTF8]{ctex}路线一的ctexart自带一整套中文版式段落首行自动缩进两字符、章节标题的中文命名、图与表的题注自动是图 1表 1、abstract 环境输出摘要标题。路线二适合期刊或学校给了英文模板、你只需要在里面插几段中文的情况。两者的差别还体现在配套文档类上ctexrep对应带 chapter 的报告结构ctexbook对应书籍和学位论文页码、版心、章节样式都预设好了。我的建议是自己从零开始写就用ctexart套模板就用\usepackage{ctex}两件事不要同时做。文件里同时出现\documentclass{ctexart}和\usepackage{ctex}的情况我见过不止一次编译不报错但格式会互相覆盖改起来特别费劲。2.3 一份能直接跑起来的最小骨架下面这份骨架我用了很久复杂度刚好卡在能跑、能改、不啰嗦的位置你可以直接抄。\documentclass[UTF8, a4paper, zihao-4]{ctexart} \usepackage{geometry} \geometry{left2.5cm, right2.5cm, top2.5cm, bottom2.5cm} \usepackage{graphicx} \usepackage{booktabs} \usepackage{amsmath} \usepackage[unicode]{hyperref} \title{一个中文文档的最小示例} \author{某某} \date{\today} \begin{document} \maketitle \begin{abstract} 这里写中文摘要。段落直接空行分段首行缩进由 ctex 自动处理 不需要手动敲空格。 \end{abstract} \noindent\textbf{关键词} 中文排版XeLaTeX文档协作 \section{引言} 你好世界。这是中文正文标点、缩进、换行都由宏包接管。 \end{document}逐行说几个容易忽略的点。zihao-4表示正文小四号负号代表小字头字号写成zihao4就是四号两者视觉差挺明显。geometry负责版心中文论文常见的左右上下各 2.5 到 3 厘米学校有明确要求就照要求改。\usepackage[unicode]{hyperref}是让 PDF 书签和内部链接正常中文书签在 XeLaTeX 下能正确显示这是它相对 pdfLaTeX 的又一个好处。关键词这一行我刻意手写而不是引用命令。原因很简单\keywords{}这类命令是期刊模板或学位论文模板自己定义的ctexart不一定提供。套模板时用模板定义的命令自己写就手敲一行加粗文字别去猜哪个命令存在。2.4 项目文件怎么拆直接影响你后面能不能改得动单文件写到一两百行的时候还舒服写到上千行就开始难受了定位一个章节要滚半天编译一次要等全部内容。推荐的目录结构是主文件加分类文件夹main.tex放导言区和\input调用chapters/放各章正文figures/放插图refs.bib放文献库fonts/放自己上传的字体。正文用\input{chapters/ch1}或\include{chapters/ch1}引入。两者有个关键差别\include会从新的一页开始并在目录里单独生成辅助文件\input就是纯粹把内容插进来。所以正文分章用\include零碎的小节或者表格片段用\input。好处是\include能配合\includeonly使用\includeonly{chapters/ch3} % ... \include{chapters/ch1} \include{chapters/ch2} \include{chapters/ch3}这样整篇文档的编号、目录、交叉引用都还在但只有第三章会被实际排版编译时间能砍掉一大半。这是免费档对付超时最有效的一招。注意两个细节第一次用之前要全量编译一次保证各章的辅助文件都齐全否则交叉引用会显示成问号\includeonly里的路径写法要和\include里完全一致大小写敏感。3. 字体、标点、行距中文排版真正容易翻车的地方3.1 Overleaf 上开箱能用的中文字体Fandol 系列是默认兜底四款对应宋体、黑体、楷体、仿宋并且都带常规和粗体两个字重所以中文加粗不会变成伪粗体这一点比很多自带字体方案都强。ctex 默认把正文中文设成 FandolSong把\heiti之类的字体切换命令也接好了你直接写{\heiti 这段是黑体}就能用。想显式指定字体用下面这段\setCJKmainfont{FandolSong-Regular} % 正文中文宋体 \setCJKsansfont{FandolHei-Regular} % 无衬线黑体 \setCJKmonofont{FandolFang-Regular} % 等宽风格仿宋字体名的写法是个常见的坑FandolSong-Regular不是Fandol Song中间没有空格用短横线连接。写错之后日志会报Font xxx not found之类的信息但这时日志里可能同时有好几条提示新手很容易看不出是哪一条在起作用。真找不到原因时在完整日志里搜Font关键字一般都能定位。至于思源系列的 Noto Serif CJK SC、Noto Sans CJK SC在不少 TeX Live 环境里是预装的但不同版本包含情况不完全一样。稳妥做法是先试着调用一次报错就退回 Fandol 或者自己上传字体别在字体上耗太久字体问题影响的只是观感不影响文档能不能交出去。3.2 上传自己的字体路径、命名与两个高频错误上传路径是文件树左上角的上传按钮把 .otf 或 .ttf 文件传进来建议统一放在fonts/目录下。然后这样调用\setCJKmainfont[ Path ./fonts/, BoldFont SourceHanSerifSC-Bold.otf, ItalicFont SourceHanSerifSC-Regular.otf ]{SourceHanSerifSC-Regular.otf}第一个高频错误是Path结尾漏了那个斜杠./fonts和./fonts/在处理上不是一回事漏了就会去找一个叫 fonts 的文件而不是目录。第二个是相对路径的基准点它相对的是主 tex 文件所在目录不是当前正在编辑的那个子文件所在目录。项目一旦拆成多文件这一点尤其容易搞混。还有一条命名规则要记住字体名写成不带扩展名的形式fontspec 会去系统已安装字体里找带上.otf或.ttf扩展名它才按文件路径找。两种写法混着用是字体明明传上去了却说找不到的最主要来源。如果某个字只有一个字重的文件正文里的加粗就会靠引擎伪造可以在方括号里加AutoFakeBold2.5。伪粗体在小字号屏幕上差别不大放大打印会显得糊正式提交前最好换成真粗体文件。另外别上传.ttc字体集合文件fontspec 对它支持有限先用工具转成单独的.ttf或.otf更省心。3.3 标点、断行与中西文之间的那点缝隙中文标点的处理是很隐形的一层。xeCJK 默认把全角标点做成会压缩的版本行末的句号、逗号会紧贴文字占半格左右ctex 默认用的是整角样式。如果模板要求标点居中排列可以在文档类选项里加punctkaiming切换成开明样式。这一项改完视觉差别挺明显但除非模板明确要求一般不用动。断行才是真正会把你搞烦的地方。中文没有空格也不像英文那样用连字符断词所以一行里出现长串英文单词、长 URL、长公式就会顶出行宽日志里刷出一堆Overfull \hbox。三种处理方式按场景选长网址用\usepackage{url}加上\url{}它会自动在合适位置断开长英文术语可以在允许断开的位置手加\-整段就是排不下在该段前加一个\sloppy放宽断行容忍度代价是行内字距会松用在一段里可以别全局开。中西文之间默认会自动插入很小的弹性空隙这是 xeCJK 的默认行为观感上比手动敲空格自然得多也因此不要在中文和英文之间手动敲空格会和自动间距叠加出难看的缝。公式里要出现中文用\text{中文}包起来最稳如果确实需要也可以开\xeCJKsetup{CJKmathtrue}让数学模式里能直接写中文但公式里出现中文本身就该尽量避免变量名用英文或希腊字母才是规范做法。3.4 首行缩进、行距和一套够用的字号对照ctexart的默认版式已经做了两件事段落首行缩进两字符段间距为零。这套设定符合绝大多数中文文档的习惯所以你不需要写任何\indent或手动空格。需要临时取消缩进时用\noindent比如关键词那一行。行距是学校要求里最容易卡人的一项常见要求是 1.5 倍或者固定值二十磅左右。用\usepackage{setspace}加\onehalfspacing实现比较稳妥它通过调整基线间距工作中文行距会整体等比放大比直接改\linespread更好控制。字号方面 ctex 提供了符合中文习惯的命令负数代表小字头命令字号常见用途\zihao{-2}小二论文标题\zihao{3}三号一级标题\zihao{4}四号二级标题\zihao{-4}小四正文\zihao{5}五号图表题注、脚注顺手提一句\zihao只在 ctex 体系里有效套用纯英文模板又加载了 ctex 宏包的情况下也能用但别和\fontsize{12pt}{18pt}\selectfont这类写法混着改同一处文字否则会出现改了没反应或者只有一半文字变了的现象。4. 论文和报告里的常见部件怎么拼4.1 封面、摘要、目录三件套简单封面用\maketitle配\title、\author、\date就够了学校要求逐行居中、带校徽、带学号那种用titlepage环境手工排或者直接用学校的模板别自己从零造。摘要用abstract环境ctex 会自动输出摘要两个字作为标题。需要摘要单独占一页就在它前后加\newpage。目录是\tableofcontents图表清单是\listoffigures和\listoftables。有个现象很多人第一次遇到会慌刚插入了新章节编译之后目录里却没有。原因是目录依赖上一次编译写下的辅助文件需要再编译一遍才更新。Overleaf 在检测到交叉引用变化时会自动多跑几遍但偶尔会滞后一次手动点一次 Recompile 基本都能解决。真正需要担心的是目录一直显示问号那说明辅助文件里没有对应的标签通常是把\label写在了\section之外或者路径写错。4.2 图表与题注中文表格最容易溢出行宽插图先上传文件位图用 png矢量图优先用 PDF正文插图 600dpi 已经足够再高只是徒增编译时间。写法是浮动体figure加\caption加\label正文里用\ref引用。题注不用手写图 1ctex 已经把\figurename设成图所以\caption{实验装置示意}最终出来是图 1 实验装置示意编号也自动维护。表格是中文文档里最容易翻车的一类。中文没有断词点一列文字稍长就会把表格顶出行宽日志里刷Overfull \hbox。解决办法是不要用固定宽度的普通表格改用tabularx让它自动分配列宽\usepackage{booktabs, tabularx} \begin{table}[htbp] \centering \caption{三种方案对比} \begin{tabularx}{\textwidth}{lXX} \toprule 方案 优势 局限 \\ \midrule 方案一 排版稳定可长期维护 上手成本高 \\ 方案二 修改直观 复杂公式吃力 \\ \bottomrule \end{tabularx} \end{table}三线表用booktabs的\toprule、\midrule、\bottomrule别用竖线和随意穿插的\hline这是学术排版的通行习惯审稿人看惯了这种版式。{lXX}里的两个 X 表示那两列等分剩余宽度需要列宽不成比例时用{\hsize1.5\hsize}X微调但多数情况下等分就够。4.3 公式编号与中文混排的两个注意事项公式用amsmath提供的环境多行对齐用align引用用\eqref{eq:label}它会自动带上括号。编号形式默认是全篇连续很多学校要求按章编号加一行\numberwithin{equation}{section}就能变成 (2.5) 这种形式。两个容易踩的地方。第一章节标题里不要塞公式和\label尤其用了hyperref的情况下标题参数里的标签会带着一堆符号跑进 PDF 书签目录也会被超长公式挤得没法看。\label单独放在标题下面一行更安全。第二公式里出现中文时一定用\text{}包起来否则字体会被当成数学符号处理某些情况下还会报缺字错误。4.4 参考文献GB/T 7714 怎么落地中文文献的著录格式通常按 GB/T 7714 走实现路线有两条各有各的适用面。路线主要写法适合情况bibtex gbt7714 宏包\usepackage[numbers]{gbt7714}搭配\bibliographystyle{gbt7714-numerical}老模板兼容性好改动小biber biblatex-gb7714-2015\usepackage[backendbiber, stylegb7714-2015]{biblatex}中文排序和细节处理更完整不管走哪条中文条目有一个关键字段不能漏article{zhang2023, author {张三 and 李四}, title {一个中文文献标题}, journal {某学报}, year {2023}, volume {45}, number {2}, pages {100-110}, language {zh} }language {zh}这个字段决定了作者数量超过三个时输出的是等还是 et al.漏了它中文文献会带上英文的省略词评审一眼就能看出来。作者名直接用中文写多人之间用and分隔别用逗号或者顿号。编译上Overleaf 检测到文献引用会自动跑 bibtex 或 biber 并多次编译。如果参考文献没出来先看日志里有没有提示需要重新运行 bibtex 或 biber最常见的原因是刚改了 .bib 但还没触发一次完整编译。另外 .bib 文件必须是 UTF-8 编码从文献数据库导出的条目偶尔编码不对中文会变成乱码导入之后扫一眼就能发现。5. 修订模式在 Overleaf 上给合作者留痕的几种做法5.1 官方的修订与评论功能能用到什么程度Overleaf 编辑器里有一个审阅相关的入口能开启跟踪修改打开之后任何编辑都会以颜色标记出来作者可以逐条接受或者拒绝。这个功能在不同版本里的叫法和可用范围不完全一致能不能看到跟你的套餐和权限有关。界面上没有这个开关说明你的账号没开放别在这个按钮上耗时间直接看下面的替代方案更实际。所有档位都能用的是评论和实时聊天这两样。选中一段文字通过浮动工具栏或右键菜单添加评论右侧评论面板里可以来回讨论问题解决后点 Resolve 归档被评论的文字旁边会留一个小标记。协作者之间还能直接在线聊天适合这一版你先看完我再改这种即时沟通。评论内容不会出现在正文里属于沟通层的东西和正式留痕是两回事。注意开启跟踪修改不等于导出 PDF 就带标记。编辑器里的修订标记通常是界面层的显示导出时往往只输出最终状态。真要给不看源码的人看痕先导出一次确认清楚。5.2 版本历史最省事的修订模式替代品左上角那个时钟图标的 History 面板才是被低估的功能。它按时间列出版本的完整节点点进某个节点能看到当时的样子也能和当前版本做对比看清到底改了哪些行确认无误可以直接回滚到那个版本。已经结束的阶段可以给版本打上标签比如初稿返修前提交版之后想回溯就有锚点不过标签功能在部分套餐里才开放。用 History 做留痕的思路是正文里一个字都不加标记把对比本身当作留痕。改完一轮之后把相差的两个版本对比截图或者把版本号告诉合作者对方打开同一份项目点一下对比就能看到全部改动。这比在正文里插标记干净得多最后交出去的稿子也不会残留任何修改符号。一个实践上的经验History 的对比是按文本行做的如果一次改动把整段重排了对比结果会是一片红绿交错读不出重点。所以改稿时尽量一小段一小段地改改完顺手让它保存一次这样每个版本之间的差异都小而清晰回溯价值才高。反过来如果你习惯攒一大波改动一起提交版本对比基本就废了。5.3 用 changes 宏包把修订直接排进 PDF合作者只认红字删除线加蓝字新增这种观感时最直接的办法是让修订标记出现在 PDF 里。changes宏包就是干这个的\usepackage[draft]{changes} \usepackage{xcolor} \definechangesauthor[name{审阅人}, colorred]{T} % 正文里这样写 这是原有表述\added[idT]{这里是新增的一句} \deleted[idT]{这里是删掉的一句} 也可以\replaced[idT]{新的说法}{旧的说法}。 \listofchanges % 可选在文末列出所有修订记录方括号里的选项决定输出形态三个常用值差别很大选项效果典型用途draft保留删除线和颜色标记发给合作者审阅final只显示接受修改后的内容定稿提交comment在页边补一段批注文字需要解释修改原因这套方案最舒服的地方在于同一份源码改一个选项就能同时产出留痕版和干净版。合作者要看的版本用draft编译导出正式提交用final编译中间不需要在编辑器里关掉什么开关也不存在忘了关修订模式导致稿子里留着删除线这种事。这和常规文字处理工具里接受所有修改之后无法回头查看的状态完全不同你随时可以切换回draft把历史痕迹调出来。要注意它的边界。复杂环境里的增删支持有限删掉整张图、整个表格或者整个章节时容易报错这时候退回用版本历史来说明改动更省事。另外它在行内插入了额外的盒子中文断行可能被影响短句没问题跨行的长段落改完要检查一下行距有没有变得不均匀。5.4 ulem 加自定义命令更轻的替代方案如果改动量不大、只给一两个人看用ulem手搓一套标记反而更灵活\usepackage[normalem]{ulem} \usepackage{xcolor} \newcommand{\del}[1]{\textcolor{red}{\sout{#1}}} \newcommand{\add}[1]{\textcolor{blue}{#1}}正文里写这是\del{旧表述}改成\add{新表述}编译出来就是红删除线配蓝新增。它比 changes 轻依赖少但也少了一键切换接受与拒绝的开关定稿时得把标记手工清掉。改动范围小的时候可以接受改动上百处就不划算了。还有一种更土但极稳的做法是自定义一个开关命令包住修改内容定稿时把开关关掉标记就不参与输出。缺点是切开关的时候容易漏尤其是多人协作、别人也在加标记的情况下。我的经验是只要涉及三个人以上或者改动超过几十处就老老实实用 changes 宏包或者版本对比别靠手工维护标记。5.5 交给不用 Overleaf 的人时怎么选交付格式交付这件事没有万能答案按对方能做什么来选。只要对方看结果直接下载 PDF配合前面说的宏包方案留痕版和干净版各导一份这是最通用的组合。如果对方要在文字上直接划改把 PDF 转成常规文档格式让对方批注你收到之后再手工回填——这种做法在短文档上可行文档一长来回两轮就会失去同步我的建议是尽量别启动这条路。如果对方愿意看源码从下载菜单里导出源码压缩包发过去前提是对方本地装了完整的排版环境否则他连编译都跑不起来。想避免附件来回传可以请对方注册账号做只读协作者但免费档的协作者名额只够放一个人得提前想好名额给谁。至于长期项目我个人的习惯是每隔一段时间把源码压缩包下载一份留档项目历史再完整也多一层物理备份更踏实。6. 编译报错与超时一套按顺序执行的排查动作6.1 先找日志里的第一条感叹号别盯着最后一行Overleaf 的报错面板只显示末尾几行信息量经常不够。点编辑器上方的日志入口打开完整日志在浏览器里搜!从第一条开始看。原因很直接后面的错误大多是第一条引起的连锁反应修掉第一条后面十几条可能一起消失。日志里l.123这种形式会给出出错行号直接跳到那一行去看。新手最常做的事是盯着最后的Emergency stop或者Fatal error occurred研究半天而真正的错在几百行之前。养成从第一条感叹号看起的习惯之后定位时间能从十几分钟压到一两分钟。另外有一个和日志无关但同样常见的现象明明改了内容编译结果没变。这通常是缓存状态不一致到菜单里清一次缓存再重新编译问题一般就消失了。6.2 中文相关报错对照表日志里的关键信息真实原因处理动作Font ... not found或not loadable: Metric (TFM) file not found编译器还停在 pdfLaTeX切到 XeLaTeX 后重新编译Missing character: There is no XXX in font FandolSong-Regular!当前字体缺这个字换字体或检查是否用了不常见的全角符号Package xeCJK Error或宏包冲突提示同时装了老式中文宏包删掉多余的宏包只保留 ctex指向纯中文行的Undefined control sequence复制粘贴带进了不可见字符把那几行删掉重新敲一遍大量Overfull \hbox ... too wide长网址、长公式或宽表格撑破行宽用 url 断行、表格改 tabularxPackage inputenc Error: Unicode character文档里混进了 inputencXeLaTeX 下直接删掉这行TeX capacity exceeded递归定义或超大绘图拆分文件把大图先注释掉定位这张表覆盖了我实际遇到的中文文档报错里的绝大多数。最需要留意的是第二行那个缺字警告它只是警告文档照样能编译出来但缺的那个字会直接空白最容易在定稿之后才发现。如果校名、人名里有生僻字一定要在最终版里逐页核对一遍。6.3 超时和编译速度先找出真正的拖累项编译超时是最让人摸不着头脑的一类失败因为日志里没有报错只有一个失败提示。成因通常就三类插图体积过大、绘图类宏包太重、文档整体太长。定位方法是二分法先把文档后半部分注释掉编译一次能过说明问题在后半部分再继续切一半两三轮就能圈定范围。优化手段按性价比排序位图压到够用的分辨率正文插图 600dpi 已经足够很多人用的是两三千万像素的原图纯属浪费能矢量就别用位图曲线和线条类插图导出成 PDF 体积小一个数量级还不失真正文按章拆分并用只编译当前章节的方式编译时间能砍掉一大半把 Auto Compile 关掉手动编译避免每敲几个字就触发一次完整排版。提示图片文件名别用中文和空格。多数情况能正常识别但遇到特殊字符时会报一些很难理解的错误用 fig1.png 这种纯粹英文加数字的命名最省事。6.4 我固定执行的排查顺序踩过足够多次之后我把排查动作固定成了下面这个顺序基本每次都能在五分钟内定位确认编译器仍是 XeLaTeX。有时候是共享项目里别人改了设置你这边莫名其妙报字体错。打开版本历史和上一个能正常编译的版本做对比看看自己最近动了什么。打开完整日志定位第一条感叹号读l.给出的行号。把除 ctex 之外所有中文相关宏包注释掉编译一次。能过就说明是宏包冲突逐个加回来定位。把出错的那几段单独抽出来新建一个临时项目粘进去编译。最小可复现样本是定位问题最快的办法尤其是在大项目里。前面都无效就在版本历史里回滚到上一个可用版本重新小步修改。关于第 5 步再多说一句。很多人怕麻烦宁愿在主项目里反复试结果每次编译都等几十秒效率反而更低。抽一个最小样本出来编译只要两三秒试错成本几乎为零这是我这些年用得最频繁的一招。另外新建临时项目时记得顺手选一下 XeLaTeX不然复制过去的中文又会消失白折腾一轮。最后分享一个我自己的使用习惯正文里每完成一个小节就让它保存一次改稿阶段的每个版本差异都很小等到需要向合作者解释这一轮改了什么的时候直接在版本历史里点对比比写一段修改说明可靠得多。中文文档的麻烦事基本都集中在字体和编译链路上这两块理顺之后剩下的就是内容本身了。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进