
做科研的兄弟应该都有这种感觉Overleaf 这种在线 LaTeX 编辑器确实是写论文的神器打开浏览器就能写不用配环境随时能看到编译结果。但真到了按 Elsevier 模板投稿的时候图片老是跑位、表格标题死活不显示、参考文献引用格式不对、伪代码一编译就报错——这些看似不起眼的小问题往往能卡住你一下午。这篇博文我就把 Elsevier 模板下图片、表格、参考文献、伪代码这几块的高频写法一次讲透全部是能直接复制、改改就能用的代码也包含我这几年在 Overleaf 上踩过的坑和总结出来的技巧。这套经验也适用大部分双栏会议模板和期刊模板不管你是搞计算机、电子、机械还是数学只要论文里需要图表和算法这篇文章都能帮你省下不少时间。1. 整体思路为什么用 Overleaf 写 Elsevier 论文1.1 模板选型背后的逻辑Elsevier 官方在 Overleaf 上提供好几个版本的模板最常见的是elsarticle宏包它本身已经处理好了大部分排版规范包括双栏、页眉、标题页、作者单位、摘要等。你不需要去手动调\documentclass的参数直接在 Overleaf 新建项目时搜索 Elsevier选择官方那个 elsarticle 模板就行。很多初学者会犯一个错误自己从零开始写一行\documentclass[preprint,12pt]{elsarticle}然后发现和投稿系统的排版要求对不上。其实 Elsevier 提供了一套非常完整的模板文件默认就带\journal{}、\bibliographystyle{elsarticle-num}这些配置。用官方模板的好处是参考文献格式、图表样式、字体字号都已经预设好了你只需要关注内容本身。这里多说一句elsarticle提供了几种模式preprint模式适合自己阅读和修改阶段review模式适合返修时给审稿人看final模式是接近出版的样子。我建议在 Overleaf 上写的时候用preprint到最后提交前再切成final检查一遍版式是否有超宽表格、图片是否溢出栏宽这类问题。1.2 需要准备的核心内容在正式动手前请先检查你的 Overleaf 项目里是否已经包含了以下这些文件和宏包它们几乎是所有论文的基础配置\usepackage{graphicx} % 插图宏包 \usepackage{booktabs} % 三线表 \usepackage{float} % 图表位置精确控制 \usepackage[numbers]{natbib} % 参考文献引用样式 \usepackage{algorithm} % 伪代码环境 \usepackage{algpseudocode}% 伪代码排版 \usepackage[hidelinks]{hyperref} % 链接跳转hidelinks 去掉红色边框如果用的是 Overleaf 的 Elsevier 官方模板graphicx、natbib一般已经包含但booktabs、algorithm这类需要自己加。建议把上面的宏包全部放在\documentclass下面的一小段区域里用注释分好类项目变大后你就知道这有多重要了。2. 图片的插入与引用2.1 图片环境的基本写法Elsevier 模板是双栏排版所以在插图时要明确图片占单栏还是跨双栏。绝大多数单栏图片用下面的写法\begin{figure}[htbp] \centering \includegraphics[width0.9\linewidth]{figures/result.png} \caption{实验结果的对比分析。} \label{fig:result} \end{figure}这里面有几个细节要重点解释。[htbp]是位置参数h 表示 here当前位置t 表示 top页面顶部b 表示 bottom页面底部p 表示单独一页放浮动体。四个字母一起写的意思是LaTeX 会按 h → t → b → p 的顺序尝试摆放。新手经常以为写了 h 就一定会放在当前位置实际上 LaTeX 会根据页面布局自行调整这个机制是很多初学者最容易困惑的地方。想要“强制放这里”可以把参数写成[H]这需要引入float宏包但投稿前建议还是改回[htbp]因为强制位置可能造成大片空白。\label{fig:result}这一行必须放在\caption的后面这是最常见的坑之一。如果先写\label再写\caption正文里引用出来会是一个错误的编号而且排查起来非常隐蔽。width0.9\linewidth表示图片宽度是当前栏宽度的 90%。这里的\linewidth会随着环境变化单栏时就是单栏宽度双栏时就是双栏宽度。不要用width0.45\textwidth这类死值在单栏跨栏场景下很容易出问题。2.2 双栏模板中的通栏图当你需要放一张很宽的图时比如系统架构图、流程时序图、大尺寸热力图就需要让它跨过整页两栏这时要用带星号的figure*\begin{figure*}[htbp] \centering \includegraphics[width0.98\textwidth]{figures/architecture.png} \caption{系统的整体架构图。} \label{fig:architecture} \end{figure*}注意这里用的是\textwidth而不是\linewidth因为figure*已经处于通栏状态用\linewidth在某些情况下会只占据一个栏的宽度导致图片尺寸与预期不符。还有一个技巧是图片路径的管理。我的习惯是建立一个独立的figures文件夹所有图片都放里面引用时写相对路径figures/xxx.png。这样项目目录干净也方便后期打包投稿。如果你有多张小图想并排放在一个浮动体内可以用subfigure宏包。Elsevier 模板对子图的支持比较友好下面是一个双图并排的示例\begin{figure}[htbp] \centering \begin{subfigure}{0.45\linewidth} \centering \includegraphics[width\linewidth]{figures/result_a.png} \caption{方法 A 的效果。} \label{fig:result_a} \end{subfigure} \hfill \begin{subfigure}{0.45\linewidth} \centering \includegraphics[width\linewidth]{figures/result_b.png} \caption{方法 B 的效果。} \label{fig:result_b} \end{subfigure} \caption{不同方法的视觉效果对比。} \label{fig:results} \end{figure}正文中如果需要分别引用两张子图可以写\ref{fig:result_a}和\ref{fig:result_b}如果需要整体引用就写\ref{fig:results}。子图里的\hfill的作用是把两个子图推到两边让中间留出均匀空隙这个细节能让排版更好看。我用这个结构写过很多论文Elsevier 模板中完全没有出现过冲突问题比minipage拼图方案要稳定很多。3. 表格的制作与引用3.1 Elsevier 模板下的三线表学术论文里最推荐的表格形式是三线表也就是顶线、表头线和底线没有竖线看起来清爽且符合出版规范。Elsevier 模板同样遵循这个风格。基本写法如下\begin{table}[htbp] \centering \caption{不同方法的实验指标对比。} \label{tab:compare} \begin{tabular}{lcccc} \toprule 方法名称 准确率(\%) 召回率(\%) F1值 时间(s) \\ \midrule 方法A 92.5 90.1 91.3 12.5 \\ 方法B 94.0 91.8 92.9 10.2 \\ 方法C 96.2 94.3 95.2 8.7 \\ \bottomrule \end{tabular} \end{table}这里\toprule、\midrule、\bottomrule来自booktabs宏包它们产生的线条粗细适中是出版界非常认可的规范。有人问能不能加竖线我的建议是能不画就不要画加了竖线会显得非常业余审稿人看了也会有不好的印象。表格的\label同样要放在\caption之后这个规则和图片一致。如果表格的某个单元格内容比较长而你的列宽又有限这时需要控制列宽。原始tabular环境不会自动换行长文本会被硬挤出去。一个解决办法是用tabularx宏包它允许你指定表格的总宽度然后自动分配列宽\usepackage{tabularx} \begin{table}[htbp] \centering \caption{长文本内容在表格中的自动换行示例。} \label{tab:tabularx} \begin{tabularx}{\linewidth}{lX} \toprule 配置项 说明 \\ \midrule 学习率 这里是比较长的说明文字会在表格中自动换行显示。 \\ 批量大小 同样会自动换行。 \\ \bottomrule \end{tabularx} \end{table}{lX}里的X是tabularx专门提供的一种列类型它会自动铺满剩余宽度并自动换行非常实用。3.2 表格跨栏与横排有时候表格列数太多单栏放不下。这时可以像图片一样使用带星号的table*环境让表格横跨两栏\begin{table*}[htbp] \centering \caption{大型表格跨双栏显示。} \label{tab:wide} \begin{tabular}{llllll} \toprule ...列内容... \bottomrule \end{tabular} \end{table*}还有一种情况是表格实在太宽即使跨双栏也放不下这时可以考虑把表格旋转 90 度横排。常规做法是把sidewaystable环境配合rotating宏包使用\usepackage{rotating} \begin{sidewaystable}[htbp] \centering \caption{旋转表格示例。} \label{tab:rotated} \begin{tabular}{lllllll} \toprule ...列内容... \bottomrule \end{tabular} \end{sidewaystable}不过我的建议是慎用旋转表格只在数据实在无法压缩的情况下使用。审稿人阅读旋转表格的体验并不好如果你能把列数精简、把字段缩写一下通常都能解决。4. 图表的标题、标签与交叉引用4.1 caption 与 label 的正确姿势前面反复强调\label要放在\caption后面这里专门说一下原因。\caption内部会更新计数器并生成编号\label的作用是把当前计数器的值记录到.aux文件中。如果你把\label写在\caption前面它记录的是上一级环境的计数器值结果就是引用编号和实际显示编号不一致。我在写论文时见过太多这样的报错症状是图片显示是“图 3”正文引用出来却是“图 2”怎么查都查不出问题。实际上只要把 label 移到 caption 下面一行就能解决。4.2 交叉引用与 hyperref 的配合用\ref{fig:result}可以对图片进行交叉引用用\ref{tab:compare}对表格进行交叉引用。为了优化显示效果建议把引用写成这样如图~\ref{fig:result} 所示实验结果验证了方法的有效性。 表~\ref{tab:compare} 列出了所有方法的详细对比数据。中间的~是一个不换行空格作用是让“图”和编号不会跨行断开这个细节会让排版更专业。hyperref宏包能够让你在 PDF 中点击引用编号时跳转到对应位置在 Overleaf 编译出来的 PDF 里非常方便。默认情况下超链接文字会有一个红色边框投稿时很不美观。如果你用[hidelinks]选项链接文字不会有任何视觉变化既保留了跳转功能又不影响外观。这套配置在 Elsevier 模板中同样适用。5. 参考文献管理与引用格式5.1 Elsevier 模板如何选参考文献风格Elsevier 投稿系统一般要求使用elsarticle-num这种数字编号样式也就是正文中引用是 [1]、[2]文末按出现顺序排列。在 elsarticle 模板里参考文献部分通常这样配置\bibliographystyle{elsarticle-num} \bibliography{references}其中references.bib是你的 BibTeX 数据库文件在 Overleaf 中可以在左侧文件区创建一个新的.bib文件然后把文献条目粘贴进去。如果你习惯用natbib宏包还可以在上面的基础上强化引用命令支持更丰富的引用方式和姓名年份混合引用。一般情况下Elsevier 模板自带的 bibtex 命令就够用了但对需要“作者 年份 编号”并存的场景natbib 会方便很多\usepackage[numbers,sortcompress]{natbib} \bibliographystyle{elsarticle-num}这里sortcompress非常重要它能实现参考文献引用的自动排序和压缩比如你正文中引用了[1,2,3,4]最终显示会合并成[1-4]这在热点里有大量需求也是很多人在写审稿意见回复时最想要的功能。5.2 参考文献连续引用写法如果你的参考文献列表不带压缩效果或者你希望手动控制连续引用可以用下面两种写法\cite{ref1,ref2,ref3,ref4} \cite{ref1-ref4}第一种写法是常规的多文献引用第二种-写法需要宏包支持在普通\cite中不一定有效。更靠谱的做法是使用 natbib 配合sortcompress选项或者干脆让 bibtex 输出时自动压缩。有些刚开始用 LaTeX 的朋友从 Pubmed、Google Scholar 或者 CNKI 导出 bib 条目后会遇到一个典型问题文献条目里的字段不完整比如缺少author或者journal导致编译时出现 warning。我的建议是尽量用 Google Scholar 的 BibTeX 导出它比很多数据库导出的字段都完整。Pubmed 也有导出 BibTeX 的功能但部分旧文献的字段需要手动补全。5.3 维护 bib 文件的实用技巧bib 文件里每一项都有一个唯一的 key比如article{smith2023deep, author {Smith, John and Wang, Xia}, title {Deep Learning for Medical Image Analysis}, journal {Medical Image Analysis}, year {2023}, volume {85}, pages {102456} }正文引用时直接写\cite{smith2023deep}即可。这个 key 尽量用“姓名首字母 年份 主题词”的方式命名尤其是项目长期维护时你不可能记住每个随机生成的数字编号代表哪篇文献。还有一个很多人不知道的小技巧\nocite{*}可以把 bib 文件里的所有文献都列在参考文献中即使正文没有引用。这在草稿阶段整理相关工作时很好用但投稿前一定要删掉因为出版方要求参考文献必须是正文实际引用的文献。6. 伪代码的编写与排版6.1 环境选型与基础写法写伪代码是学术论文里的高频需求Elsevier 模板下我用得最稳的组合是algorithmalgpseudocode它提供类似 LaTeX 语法的伪代码排版能力也支持For、While、If、Function等经典算法元素。基本结构如下\usepackage{algorithm} \usepackage{algpseudocode} \begin{algorithm}[htbp] \caption{基于 MapReduce 的并行数据处理算法。} \label{alg:mapreduce} \begin{algorithmic}[1] \Function{MapReduce}{$data$} \State $pairs \gets \emptyset$ \For{each record $r$ in $data$} \State $key \gets \text{ExtractKey}(r)$ \State $value \gets \text{ExtractValue}(r)$ \State Add $(key, value)$ to $pairs$ \EndFor \State \Return $pairs$ \EndFunction \end{algorithmic} \end{algorithm}编译出来的效果是每条语句前面带行号逻辑清晰。其中[1]是行号参数\State表示一行普通语句\For到\EndFor是一个循环结构\Function到\EndFunction是一个函数块。\gets生成赋值箭头$\emptyset$生成空集符号这些都是很常用的写法。正文中引用算法时用算法~\ref{alg:mapreduce}和图表完全一致。生成的编号由algorithm环境自动管理不需要手动编号。6.2 在 Elsevier 模板中如何规避冲突我在使用中发现algorithm宏包和elsarticle模板配合时最需要注意的点是浮动体位置和标题显示。如果算法块总是跑到页面最后面去多半是因为位置参数写得不合理。建议保持[htbp]或者[H]不要完全省略位置参数。还有一个常见需求是算法里的注释。algpseudocode提供了\Comment{...}命令\State $x \gets 0$ \Comment{初始化}这样注释会显示在语句右侧非常整齐。但如果注释文字太长容易超出版心建议注释简洁一点。如果你写的伪代码需要跨栏显示可以使用带星号的algorithm*环境用法与figure*一致。但要注意双栏模板里跨栏算法比较占空间尽量精简算法内容不要让它占据版面过大比例。7. 常见问题与排查技巧实录7.1 表格横超版、伪代码不显示怎么办表格超出栏宽是最常见的问题表现是表格内容被截断或者编译时出现 overfull hbox 警告。排查步骤很简单先确认是不是tabular中列数太多然后用tabularx放宽动态列实在不行再转置表格行列结构把行变列、列变行。百分之八十的超宽表格能靠转置解决。伪代码不显示或只显示框不显示内容多半是宏包冲突导致的。algorithm和algorithmic是两套不同的宏包体系algorithmic是老版本algpseudocode是新版本二者不能混用。如果你在导言区同时引入了旧版和新版伪代码环境很可能直接报错或空白。我的建议是只保留\usepackage{algorithm} \usepackage{algpseudocode}千万不要再引入algorithmic或algorithmicx之外的旧宏包。7.2 编译卡住、引用显示 ?? 的排查方式Overleaf 在第一次编译时往往需要跑两遍或者三遍 PDFLaTeX因为交叉引用、参考文献、目录这些信息要先写入.aux和.bbl文件第二次编译才能读出来。如果你打开编辑器立即全选编译第一次看到??是正常现象等编译完成后自动刷新就会正常显示。如果编译完成后依然是??请检查.bib文件是否存在语法错误比如少了}、中文字符误用、条目 key 重复等这些都会导致参考文献编译失败。一个很有用的排查方法是看 Overleaf 日志面板搜索警告关键字Warning和Error大部分线索都会直接显示在那一行。如果你在 Overleaf 上遇到过编译卡死的感觉先看看是不是某个图片文件过大。我有一张 100 MB 的 PNG插入后整个 PDF 体积爆炸编译过程明显变慢。解决办法是用在线压缩工具把图片压到 2 MB 以内或者转成 PDF/JPG 格式投稿要求一般也接受 PNG、EPS、PDF 三种格式。[ \boxed{\text{Overleaf 项目里建议按功能拆文件}} ]第 7 个小标题专门整理了一个经验速查表方便你在投稿前逐条排查现象原因解决办法图片位置乱跑未使用浮动体参数或参数过少用[htbp]必要时用[H]图片引用编号对不上\label在\caption之前将 label 移到 caption 后表格超宽列数过多或文本过长转置、压缩、用 tabularx表格标题不换行表头文字过长使用\makecell或 tabularx参考文献显示 ??bib 文件语法错误或未编译两遍检查 bib重新编译多篇引用不压缩未设置 natbib 参数用[sortcompress]伪代码没内容新旧宏包混用只保留 algpseudocode编译特别慢图片文件过大压图、转格式7.3 关于图片路径和命名的那点坑Overleaf 对中文路径的支持一直比较薄弱。如果你的图片路径或者文件名里带中文在某些编译器配置下会找不到图片甚至直接编译失败。我的习惯是全部用英文小写、下划线连接的方式命名图片比如loss_curve.png、architecture_v2.pdf。这样既避免路径问题也能让你的项目文件更有条理。引用图片路径时有时候你会看到figure/和figures/两种写法混用这在多人协作的 Overleaf 项目里很容易引发找不到文件的问题。建议从一开始就统一用一个文件夹名并让所有队友都按同一个规则添加文件。顺带说一句Overleaf 的文件编译顺序不依赖你在左侧面板看到的顺序它默认从主.tex文件开始所以不要试图通过拖拽文件名来调整编译顺序没有用。还有一个细节是图片格式的选择。Elsevier 投稿通常要求矢量图优先因为 PDF 输出时清晰度更高。如果你只有位图比如截图建议至少保证分辨率在 300 dpi 以上不要直接放一个 72 dpi 的网页截图放大后模糊到没法看。Overleaf 本身不做图片放大处理图片在 PDF 里的实际尺寸取决于\includegraphics的 width 参数如果 width 设置得比图片原始尺寸大就会发现图片变得很模糊。这个经验我在写实验对比图时踩过太多次了现在所有图片都会先检查原始分辨率和显示尺寸的比例。如果你用 Excel 画了折线图直接截图放到论文里那效果通常不忍直视。更好的做法是把 Excel 图表导出成 PDF或者使用 draw.io、matplotlib、Python 脚本生成 PDF 矢量图再插入 Overleaf。这能让图表的字迹在任何缩放级别下都保持清晰也是出版排版的基本要求。写参考文献的时候有一些小技巧我从一开始用 LaTeX 就在用一直没有换过。一是保持 bib 文件按主题或字母顺序排列文件大了以后查找起来非常快二是每条文献都尽量补齐 DOI 和访问日期这样 Elsevier 审稿系统自动识别文献信息时准确率高很多三是在最终投稿前用\nocite{*}列出全部文献检查一遍确认没有多引或漏引再把这行代码删掉。最后的几点个人体会做科研写作这几年我最大的感受是 LaTeX 和 Overleaf 这类工具真正教会你的不只是排版更是“规范”二字。图片该怎么标注、表格该怎么呈现、参考文献该用什么格式、伪代码要怎么写得让人一眼看懂这些表面上是格式问题实际上是你对“科研表达”的理解深度。Elsevier 模板在 Overleaf 上其实是一个非常友好的起点官方已经把大头都帮我们处理好了我们只需要摸清它的脾气就能把精力全部放在内容本身。如果这篇文章能帮你少走一些我当年走过的弯路哪怕只是解决了一个图片乱跑的下午那它的价值就已经达到了。希望你能把这个页面当作一个随手能查的速查手册写正文遇到图表、引用、伪代码问题的时候直接翻到对应小节照着代码改一改编译就过了。