
我在帮同事改论文、自己也投过几轮Elsevier旗下期刊的稿子见得太多的卡壳点其实不在写作内容而在LaTeX排版本身。尤其是图片怎么放、表格怎么不飘走、参考文献怎么连续引用、伪代码怎么写这四个问题几乎每个新手都会撞一遍。这套东西说难不算难但网上教程东一榔头西一棒子经常看完还是编译报错。今天这篇就围绕Overleaf上写Elsevier模板这件事把图、表、参考文献标题及引用、伪代码这些最容易被卡住的地方一次讲透。这篇内容适合谁看用Overleaf投稿Elsevier旗下期刊比如Expert Systems with Applications、Pattern Recognition这种用elsarticle模板的准备写初稿的人以及被LaTeX排版搞得头大、想系统搞懂图报表引用逻辑的新手。如果你已经会本地装TeXLive跑代码本文里的LaTeX命令同样适用只是我把操作场景放在Overleaf上因为在线编译对多人协作和导师批注太方便了省去一堆环境配置的麻烦。1. 整体思路先搞清Overleaf上Elsevier模板的项目结构和编译逻辑1.1 为什么推荐在Overleaf上用Elsevier模板Elsevier旗下多数期刊提供elsarticle模板官方在Overleaf里也有现成的模板入口。直接用本地编辑器不是不行但LaTeX环境配置本身就能劝退一批刚入门的同学TeXLive也好、MiKTeX也好装完还要配编辑器遇到缺宏包再手动安装一步出错就原地转圈。Overleaf把这些问题全部屏蔽掉了打开浏览器就能编译宏包缺失会自动提示甚至帮你装好还能实时看到PDF预览。更重要的是投稿Elsevier的审稿流程里编辑和审稿人经常需要在PDF上做批注。Overleaf提供修订模式和评论功能你写完发给导师或者合作者对方直接在线上标注不用来回传Word文件。而且Overleaf的历史版本功能很实用每次大改之前先提交一个版本改坏了还能回溯这个体验是本地编辑器很难给的。用elsarticle类的时候最简单的文档结构是这样\documentclass[preprint,12pt]{elsarticle} \usepackage{graphicx} \usepackage{booktabs} \usepackage{algorithm} \usepackage{algpseudocode} \journal{Journal of Applied Example} \begin{document} \begin{frontmatter} \title{你的论文标题} \author[inst]{作者名字} \affiliation[inst]{organization{单位名称}, country{国家}} \begin{abstract} 摘要内容 \end{abstract} \end{frontmatter} \section{引言} 正文内容... \section{结论} 正文内容... \bibliographystyle{elsarticle-num} \bibliography{refs} \end{document}新建项目时直接在Overleaf里搜索“Elsevier”选对应期刊模板或者自己新建空白项目后上传elsarticle.cls和模板文件效果一样。1.2 项目文件里各文件都是干什么的Overleaf里的Elsevier模板通常包含主TeX文件、bst样式文件、cls类文件、bib参考文献库和图片文件夹。很多新手把cls和bst文件当成多余的东西其实它们决定了期刊要求的排版样式和参考文献格式不能随便删。cls文件文档类文件Elsevier模板的elsarticle.cls定义了页面结构、标题格式、正文样式。bst文件参考文献样式文件elsarticle-num.bst决定参考文献列表的编号格式。bib文件你的文献库用BibTeX格式记录每篇文献。tex文件论文正文所有的章节、图表、公式都写在这里。不要修改cls和bst文件除非你非常清楚自己在做什么。期刊编辑最终会用官方模板重新排版你本地改样式对投稿没有好处只会让审稿人看到的PDF和最终出版的版本不一样。2. 图片和表格插入、标题、交叉引用这一套组合必须理顺2.1 插图的最基础写法与figure环境LaTeX里图片不是直接丢进去就完事它要放进一个“浮动体”环境里让LaTeX自己决定图片放在页面哪个位置比较美观。这个浮动体就是figure环境。新手最容易踩的坑以为figure环境里的内容会按代码顺序出现在正文里。实际上LaTeX会按自己的排版算法把浮动体移动到合适的位置所以经常出现“图还没出来正文已经提到图3了”的情况。这是正常现象尤其双栏模板里更明显。Elsevier模板里插入单张图的标准写法\begin{figure}[htbp] \centering \includegraphics[width0.8\linewidth]{figures/example.png} \caption{这是图片题注用来描述这张图的内容。} \label{fig:example} \end{figure}括号里的[htbp]是浮动体位置修饰符含义分别是hhere放在当前位置、ttop页面顶部、bbottom页面底部、p单独一页。建议保留[htbp]四个字母给LaTeX最大自由度它能找到更好的排版位置。如果你只写[h]意思是“尽量放在当前位置”当位置不够时就会出现图片堆积或者跑到很远的地方去。图文件放哪里建议在项目里建一个figures文件夹图片统一放进去。命令路径写figures/example.png不要写绝对路径也不要带空格。文件名尽量不要带中文Overleaf对中文路径支持并不理想。2.2 并排插图、跨栏图、子图编号Elsevier模板通常有两种排版模式单栏的preprint模式和双栏的final模式。双栏模式下图片默认只占一栏的宽度如果你的图比较宽需要让它横跨两栏就要用带星号的figure*环境\begin{figure*}[htbp] \centering \includegraphics[width\textwidth]{figures/wide_figure.png} \caption{一张很宽的整体架构图需要横跨双栏显示。} \label{fig:wide} \end{figure*}两张图并排展示也是高频需求。常见做法是用minipage分左右两个小盒子每个盒子里放一张图\begin{figure}[htbp] \centering \begin{minipage}[t]{0.48\textwidth} \centering \includegraphics[width\linewidth]{figures/a.png} \subcaption{左图说明} \label{fig:a} \end{minipage} \hfill \begin{minipage}[t]{0.48\textwidth} \centering \includegraphics[width\linewidth]{figures/b.png} \subcaption{右图说明} \label{fig:b} \end{minipage} \caption{两张图并排的总题注。} \label{fig:both} \end{figure}这里\hfill的作用是把两个minipage分别推到左边和右边中间留出弹性空隙。0.48\textwidth比0.5小一点点是故意留出两个盒子之间的小间距避免两图贴在一起或者因为四舍五入溢出换行。使用\subcaption命令需要引入subcaption宏包。在elsarticle模板里我记得要在导言区加上\usepackage{subcaption}然后调用\subcaption而不是\subfloat因为subfloat属于另一个宏包的语法容易混。2.3 表格插入三线表、自动换行、跨栏表Elsevier期刊审稿人特别喜欢看三线表就是顶线、栏目线、底线三条横线不带竖线。这种风格简洁清爽数据表格用booktabs宏包实现最方便。\begin{table}[htbp] \centering \caption{实验结果对比。} \label{tab:results} \begin{tabular}{lccc} \toprule 方法 准确率 召回率 F1值 \\ \midrule Baseline A 82.5 80.1 81.3 \\ Baseline B 85.2 83.0 84.1 \\ Ours 90.1 88.7 89.4 \\ \bottomrule \end{tabular} \end{table}\toprule、\midrule、\bottomrule来自booktabs宏包比默认的\hline好看很多。列参数{lccc}表示四列分别是左对齐、三个居中对齐。l是leftc是centerr是right。表格内容太长需要换行时用p{宽度}列类型\begin{tabular}{lp{5cm}cc} \toprule ID 方法描述 指标A 指标B \\ \midrule 1 这里是一段比较长的文字描述用于解释该方法的特殊之处超过一定宽度后自动换行 1.23 4.56 \\ \bottomrule \end{tabular}如果项目里用了tabularx宏包也可以用X列类型自动分配宽度但elsarticle模板默认没有引入这个宏包需要自己在导言区添加。跨栏表格和跨栏图一样用table*环境\begin{table*}[htbp] \centering \caption{横跨双栏的宽表格。} \label{tab:wide} ... \end{table*}2.4 标题、标签、引用三者的配合关系图片表格这块最核心的逻辑其实是一句话caption是给读者看的标题label是给LaTeX内部记住的标记ref是引用这个标记。很多人把label放在caption前面导致引用时数字不对这是常见错误。正确顺序永远是先写caption再写label\caption{图片标题} \label{fig:example}为什么必须这样因为\ref{fig:example}引用的是“这个label所附着的浮动体的编号”而这个编号由\caption中的计数器决定。label放在caption之前时它引用的还是上一个计数器的值所以经常出现插图编号比实际编号少1的情况。写\ref的时候正文里这样引用如图~\ref{fig:example} 所示结果明显提升。注意图编号前面一般要加一个不可断行的空格符号~防止“图”字和数字被拆到两行这是排版规范里的小细节但很影响阅读体验。表格引用同理写成表~\ref{tab:results}。命名建议养成习惯图用fig:开头表用tab:开头公式用eq:开头章节用sec:开头。这样团队协作时别人看到引用就知道你引的是什么对象排查问题更快。3. 参考文献管理与引用写法连续引用怎么实现3.1 Elsevier模板自动匹配参考文献格式Elsevier模板在参考文献这块做得比较省心只要你的bib文件里字段齐全用\bibliographystyle指定样式LaTeX会自动生成符合期刊要求的参考文献列表。常见的bst样式有elsarticle-num数字编号型、elsarticle-harv作者年份型、elsarticle-num-names等。绝大多数Elsevier期刊默认用数字编号样式所以我建议直接用elsarticle-num。bib文件的每条记录长这样article{smith2023, author {Smith, John and Lee, Alice}, title {A Novel Approach for Image Classification}, journal {Expert Systems with Applications}, year {2023}, volume {210}, pages {118--132}, doi {10.1016/j.eswa.2022.118132} }正文里引用\cite{smith2023}编译后会自动变成[1]格式。在Overleaf里主tex文件末尾用\bibliography{refs}指定bib文件名。注意不要写.bib后缀系统会自动去找refs.bib文件。3.2 连续引用[1-3]是怎么实现的这个问题我在不同场合被问过太多次了。LaTeX里一次引用多篇文献直接写\cite{smith2023,johnson2022,li2023}默认输出结果是[1,2,3]这样的逐个编号中间用逗号隔开。但很多期刊要求连续编号压缩成区间形式也就是[1-3]。最简单粗暴的做法是给三个分开的引用比如\cite{smith2023} \cite{johnson2022} \cite{li2023}但这样引用序号和文本之间会有空格不符合排版习惯。正确方式是加cite宏包它会自动把连续的文献编号压缩成区间\usepackage{cite}引入这个宏包后\cite{a,b,c}会自动输出[1-3]如果序号不连续则是[1,3,5]这样。这个宏包在elsarticle模板里基本兼容实测不会出现编不过的情况。如果你用natbib宏包来管理引用连续压缩的写法是\citep{a,b,c}加上\usepackage[sortcompress]{natbib}。但elsarticle模板本身有自己的参考文献引用机制我建议优先用cite宏包避免跟模板冲突。3.3 PubMed、Google Scholar文献怎么快速导入bib很多人写医学、生命科学类论文喜欢用PubMed查文献导出bib格式很方便。在PubMed里找到你需要引用的文献点击页面右侧的“Cite”按钮再选“BibTeX”格式把弹出的文本整个复制到你的refs.bib文件里就行。Google Scholar里也有类似功能搜索文献后点击该条目下方的引用图标在弹窗底部选择“BibTeX”然后复制内容到bib文件。这些工具导出的大多数字段都很规范但偶尔会出现多余的空格或特殊字符比如LaTeX的保留字符%、、_如果标题里出现这些符号需要在前面加反斜杠转义否则编译会报错。从我的实际经验看最稳妥的方式还是自己用文献管理软件Zotero或EndNote统一管理文献确认无误后再批量导出bib。这样投多个期刊时只要改\bibliographystyle参考文献格式就能自动适配不用手动调。4. 伪代码排版algorithm宏包组合的完整写法4.1 为什么用algorithm加algpseudocodeLaTeX里写伪代码有很多方案比如algorithmic、algorithmicxalgpseudocode、algorithm2e等。Elsevier模板最常用的组合是algorithm宏包加algpseudocode宏包。\usepackage{algorithm} \usepackage{algpseudocode}这个组合的好处是语法清晰、界面干净生成的伪代码风格跟学术论文常用风格一致。唯一的坑是elsarticle自带的模板有时对algorithm2e宏包支持不太好所以我一直推荐用algpseudocode不容易踩雷。一个标准的伪代码环境长这样\begin{algorithm}[htbp] \caption{改进的K-Means聚类算法} \label{alg:kmeans} \begin{algorithmic}[1] \Require 数据集 $D \{x_1, x_2, \ldots, x_n\}$簇数 $K$ \Ensure 聚类结果 $C \{C_1, C_2, \ldots, C_K\}$ \State 从 $D$ 中随机选择 $K$ 个初始中心点 $\mu_1, \mu_2, \ldots, \mu_K$ \Repeat \For{$i 1$ 到 $n$} \State 将 $x_i$ 分配到距离最近的中心点所在的簇 \EndFor \For{$j 1$ 到 $K$} \State 重新计算簇中心 $\mu_j \frac{1}{|C_j|} \sum_{x \in C_j} x$ \EndFor \Until{中心点位置不再变化} \Return $C$ \end{algorithmic} \end{algorithm}[1]参数表示每行自动显示行号如果不需要行号就去掉这个参数。\Require和\Ensure对应伪代码里的输入和输出显示为“Require”和“Ensure”字样。4.2 常见的伪代码语句块写法algpseudocode支持\If、\For、\While、\Repeat、\Function等控制结构每个结构都有对应的\End*结尾命令。如果条件分支里要嵌套多个操作可以配合\State写\begin{algorithmic}[1] \If{$acc 0.95$} \State 增加训练轮数 \State 降低学习率 \ElsIf{$acc 0.99$} \State 提前停止训练 \Else{} \State 保持当前参数不变 \EndIf \end{algorithmic}函数定义用\Function\begin{algorithmic}[1] \Function{UpdateWeights}{$w$, $g$} \State $w \gets w - \eta \cdot g$ \Return $w$ \EndFunction \end{algorithmic}函数名里的下划线需要注意Update_Weights这种写法在数学模式下会出问题因为下划线_后面必须跟一个花括号分组否则会报数学下标错误。建议函数名写成UpdateWeights或者用\texttt包裹。4.3 伪代码里的数学符号和特殊字符伪代码里经常出现数学符号全部用数学模式包裹。$\gets$表示赋值箭头$\leq$表示小于等于$\times$表示乘号。这些符号在纯文本直接写会报错必须放在美元符号$...$之间。算法文件中出现中文字符时如果你用的是默认的pdfLaTeX编译会有问题因为pdfLaTeX默认不支持中文。解决方案有两个一个是全部用英文写伪代码这是Elsevier模板最常见的做法另一个是引入CJK宏包并切换到XeLaTeX编译但elsarticle模板对XeLaTeX的兼容性不如pdfLaTeX稳我不建议为了一篇投稿论文折腾编译器直接用英文写最省事。如果需要引用算法编号跟图片表格一样算法~\ref{alg:kmeans} 展示了改进后的聚类流程。\label的位置在\caption之后逻辑跟figure环境完全一致。5. 常见编译报错与排查技巧5.1 六个高频报错场景速查下面是Overleaf里跑Elsevier模板时最容易遇到的几类问题我把症状、原因和解决方案列成一张表症状常见原因解决办法图片不显示PDF里只有空白图片路径不对或者文件扩展名写错确认路径和文件名检查\includegraphics的写法编号错乱引用数字比实际少1label写在了caption前面把label移到caption之后重新编译参考文献显示?没有编译BibTeX或者bib key写错Overleaf会自动跑BibTeX检查\cite里的key是否和bib文件一致参考文献引用处显示[?]bib文件未加载或格式错误确认\bibliography{refs}没有后缀bib文件在项目根目录伪代码所有行挤在一起缺少algpseudocode宏包用了错误的algorithmic语法导言区引入\usepackage{algpseudocode}编译一直报缺少宏包某些宏包elsarticle模板不支持查看Overleaf日志里的具体宏包名在导言区手动添加5.2 看懂Overleaf编译日志的三个技巧Overleaf左侧有个“日志”按钮点开后能看到完整日志。新手看到红字就慌其实很多只是警告不是错误。第一条经验只看带有Error字样的条目。警告Warning大多不影响PDF生成可以忽略。第二条经验日志里会显示出错的行号Overleaf还会在编辑器里用红色小方块标出报错位置。点日志里的错误信息通常能自动跳转到对应代码行。第三条经验如果编译一半卡住先把最近新加的内容注释掉逐块恢复用二分法快速定位是哪段代码引发了问题。5.3 修订模式、预览和协作小技巧Overleaf的“修订模式”在菜单栏的“Review”选项里。打开后任何修改都会以红色标记显示方便导师查看。投稿Elsevier前要注意最终导出的PDF不能有修订痕迹所以修改完成后要确认“修订模式”已关闭再下载PDF。还有一个我特别推荐的习惯每次写完一个小节就赶紧编译一次确认没有编译错误再继续写。如果等到写完全文再编译报错信息会跟“找茬”游戏一样难排查。我平时改自己的论文几乎每十分钟就编译一次成本极低但排错效率极高。最后再分享一个实用小技巧Overleaf里右键点击代码可以快速插入引用、插入图表环境甚至自动查找bib条目。适合刚上手的人减少敲代码的出错率。把这些基础操作练熟之后你会发现LaTeX排版消耗的心力远低于预期写论文的重心终于能放回内容本身。