投了篇稿子到Elsevier旗下的期刊,结果Editorial Manager上传完LaTeX源文件,一点Build PDF,等了两分钟,直接给我飙红:Compilation Failed。那一刻真的血压上来——改格式改了三个礼拜,结果卡在投稿系统免费预览这一步上。更气人的是,系统给的日志又是那种半截子输出,根本看不出是哪个文件、哪一行出了事。
这个问题其实很常见,Elsevier旗下多个平台(Editorial Manager、EVISE、以及部分转投系统)对LaTeX稿件的编译方式和本地环境并不完全一致。你本地编译通过,到系统里挂了,通常不是论文本身的问题,而是“文件工程结构”和“系统预期”不匹配。这篇文章我从头到尾梳理一遍我踩过的坑,以及我最终采用的一套能稳定通过投稿系统编译的流程,希望能帮你省下至少一整天的焦虑时间。
1. 搞懂Elsevier投稿系统的编译机制
1.1 系统到底是怎么处理你的LaTeX文件的
Elsevier的投稿系统本质上是一个自动化流水线:你上传一组文件,系统按一定规则识别主文档,调用安装在服务器上的TeX发行版(常见的是TeX Live的某个特定年份版本),然后执行编译,最后生成PDF返回给你预览。
你本地用的是完整版TeX Live 2024或者MiKTeX,系统里可能是TeX Live 2019甚至更老。这里面就有两个核心差异:第一,宏包版本不同,有些老版本宏包不支持你用的新命令;第二,系统编译时对文件路径、特殊字符、图片格式的支持非常严格,只要有一个小问题,整个编译就中断,不会像本地编译器那样给你一个交互式提示。
系统通常先寻找主文档。它的识别逻辑一般是:如果你指定了Main Document,就按你指定的来;如果你没有指定,它会根据文件类型自动找.tex文件里的\documentclass。但这里有个坑:如果你上传了多个tex文件(比如每个章节一个tex),系统可能选错主文件。
另外一个不容忽视的机制是,系统编译时会先把所有上传文件解压到一个临时目录,整个目录中不允许出现空格、中文、非常用符号。你本地文件夹叫my manuscript - final没问题,传到系统里就可能导致路径类错误。
1.2 常见编译失败原因总览
我把自己和周围同门遇到过的编译失败原因做了个归类,大部分跑不出这些类别:
| 类别 | 典型表现 | 原因 |
|---|---|---|
| 宏包缺失 | ! LaTeX Error: File xxx.sty not found. | 系统TeX环境缺少某些宏包 |
| 主文档选错 | 日志显示编译的是另一个tex文件 | 多tex文件时未指定或命名太乱 |
| 图片问题 | ! LaTeX Error: Cannot determine size of graphic | 图片格式为EPS/PDF,但编译器不支持或尺寸信息缺失 |
| 特殊字符 | ! Package inputenc Error: Unicode character | 源文件包含emoji、智能引号、中文全角符号 |
| BIB错误 | ! BibTeX error: I couldn't open database file | .bib文件未被识别或引用有冲突 |
| 版本过新 | ! Undefined control sequence | 使用了老TeX Live不支持的LaTeX3语法或新命令 |
| 字体问题 | ! Font ... not loadable | 使用了系统不存在的字体,或XeTeX需要的系统字体缺失 |
多数情况下,系统日志会给出第一个错误的具体行号,但它是“管中窥豹”,经常只显示错误发生后的上下文,不显示真正原因所在的位置。所以我们更需要在上传前把问题掐死在摇篮里。
2. 上传前自查:在本地把稿子整利索
2.1 模板选择与文件结构要点
Elsevier官方推荐的投稿模板有两套:elsarticle.cls,还有一套更现代的(配合Overleaf用)。我的建议很直接:能不用自建模板就别用。如果你导师给了一个10年前的模板,里头有几十行自定义命令,那种模板在投稿系统里挂掉的概率极大。
拿elsarticle为例,你本地编译通过后,检查一下你用的宏包是不是都能在CTAN上找到。尤其注意这些常用但容易出问题的宏包:subcaption、algorithm2e、booktabs、multirow、filecontents。这些在大多数TeX Live版本里都有,但版本可能不同。
文件结构上,尽量把所有内容塞进“一个主tex + 一个bib + 图片文件夹”这样的简单结构。如果你习惯把每个章节拆成独立tex用\input{}引入,投稿前最好合并成单个tex文件,这样能显著降低主文档识别错误的概率。合并操作可以手动,也可以使用latexpand工具(TeX Live自带)。
2.2 图片处理与路径问题避坑
图片是编译失败的重灾区。本地用pdflatex编译时,支持PDF、PNG、JPG,而Elsevier的系统在默认情况下,也不支持EPS(除非它被配置为使用latex+dvips,但据我观察,现在基本都是pdflatex直接编译)。如果你的图片是.eps或.ps格式,系统可能无法读取尺寸信息,然后报Cannot determine size of graphic。
解决策略:投稿前把所有图片转换成PDF(矢量图)或PNG/JPG(位图)。简单方法是用Inkscape批量转,或者在命令行使用epspdf命令,也可以直接在LaTeX里调用epstopdf宏包自动转换,但系统环境下epstopdf需要依赖系统命令,不稳定,不如提前转换好。
另一个坑是路径。本地你用\includegraphics{./figures/fig1.pdf}没问题,投稿时如果你没有保留这个figures子文件夹结构,系统就会找不到图。所以要么把图片和tex放在同一层目录,要么在上传时保持相对路径结构。但系统上传通常只是平铺文件列表,它不一定保留你的文件夹层级。最稳妥就是:所有图片和tex放同一个文件夹,引用时直接写文件名,不带路径。
2.3 参考文献与bib文件检查
参考文献这一关,系统常见的报错是I couldn't open database file。这通常意味着系统在编译BibTeX时没有找到你的.bib文件。原因可能是主文档里指定了错误的文件名,或者你上传的文件名里有大小写不一致(比如引用refs.bib,上传的是Refs.bib)。
还有一类问题:BibTeX条目里包含特殊字符,比如author = {Zhang, San and Li, Si},其中and前后空格没问题,但如果某个字段值里有&、#、%、_这类LaTeX特殊字符,BibTeX会直接罢工。比如期刊名Journal of A & B Science要写成Journal of A \& B Science。
建议投稿前在本地完整跑一遍pdflatex -> bibtex -> pdflatex -> pdflatex流程,确认没有任何警告和错误,再上传。如果你担心系统里BibTeX版本更老,可以考虑把参考文献合并进主文档的thebibliography环境,不用.bib,这样绕开BibTeX这一环。对于最终投稿,这招简单粗暴又有效。
3. 投稿系统实战:从上传到编译成功的关键操作
3.1 推荐的上传顺序与文件命名规范
投稿系统上传时,它不会因为你“先传tex,后传图”就自动理解你的逻辑,最终它还是靠文件内容来识别。但上传顺序会影响它在文件列表里的物理排列,建议顺序是:
- 主文档(
.tex) - 参考文献(
.bib,如果有) - 所有图片文件
- 其他补充材料
命名规范方面,我强调一条铁律:所有文件名只用小写字母、数字、下划线,不要有空格、连字符、括号、中文。比如Main.tex没问题,但My Manuscript Final (v2).tex就很可能出问题。把最终的投稿文件重命名为main.tex、refs.bib、fig1.pdf这种极简风格最安全。
另外,Elsevier对单个文件大小有限制,大概是50MB左右。如果图片特别大,投稿系统里会有警告。建议图片分辨率控制在300dpi以上,但单个文件压缩到2MB以内,既能看清细节,又不拖垮编译进程。
3.2 如何正确设置主文档(Main Document)
Editorial Manager上传完文件后,通常有一个步骤让你确认“Main Document”,可能是一个下拉列表。如果不设置,系统默认可能会选第一个tex文件。所以,你要确保在“Item Type”或者“Manuscript Components”里,把主tex文件标记为“Manuscript”或“Main Document”。
这里有个细节:Elsevier某些期刊使用“Source Files”上传,它会把上传的所有文件放在一起,然后当天系统自动编译。如果你发现编译失败,查看“View Submission”页面,通常有一个“Check Status”的按钮,点击后能看到系统编译日志。日志开头会显示它识别的主文档路径,比如Main File: /alki/123/main.tex。如果这个路径不对,那就说明主文档标记错了。
3.3 利用系统日志定位错误
系统日志确实难读,但定位错误还是有技巧的。日志文件通常以This is pdfTeX, Version 3.14159265开始,紧接着是编译命令和环境信息。我们可以重点搜索以下关键词:
!(感叹号)开头的行,这就是错误行。Emergency stop——这通常是因为没找到\documentclass,或者文件读取到一半失败。l.xxx——表示错误发生在第xxx行,可以直接跳到对应行看上下文。File ... not found——明确说明缺了哪个文件。
拿到日志后,先看第一个!,不要管后面的多个重复错误,因为第一个错误往往会引发连锁反应。比如开头说Undefined control sequence,那你先解决这个命令问题,也许之后就全部正常了。
有一次我投稿,日志显示Package hyperref Warning: Token not allowed in a PDF string,这本来只是警告,但因为系统设置了“警告也当作错误”(某些期刊这样配置),就导致编译失败。解决办法是把\section{...}里的特殊命令用\texorpdfstring{}保护起来。
4. 高频报错速查:那些“编译不出来”到底在说什么
4.1 Undefined control sequence / 宏包缺失
这是最常见的报错。你用了\incorporate某个新宏包,但系统环境没有这个宏包,LaTeX不认识对应命令。要知道,投稿系统不是全量TeX Live,它为了稳定会裁剪很多宏包。
排查办法:在日志里找到! LaTeX Error: File 'xxx.sty' not found,然后去CTAN查这个宏包是否已经被TeX Live 2019收录。如果没有,要么换实现方式,要么把宏包代码直接复制到你的tex文件里。
但复制代码要注意版权和冲突。比如algorithm2e这种大宏包,复制几百行代码不现实。更好的办法是换个同功能宏包,比如用algorithmic替代algorithm2e。
还有一类是命令冲突。明明宏包存在,但还是Undefined control sequence,可能是你用了\newcommand覆盖了已有命令,或者在\begin{document}之前使用了某些命令。
4.2 中文支持与字体问题
如果你稿子里有中文(比如中文作者名注释、中文关键词),本地你用XeLaTeX+ctex没问题,但Elsevier系统默认是pdfLaTeX编译,根本不管你中文。
系统报错通常是Package inputenc Error: Unicode character ... not set up for use with LaTeX。解决思路:投稿稿里不要放任何中文字符。把中文注释全部删掉,作者和单位的英文都应该是纯ASCII。如果必须要放中文字符(如中文机构名),用\usepackage{CJKutf8}手动切到CJK环境,但我不推荐在投稿阶段冒这个险——正文和标题之外的任何位置都不要出现汉字。
字体问题也容易踩坑。系统环境里没有你使用的中文字体(比如宋体、黑体),连suftest都过不了。除非你投稿到中文期刊,但Elsevier英文期刊为主,就按纯英文处理。
4.3 特殊字符与转义问题
一些从Word或网页复制过来的内容,会带有“智能引号”(弯引号)、连字符长横线、以及不可见Unicode空格。这些字符在LaTeX里并不都是非法,但某些Unicode组合会导致系统崩溃。
常见出问题的字符包括:
- 智能引号
“”‘’ - 全角破折号
— - 版权符号
© - 商标符号
™ - 波浪号
~(LaTeX中为不可断空格,如果不是在命令里,单独一个~会出问题) - 百分号
%(LaTeX注释符,如果没有转义,后面的内容全被注释掉)
解决方法是:在文本编辑器里以纯文本模式重新读取,把所有“智能引号”替换成ASCII直接引号,把长横线替换成---(LaTeX emdash),把版权符号替换成\textcopyright{}。
这里有个小技巧:用VS Code的全局正则替换,一次性把范围扩到整个文档。我一般用[“”]正则替换成",用[‘’]替换成'。替换后记得检查引号配对。
4.4 版本不兼容(pdfLaTeX vs LaTeX vs XeLaTeX)
如果你的本地默认编译器是XeLaTeX或LuaLaTeX,而你用了fontspec宏包、\setsansfont等命令,系统使用pdfLaTeX编译时必然失败,因为fontspec只能在XeLaTeX或LuaLaTeX下工作。
判断自己是否在XeLaTeX环境下很简单,看有没有\usepackage{fontspec}。如果有,投稿前必须删掉,并把字体设置改为标准LaTeX字体(如\usepackage{times}或\usepackage{newtxtext,newtxmath})。
反过来,如果你用了\usepackage[T1]{fontenc},在XeLaTeX下也可能会出问题。但核心是投稿系统固定pdfLaTeX,所以要把稿件改造成完全兼容pdfLaTeX。
另外要注意的是,hyperref宏包在系统里经常制造麻烦。它本身没问题,但只要它加载顺序不对、或选项里有unicode,就可能报错。比较稳的配置是:
\usepackage[hidelinks]{hyperref}如果不需要超链接跳转,用hidelinks可以有效避免很多PDF元数据警告。
5. 压箱底的几个骚操作与经验总结
5.1 把文件“包”成一个单独的tex文件
这招对付系统编译失败非常有效:用filecontents环境把图片以二进制方式嵌入tex文件,或者使用pdfpages宏包直接包含图片PDF页面。不过最常用的还是用\input{}合并文本内容,图片则用\includegraphics引用,如果你担心路径问题,可以先用一个很“土”的方法——把图片转成Base64字符串,通过\includegraphics的bytes选项嵌入,但这不是所有系统都支持。
我用的最多的是“单文件方案”:在本地使用latexpand工具把\input、\include和\bibliography全部展开成一个main_full.tex文件,再把图片文件都转成PDF,最后只上传这一个tex文件和相关图片。
这个方案的好处是,系统不用再去猜主文档,也不会因为.bib引用出现问题。缺点是通过latexpand展开后可能会导致一些格式细节变化,比如目录层次、脚注编号。所以在提交前,一定要完整编译一次单文件版本,检查PDF是否和原版一致。
5.2 使用Elsevier的Overleaf模板
说实话,如果你还在纠结投稿系统编译,不如直接用Overleaf上的Elsevier官方模板。Overleaf中保存的工程本质上是一堆源文件,你可以下载zip包,然后直接上传到Elsevier的投稿系统。因为Overleaf模板和Elsevier系统是同一套配置,兼容性最好。
流程是这样的:
- 打开Overleaf,搜索“Elsevier”模板,选官方模板(比如Elsevier’s Templates)。
- 把论文内容敲进去,本地编译正常。
- 在Overleaf菜单里选择“Source”,下载整个项目zip。
- 在投稿系统里上传这个zip(有些系统允许上传zip,有些需要你解压后挨个传)。
注意,如果系统要求单独上传图片,那你还是要把图片文件从zip里拿出来单独传。别忘了把主文档设置为main.tex。
使用Overleaf模板还有一个额外好处:你可以在提交前用Overleaf的“Submit”功能(针对某些Elsevier期刊)直接提交,它会自动处理好文件传输和编译,你完全绕开手动上传导致的各种问题。
5.3 联系期刊编辑的沟通技巧
如果所有方法都试了,还是编译不出来,可以给期刊编辑发邮件求助。别觉得不好意思,编辑见多了一个月几百个投稿,处理编译问题是常规操作。
邮件里你应该附上:
- 稿件编号(如果有)
- 投稿系统里的报错日志截图(或复制文本)
- 你本地编译成功的那份PDF文件
- 源文件包(zip)
然后礼貌询问是否是系统问题,并提议对方提供一个系统环境下的TeX Live版本号,你愿意在本地复现。一般编辑会回复你,告诉你可能是缺某个宏包或某个文件有问题。我有一次就是编辑帮忙指出,系统用的是TeX Live 2017,不支持我用的\usepackage{newtx}版本,我换回times就过了。
沟通的时候注意语气,毕竟编辑不是给你做技术支持,人家是给你“放行”的人。你态度好、准备充分,编辑也乐意帮你。
6. 最后的经验
这篇文章提到的坑,我基本上都踩过一遍。第一篇文章因为编译失败来来回回折腾了三天,最后发现只是文件名里多了一个空格。后来我学乖了,专门在投稿前用一份“干净”的文件夹,把所有文件名重命名为纯小写,然后用latexpand合并tex文件,图片全转成PDF并放到同一目录,再用pdflatex从零开始编译一遍。这套流程走下来,之后再投Elsevier的期刊,基本一次过。
如果你现在被编译问题卡住,别慌,按我说的顺序排查:先看日志第一个!,对应查宏包是否缺失;再看文件名和路径是否合规;然后确认主文档标记;最后实在不行就转成单文件再传。百分之八十的问题都能解决。
还有一个小技巧,我把本地编译成功的PDF提前生成一份,万一投稿系统编译失败,你还可以在“Attach PDF”的地方直接上传这个PDF。很多期刊是允许你跳过系统编译,直接提供PDF稿件的。当然,有些期刊强制要求源文件,那就没法偷懒了。
祝你的文章顺利过审。编译问题只是小插曲,好的研究成果才是重点。