ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Overleaf 常用代码清单:导言区、公式图表、引用与修订模式

Overleaf 常用代码清单:导言区、公式图表、引用与修订模式 在 Overleaf 上写论文或者报告写了半年之后你会发现真正卡住进度的往往不是公式难推、实验难做而是那些琐碎的排版问题中文不显示、图跑了、参考文献一片问号、导师说我看不出你改了哪里。这些问题在搜索引擎里几乎都有答案但答案散落在各种年代久远的页面里不少还是 pdfLaTeX 时代的写法照抄到现在的 XeLaTeX 环境里直接报错。所以我攒了一份自己的 Overleaf 常用代码清单隔一段时间就更新一次把验证过的写法和踩过的坑都记下来。这份更新版主要面向三类人刚接触 Overleaf、想把论文从 Word 迁过来的研究生需要长期维护多个 LaTeX 项目的科研人员以及要给合作者传阅带修订痕迹稿件的团队。内容围绕导言区配置、公式、图表、引用、修订模式和编译排错六块展开下面的代码都是可以直接复制进项目里跑的参数我尽量标了取值范围和适用场景。1. 导言区先定死这十行后面少一半麻烦新手最典型的做法是把某个模板的导言区整段复制过来里面塞了三四十个宏包其中一半根本不认识另一半互相冲突。等到某天想加个表格样式发现和已有宏包打架就要花两小时去断舍离。我的做法是维护一份最小可用的导言区只保留真正会用到的宏包需要什么再加什么。这样做的好处是每次报错范围可控日志里的宏包冲突提示也少。1.1 文档类与编译引擎的绑定关系Overleaf 新建项目默认用 pdfLaTeX 编译这个引擎处理英文没问题但处理中文时需要额外的字体映射配置容易遇到缺字、方框、字体替换的情况。中文项目建议在左上角 Menu 里的 Compiler 选项切到 XeLaTeX它直接调用系统字体Overleaf 的容器里预装了开源中文字体开箱即用。LuaLaTeX 也能用但对宏包的兼容性偶尔不如 XeLaTeX 稳定中文文档我一律优先 XeLaTeX。文档类有两种写法\documentclass[12pt,a4paper]{article}配合\usepackage[UTF8]{ctex}或者直接\documentclass[12pt,a4paper]{ctexart}。两者效果基本等价区别在于 ctexart 已经把中文字体、字号、段落缩进都配置好了少写一行。但如果你的模板是期刊给的 article 类就只能在导言区用 ctex 宏包的方式挂中文支持。% 方案A期刊模板不动加中文支持 \documentclass[12pt,a4paper]{article} \usepackage[UTF8,fontsetfandol]{ctex} % 方案B从零开始写直接用 ctex 文档类 \documentclass[12pt,a4paper]{ctexart}1.2 中文排版ctex 的 fontset 参数到底该选哪个fontset决定了 ctex 用哪一套中文字体可选值有fandol、windows、macnew、ubuntu、adobe、none。这是新手最容易踩的一个坑本地电脑是 Windows习惯性写fontsetwindows传到 Overleaf 上编译立刻报Font SimSun not found。原因是 Overleaf 跑在 Linux 容器里根本没有宋体、黑体这些 Windows 字体文件。fontset 取值适用环境Overleaf 上能否直接用fandol通用开源字体可以推荐默认ubuntu基于 Noto 系列可以windows本地 Windows 系统不可以会缺字体macnew本地 macOS 系统不可以adobe装有 Adobe 字库的环境不可以我的处理方式是双轨制Overleaf 上写fontsetfandol保证随时能编译预览投稿前把这一行改成期刊要求的字体集然后下载到本地用 Windows 或 macOS 环境编译出最终 PDF。这样既不影响日常写作也能满足编辑部对字体嵌入的硬性要求。另外注意如果期刊要求宋体正文、黑体标题fandol 的字形和宋体是有差异的最终稿千万别偷懒直接用 fandol 交上去。1.3 页面、行距与超链接的基础配置页面边距用 geometry 控制写投稿论文时期刊给的模板通常已经设好不要随手改。如果是自己写报告left2.5cm,right2.5cm,top2.5cm,bottom2.5cm是比较通用的取值。行距方面很多人直接用\linespread{1.25}但要注意这个命令必须在\begin{document}之前调用才能全局生效写在中途只影响后面的段落。更稳妥的做法是用 setspace 宏包提供的\onehalfspacing和\doublespacing语义清晰不会算错倍数。超链接由 hyperref 负责加载顺序非常关键它应该放在绝大多数宏包之后越靠后越好因为它会重定义大量内部命令。cleveref 要放在 hyperref 之后否则交叉引用格式会失效。还有一个实际打印时会遇到的问题colorlinkstrue的彩色链接在黑白打印机上会变成灰色正文看起来脏兮兮的。如果是要打印的版本把配色改成深黑或者直接用hidelinks。\usepackage{geometry} \geometry{left2.5cm,right2.5cm,top2.5cm,bottom2.5cm} \usepackage{setspace} \onehalfspacing \usepackage{amsmath,amssymb} \usepackage{graphicx} \usepackage{booktabs} \usepackage{subcaption} \usepackage{float} \usepackage[colorlinkstrue,linkcolorblue,citecolorblue,urlcolorblue]{hyperref} \usepackage{cleveref} % 必须放在 hyperref 之后2. 公式排版从行内 $ 到 align 对齐的取舍公式是理工科文档的主战场也是新手报错最集中的地方。Missing $ inserted这个提示几乎每个写过 LaTeX 的人都见过它的含义很简单你在文本模式下写了只有数学模式才认识的符号比如下划线、尖角号、希腊字母。理解公式的几种环境和它们的适用边界能省掉大量试错时间。2.1 行内与行间公式的选择边界行内公式用一对美元符号$ ... $或\( ... \)它和正文在同一行流动适合表达变量、短表达式比如当温度高于 $T_c$ 时。行间公式用\[ ... \]单独占一行并居中显示适合稍微长一些的表达式。这里有个写作上的经验行内公式不要塞太长的内容一旦公式高度超过一行行距会被撑开整页排版看起来参差不齐审稿人读到这种页面体验很差。带编号的公式用 equation 环境。编号是自动递增的不需要手动维护这也是 LaTeX 相对 Word 最舒服的地方之一。如果你确实需要手动指定编号用\tag{3-1}可以覆盖自动编号这在写毕业论文时分章节编号会用到。行内写法设样本量为 $n$置信水平为 $1-\alpha$。 行间写法 \[ \bar{x} \frac{1}{n}\sum_{i1}^{n} x_i \] 带编号写法 \begin{equation} \sigma^2 \frac{1}{n-1}\sum_{i1}^{n}(x_i - \bar{x})^2 \label{eq:variance} \end{equation}中文和行内公式紧贴时XeLaTeX 加 ctex 的组合通常会自动处理间距不会出现字符被吞的情况。如果确实遇到个别符号显示异常在公式外面补一对花括号或一个普通空格就能解决。2.2 多行对齐、分段函数与矩阵的固定写法多行公式对齐用 align 环境是纵向对齐点\\是换行符。对齐点一般放在等号前面这样所有等号会竖直排成一列视觉上非常整齐。这里有一个容易忽略的细节align 环境最后一行的末尾不要写\\虽然多数情况下不报错但会多出一个空行公式块和下文之间的垂直间距明显偏大。分段函数用 cases 环境它必须放在数学模式内部常见的组合是\[ \begin{cases} ... \end{cases} \]或者包在 equation 里。cases 中第二个用来对齐条件列让所有条件左边界对齐。矩阵环境有好几种pmatrix 是圆括号bmatrix 是方括号vmatrix 是竖线行列式matrix 不带定界符。需要定界符自动伸缩时用\left(和\right)包起来。\begin{align} f(x) (x1)^2 \\ x^2 2x 1 \label{eq:expand} \end{align} \begin{equation} g(x) \begin{cases} x^2, x 0 \\ 0, x 0 \\ -x, x 0 \end{cases} \end{equation} \begin{equation} \mathbf{A} \begin{bmatrix} a_{11} a_{12} a_{13} \\ a_{21} a_{22} a_{23} \\ a_{31} a_{32} a_{33} \end{bmatrix} \end{equation}2.3 公式编号与 \label 的命名习惯\label必须写在公式环境内部位置紧跟公式内容之后。如果写在环境外面引用的编号可能指向错误的计数器。不需要编号的公式用\nonumber或\notag关掉单行编号或者直接用带星号的版本align*、equation*一次性关掉整个环境的编号。命名习惯这一条看似小事但项目一长就会体现价值。我统一用前缀区分引用类型公式用eq:图用fig:表用tab:章节用sec:算法用alg:。这样在正文里打\ref{fig:的时候编辑器会自动提示所有图的标签不用翻回去找编号。如果一篇论文有三十多个公式、二十多张图没有命名规范基本等于自找麻烦。另外标签名里不要出现中文和空格虽然某些环境下能编译通过但换引擎时很容易炸。3. 图表浮动体三线表与子图并排的稳定写法图表被称为浮动体不是没有道理的它们会漂到页面顶部或底部甚至漂到后面几页去。很多人的第一反应是骂 LaTeX 不听指挥其实这是它的排版哲学让正文的阅读流保持连贯图表去填页面的空白。理解了这一点处理图表的思路就从对抗变成引导。3.1 booktabs 三线表与列宽控制学术表格的标准是三线表只有顶线、表头分隔线、底线三条横线没有任何竖线。booktabs 宏包提供的\toprule、\midrule、\bottomrule三条命令就是为此设计的它们的粗细和上下间距都经过调校比默认的\hline好看得多。加竖线是很多从 Word 迁过来的人的习惯实际上在正式排版里竖线会被认为是不专业的表现投稿时审稿人看到满屏竖线的表格第一印象就打了折扣。表头如果要做分组用\cmidrule(lr){2-3}画一条只覆盖某几列的短线(lr)参数让线两端稍微收窄避免和相邻的线连在一起。跨列合并表头用\multicolumn{2}{c}{标题}。列宽方面普通l、c、r会按内容自适应一旦某列文字过长表格就会冲出页面边距。这时候有两种解法把该列改成固定宽度p{3cm}文字会自动换行或者用 tabularx 宏包的X列让所有弹性列平分剩余宽度。用\resizebox强行缩放整张表也能塞进页面但字号会随之缩小和正文不统一我不推荐在正式论文里这么干。\begin{table}[htbp] \centering \caption{三种方法的性能对比} \label{tab:compare} \begin{tabular}{lcc} \toprule 方法 准确率(\%) 单次耗时(s) \\ \midrule 基线模型 91.2 1.28 \\ 改进模型 93.6 2.41 \\ \cmidrule(lr){2-3} 本文方法 \textbf{95.1} \textbf{1.87} \\ \bottomrule \end{tabular} \end{table}3.2 subcaption 子图并排的宽度计算并排子图是论文里最常见的排版需求写法上要注意三点。第一子图宽度之和不能超过\textwidth两个并排时用0.48\textwidth各一份中间加\hfill撑开合计 0.96 留出安全余量。如果两个都写0.5\textwidth加上中间的间距就超过一行宽度第二张图会被挤到下一行很多人对着这个现象排查半天以为是图片尺寸问题。第二\includegraphics的宽度要写\linewidth而不是\textwidth\linewidth会自动取当前子图环境的可用宽度这样图片不会溢出子图框。第三subcaption、subfig、subfigure 这三个宏包功能重叠且互相冲突一个项目里只能选一个我统一用 subcaption它和 caption 宏包配合最好。\begin{figure}[htbp] \centering \begin{subfigure}[b]{0.48\textwidth} \includegraphics[width\linewidth]{fig/a.pdf} \caption{原始图像} \label{fig:sub-a} \end{subfigure} \hfill \begin{subfigure}[b]{0.48\textwidth} \includegraphics[width\linewidth]{fig/b.pdf} \caption{处理后结果} \label{fig:sub-b} \end{subfigure} \caption{处理前后的对比结果} \label{fig:both} \end{figure}引用单张子图时写\ref{fig:sub-a}会得到类似1a的编号引用整个图用\ref{fig:both}。如果希望子图的图注字号更小、更有层次在子图环境外面加一句\captionsetup[sub]{fontsmall}就能统一调整。3.3 位置参数 htbp 与跨栏图表的实际表现方括号里的htbp是给排版引擎的偏好列表h 是当前位置t 是页顶b 是页底p 是单独一页浮动。四个字母都写上等于告诉引擎你看着办它会在这些位置里挑最合适的。加感叹号变成[!htbp]表示忽略一部分美观约束强行放在你指定的位置但排版质量会打折扣。float 宏包提供的[H]是真正的强制图就钉在代码所在的位置代价是可能出现页面大片空白。双栏文档是另一个雷区。figure*环境可以让图横跨两栏但它只能出现在页面顶部而且经常漂到文档后面甚至在正文引用它之后好几页才出现。这不是 bug是双栏浮动的固有约束。如果这种漂移影响了阅读可以在导言区加载 flafter 宏包它保证浮动体不会出现在引用它的位置之前。另外提醒一句图的文件名尽量用英文小写字母加下划线别用中文、空格或者奇怪的符号这些字符在不同操作系统之间传输时最容易出问题。4. 交叉引用与参考文献ref、hyperref 与 biber 的配合交叉引用和参考文献是两个看起来简单、实际最容易出错的模块。它们的共同点是依赖多次编译和外部辅助文件一旦某个环节断了页面上就会出现一片问号。理解这套机制的工作流程比记住几十条报错信息更有用。4.1 \ref、\eqref、\autoref 的差异与联动\ref只输出编号本身比如 3。\eqref会自动给公式编号加上圆括号输出 (3)专门用于公式引用。\autoref来自 hyperref会自动补上类型名输出图 3、表 2、式 3。cleveref 的\cref功能类似但更智能能处理多个引用合并比如\cref{fig:a,fig:b}输出图 1 和图 2。这几种写法可以混用但一篇文章里最好统一。我的习惯是图表章节用\cref公式用\eqref这样正文读起来最自然。中文文档里有一个细节值得注意ctex 和 hyperref 已经自动把 autoref 的类型名改成了中文一般不需要手动重定义但如果用了非主流的文档类导致显示为英文可以手动加\renewcommand{\figureautorefname}{图}这类命令来修正。4.2 BibTeX 还是 BibLaTeX中文文献的选型传统方案是 BibTeX导言区写\bibliographystyle{plain}和\bibliography{refs}正文用\cite{key}。它的优点是兼容性极好几乎所有期刊模板都用它缺点是样式定制困难中文文献的排序和格式支持较弱。现代方案是 BibLaTeX 配合 biber 后端导言区写\usepackage[backendbiber,stylegb7714-2015]{biblatex}和\addbibresource{refs.bib}正文末尾用\printbibliography输出。对比项BibTeXBibLaTeX biber编译后端bibtexbiber样式中文化需 gbt7714 宏包内置 gb7714-2015 样式多语言混排支持有限原生支持期刊模板兼容极好部分老模板不支持配置复杂度低略高投稿国外期刊时我一般跟着模板走模板用什么就用什么不要自作主张换引擎。自己写报告或者毕业论文用 BibLaTeX 会舒服很多尤其是要同时引用中英文文献的场景gb7714-2015 样式能直接输出符合国内规范的结果。4.3 参考文献不显示的排查顺序页面上全是[?]或者参考文献列表干脆空白这类问题的排查有固定顺序。第一步看日志文件里的 blg 文件Overleaf 左侧日志面板能切换里面会明确告诉你哪条引用没找到。第二步检查键名拼写.bib文件里的键名和\cite{}里的键名必须完全一致大小写敏感。第三步确认后端匹配如果是 BibLaTeX后端必须是 biber如果 Overleaf 的项目设置被人改成了 bibtex就会出现条目全部丢失的现象日志里会有Empty bibliography之类的提示。还有一种情况是文件上传问题.bib文件确实在项目里但被放在了子目录中而\addbibresource里写的是根目录路径编译时找不到。最后一步终极大法是在 Menu 里点一下 Clear cached files 然后重新编译Overleaf 缓存偶尔会残留旧状态尤其是你刚删掉某个宏包之后。5. 修订模式让合作者一眼看清改了什么热词里出现overleaf 修订模式不是偶然这是合作写论文时最刚性的需求。导师给了一段文字你改完发回去如果不标出修改痕迹对方要逐字对照才能知道动了哪里效率极低。Overleaf 在这方面提供了几个层次的方案从平台功能到宏包实现各有适用场景。5.1 Overleaf 自带修订记录功能的可用范围Overleaf 的评论功能是普遍可用的选中一段文字就能在右侧留评论对方可以看到并回复这个在讨论这句话怎么改的时候非常高效。版本历史功能也是普遍可用的左侧的 History 面板能看到每一次保存的快照可以选择两个版本对比差异会高亮显示出来。这两个功能配合起来基本能覆盖日常协作。至于平台层面的修订标记功能不同套餐的支持情况不一样。如果你的项目里找不到相关入口不必纠结直接用下面两节的宏包方案效果一样好而且不依赖账号权限把 PDF 发给任何人都能看清修改痕迹。5.2 changes 宏包\added、\deleted、\replaced 的用法changes 宏包是目前最成熟的 LaTeX 修订方案。它的设计思路和 Word 的修订模式很像所有修改都用命令包起来编译时根据选项决定显示模式。draft模式下新增内容带颜色和下划线删除内容带颜色和删除线改动处还会在页边距打标记作者名和颜色可以通过\definechangesauthor自定义多人协作时每个人一个颜色一目了然。切换到final模式所有标记消失输出的是干净版本。\usepackage[final]{changes} \definechangesauthor[name{导师}, colorblue]{LS} \definechangesauthor[name{我}, colorred]{ME} % 正文中的用法 \added[idME]{这里补充了实验设置的具体参数} \deleted[idLS]{原来的表述不够准确} \replaced[idME]{改进后的结论}{旧结论} \highlight[idLS]{这段需要再确认}切换显示模式要改导言区的宏包选项或者定义一个自定义命令来控制。我通常的做法是复制一份文件专门用来生成修订稿正文文件保持不变需要交草稿时切到修订版本编译需要交终稿时切回来。这样避免了一处改错导致全篇标记混乱。有一个实际使用中的坑要提醒批注标记会占据页边距的空间如果文档本来的边距就很窄标记会溢出页面或者和其他标记重叠。解决办法是用\usepackage[margincluetrue]{changes}的选项调整标记位置或者临时把页面边距调宽一些。5.3 不装宏包的手动标记方案与颜色约定如果只是偶尔标几处修改装宏包反而麻烦用最基础的颜色命令就够。加粗表示新增红色删除线表示删除这是最朴素的约定。删除线方面要注意中文的处理ulem 宏包提供的\sout对中文断行支持不好长句删除时容易出现删除线断裂或者行距异常。在 XeLaTeX 加 ctex 的环境下直接用 xeCJK 提供的\CJKsout效果更稳定。\usepackage{xcolor} \newcommand{\addtext}[1]{\textcolor{blue}{\textbf{#1}}} \newcommand{\deltext}[1]{\textcolor{red}{\CJKsout{#1}}} \newcommand{\notetext}[1]{\textcolor{orange}{【批注#1】}} % 用法示例 \addtext{新增的实验数据表明这一趋势更明显} \deltext{原先认为二者无关}。颜色约定建议固定下来并写在文件开头注释里比如蓝色是新增、红色是删除、橙色是待确认问题。这样合作者拿到文档不需要额外解释就能看懂。要注意的是这些颜色命令在最终稿里必须一个个删掉别忘了留一份干净版本否则印出来的论文带着一片蓝色加粗就尴尬了。我一般会在完成修改后用查找功能搜一遍自定义命令名确认没有遗漏。6. 编译排错与项目组织几个高频坑的定位链路编译报错是所有 LaTeX 使用者绕不开的环节。新手看到满屏红色的日志会直接懵掉其实日志的读法是有套路的掌握之后大部分问题五分钟内能定位到具体行。6.1 从日志尾部往前读报错Overleaf 的日志面板会显示完整编译输出关键不是红色部分有多少而是第一个以感叹号开头的错误。TeX 引擎遇到第一个致命错误就会中断后面那些红色的行往往是连带的连锁反应盯着末尾的报错看反而会误导方向。定位到错误后日志里通常会有类似l.123的提示表示问题出在第 123 行。把这一行和它前面几行一起看多数是括号不配对、环境没有正确闭合、或者某个命令少了个参数。一个很实用的技巧是注释法二分排查把文档后半部分用%注释掉重新编译如果错误消失说明问题在后半部分再对半切分两三轮就能锁定具体段落。这个方法在长文档里比逐行找快得多。6.2 常见报错与成因对照表下面这张表是我自己整理的高频报错速查遇到问题先对照一遍能省不少搜索时间。报错信息大概率成因处理方向Undefined control sequence宏包没加载或命令拼写错检查导言区宏包核对命令名Missing $ inserted数学符号写在了文本模式用 $ 包住公式或检查下划线File xxx.png not found路径错、扩展名错、大小写不符核对文件名注意 Linux 区分大小写Environment ... undefined环境名拼错或宏包缺失检查 begin/end 是否配对Missing \item列表环境里没有写条目看 itemize/enumerate 内是否有内容Font ... not foundfontset 选错或字体缺失换 fandol 或 ubuntu 字体集Empty bibliography后端选错或 bib 文件路径错确认 biber 与 bib 文件位置TeX capacity exceeded递归定义或死循环检查自定义命令是否引用了自己Compilation timeout图片过大或宏包过重压缩图片拆分项目这张表覆盖了我遇到问题的九成以上。剩下的疑难杂症把日志里第一条错误信息整段复制到搜索框一般都能找到同行讨论。6.3 多文件项目与图片路径的坑论文写到一定长度单文件会变得很难维护这时候就要拆分。\input{}和\include{}都能引入子文件区别在于\include{}会强制分页并生成独立的辅助文件适合拆分正文章节\input{}只是单纯的内容插入适合引入导言区片段、表格代码这类小段落。毕业论文我一般按章节拆每个章节一个.tex文件主文件里用\include{chapters/ch1}引入。这里有个几乎人人都会踩的坑图片路径的基准目录是主文件所在的目录不是子文件所在的目录。也就是说在chapters/ch1.tex里写\includegraphics{fig/a.pdf}LaTeX 会去根目录找fig/a.pdf而不是去chapters/fig/a.pdf。这个规则和大多数人的直觉相反导致很多人明明文件上传对了却一直报找不到。另外Overleaf 里的主文件设置也很关键。Menu 里的 Main document 决定了从哪个文件开始编译如果这个设置被误改成了某个章节文件整个项目会因为缺少导言区而报一堆莫名其妙的错误。多人协作的项目里我建议把主文件固定在根目录且命名清晰比如main.tex避免有人上传自己的test.tex并在本地编译时把主文件设置带偏。还有一个和编译时长相关的经验Overleaf 的免费套餐有编译时长限制项目里塞了几十兆的高分辨率图片编译很容易超时。投稿用的图一般是 300dpi 的位图或者矢量 PDF但预览阶段完全可以先用小尺寸版本最后出终稿时再替换。我自己习惯给图片文件夹建两个子目录一个放压缩版用于日常编译一个放原图用于最终输出切换时改个路径前缀就行。最后分享一个我自己长期用的习惯每完成一个阶段性版本就在项目里导出一份 PDF 存档文件名带上日期。Overleaf 的版本历史虽然能回溯但快照数量多了之后翻找很费劲本地存一份按日期命名的 PDF需要对比三个月前那版是怎么写的时候直接打开就行比在时间线上滑动快太多。这个习惯在我看来比记住任何一个宏包命令都值钱。
返回列表