LaTeX 文档投稿出问题,原因通常和排版毫无关系。本地编译完美无缺,arXiv 的构建却失败;期刊编辑部回信说字体没有嵌入;印刷厂因为缺少裁切标记和出血直接退回。这些都与文字质量无关,只是撞上了接收方为了自动处理而定下的规则。本页依次列出你在按下提交之前能自己确认的事项:arXiv 明文写下的要求、\listfiles 生成的宏包清单、用 pdffonts 检查字体嵌入、用 latexpand/arlatex/bundledoc 把稿件压成一份、双盲评审所需的匿名化,以及送印用的 PDF/X。
向 arXiv 投稿 LaTeX 时该送什么
你送的是源文件,不是 PDF。 arXiv 会用自己的 TeX Live 重新编译收到的 .tex,所以上传的是「在对方机器上能构建起来的一整套」。arXiv 自己的投稿帮助明确写了这几点:对于名为 foo.tex 的文件,不要放入随附的 foo.aux、foo.log、foo.toc、foo.lot、foo.lof、foo.dvi、foo.pdf;但索引 .ind 和 BibTeX 生成的 .bbl 是例外,应当放入,而且 .bbl 的名字必须与主 .tex 文件同名,否则参考文献不会被处理。另外,他们「不提供 TeX Live 系统之外的任何宏包」——所以学会自定的类文件、或你改动过的样式文件,都得自己一并附上。
| 文件 | 是否附上 | 原因 |
|---|---|---|
.tex | 是 | 正文本体;构建始终从提交目录的根部执行 |
.bbl | 是 | 明确的例外;名字必须与主 .tex 一致 |
.ind | 是 | 索引文件与 .bbl 属同类例外 |
.sty / .cls | 自制或改过的要附上 | TeX Live 里没有的东西对方找不到 |
.aux / .log / .toc | 否 | 重新构建时会重新生成,不应放入 |
.pdf / .dvi | 否 | 那是输出本身,与作为插图的 PDF 不是一回事 |
插图格式同样受对方处理链约束。arXiv 的帮助分得很清楚:plain TeX 和走 DVI 的 LaTeX 只接受 PostScript(.ps / .eps),走 PDF 的 LaTeX 接受 .pdf / .png / .jpg——并且直言 arXiv 在 TeX 处理过程中不做「即时」的图形文件转换。也就是说,.eps 和 .pdf 混着送就会失败。还有一点:编译始终从提交目录的根部执行,所以即便主文件放在子目录里,也要确认 \includegraphics{figs/plot} 这样的相对路径从根部看是否成立。绝对路径行不通。
自动处理失败的常见原因
失败的原因大多归结为文件名、路径,以及漏掉了某个文件。 arXiv 公开了一份「导致自动处理失败的常见错误」清单,上面列出的几乎都是一行就能改好的问题:自己写了样式或宏文件(或改动了标准文件)却忘了附上;本该用相对路径的地方写成了绝对路径;文件名里含有空格或特殊字符——上传时会被转成下划线,于是 \includegraphics{my figure} 在提交那一刻就失去了目标;.bbl 是由与 arXiv 的 TeX Live 不匹配的 BibLaTeX 版本生成的;仍在载入 epsbox.sty 这类 dvips 时代的老样式;插图格式混用;以及在图题中使用了未加保护的宏——应写成 \protect\cite{}。
这些问题的共同点在于,某处仍残留着「只在自己机器上成立的前提」。所以最有效的对策不是工具而是流程:新建一个投稿用目录,只把打算寄出的文件复制进去,在没有任何中间文件的状态下确认能从头构建成功。仅此一步,就能让绝大多数绝对路径、漏附文件、以及靠残留 .aux 才通过的构建原形毕露。顺带一提,截稿前临时改动却不做测试就发出去,也是 arXiv 点名列出的失败之一。
# build the submission the way the other end will
mkdir -p /tmp/submit && cp paper.tex refs.bbl mystyle.sty figs/*.pdf /tmp/submit/
cd /tmp/submit && pdflatex paper.tex # must succeed with no .aux present
# a caption calling a macro needs \protect:
% \caption{Following the method of \protect\cite{knuth1984}}
# and a file name with a space will be renamed on upload:
% my figure.pdf -> my_figure.pdf用 \listfiles 留下「用什么组建的」清单
只要在 \documentclass 之前加上一行 \listfiles,.log 的末尾就会列出所有被载入的文件及其版本。实际运行输出的开头是这样的——article.cls 2023/05/17 v1.4n Standard LaTeX document class、amsmath.sty 2023/05/13 v2.17o AMS math features、hyperref.sty 2024-01-20 v7.01h Hypertext links for LaTeX。清单会有几十行,但有了它,「只在对方那边失败」的排查会轻松许多。半年后编辑部说「无法复现」时,日志里留着当时的版本表,差别是决定性的。
*File List*
article.cls 2023/05/17 v1.4n Standard LaTeX document class
size11.clo 2023/05/17 v1.4n Standard LaTeX file (size option)
fontenc.sty 2021/04/29 v2.0v Standard LaTeX package
amsmath.sty 2023/05/13 v2.17o AMS math features
graphicx.sty 2021/09/16 v1.2d Enhanced LaTeX Graphics (DPC,SPQR)
hyperref.sty 2024-01-20 v7.01h Hypertext links for LaTeX
***********想更严谨一层,就用 snapshot 宏包。加上 \usepackage{snapshot} 再编译,会在 .tex 旁生成同名的 .dep 文件,内容是一份用于复现构建的声明:\RequireVersions{ ... },里面排着 *{application}{pdfTeX} {0000/00/00 v1.40.26}、*{format} {LaTeX2e} {2023-11-01 v2.e}、*{class} {article} {2023/05/17 v1.4n} 这样的条目——引擎、格式、文档类和所有宏包,全是机器可读的形式。这个 .dep 文件也正是下一节 bundledoc 的输入。
用 pdffonts 检查字体嵌入——Type 3 为什么会被拒
一条命令就够了:pdffonts paper.pdf。这个随 poppler 附带的工具会把 PDF 用到的每种字体逐行列出,标明 type(Type 1 / Type 3 / TrueType 等)、是否嵌入(emb)、是否子集化(sub)、以及有无 Unicode 映射(uni)。对于直接提交 PDF,arXiv 表示「可能因为非标准、未嵌入的字体而拒绝 PDF 投稿」,并要求「使用轮廓字体(TrueType/Type1)而非位图字体(Type3)」。期刊的制作规范大同小异,因此合格条件很简单:emb 一列全部为 yes,且 type 一列不出现 Type 3。
$ pdffonts paper.pdf
name type encoding emb sub uni object ID
------------------------------------ ----------------- ---------- --- --- --- ---------
NLRVKI+SFBX1440 Type 1 Custom yes yes yes 9 0
LLYCJX+CMMI10 Type 1 Builtin yes yes yes 11 0
JHYTSG+CMR10 Type 1 Builtin yes yes yes 12 0
$ pdffonts bitmap.pdf # the same document forced onto bitmap fonts
F28 Type 3 Custom yes no no 4 0上面第二段输出暴露了这件事最刁钻的地方:Type 3 字体的 emb 也是 yes。 位图确实嵌进了 PDF 里,所以面对「字体是不是都嵌入了」这个问题,可以问心无愧地回答「是」。差别在右边的 uni 列,那里写着 no——没有 Unicode 映射表,这份 PDF 既不能搜索也不能复制。最先暴露出来的症状,往往是审稿人搜不到正文里的某个词。在 pdfTeX 里刻意制造这种状态,只要用 \pdfmapfile{} 把字体映射清空即可;反过来说,字体映射配置被破坏的环境,或者贴进了会吐 Type 3 的老绘图工具的输出,都会在你毫不知情时把你变成这样。
PDF 的版本有时也是投稿要求之一。TeX Live 2024 的 pdfTeX 默认输出 PDF 1.5,可以在 pdfinfo 的 PDF version: 一栏确认。要匹配指定的版本,可在导言区最上方放 \pdfminorversion=7(pdfTeX 的原始命令),或在如今的 LaTeX 中于 \documentclass 之前写 \DocumentMetadata{pdfversion=1.7}。实测下来两者都得到 PDF version: 1.7。生成 PDF/A 本身由另一页负责,请参见下方链接。
把分成多份的稿件压成一份——latexpand、arlatex、bundledoc
按章用 \input 拆开的稿件写起来舒服,但投稿系统往往只要一个 .tex。TeX Live 里带着三件目的不同的工具。latexpand main.tex > flat.tex 会把 \input 和 \include 展开成一份扁平的 .tex。arlatex --document=paper.tex intro.tex --outfile=selfcontained.tex 则把辅助文件各自包进 filecontents* 环境,存进单个 .tex——实测中这份输出直接就能用 pdflatex 编译通过。而 bundledoc 读取 snapshot 生成的 .dep,把所需的全套文件打成 tar.gz。
# one flat .tex (latexpand 1.7.2); NOTE: comments are stripped by default
latexpand main.tex > flat.tex
latexpand --keep-comments main.tex > flat.tex # keep them if you must
# one self-contained .tex carrying its own auxiliary files
arlatex --document=paper.tex intro.tex --outfile=selfcontained.tex
# a tar.gz of exactly what the document needs, excluding TeX Live itself
pdflatex paper.tex # with \usepackage{snapshot} -> paper.dep
bundledoc --localonly --manifest=MANIFEST paper.dep
tar tzf paper.tar.gz
# paper/
# paper/intro.tex
# paper/MANIFEST
# paper/paper.tex这里还有一个与匿名性相关的重要行为:latexpand 默认会去掉注释。 它的手册就写着,默认情况下 latexpand 输出的是一份不含注释的单一 LaTeX 文件;想保留就必须显式加上 --keep-comments。反过来说,这意味着一件让人不安的事:直接把裸的 .tex 送出去,你写在 % 后面的私人便条也会一并送达。 「这一段是写给审稿人二看的」这类备注留在投稿文件里,并不罕见。bundledoc 的 --localonly 出于同样的考虑:排除 TeX Live 那边的文件,只打包你自己写的东西——这正好对上 arXiv 那条「TeX Live 里有的不必附,自制的必须附」的要求。
为双盲评审做匿名化——清掉 PDF 元数据与注释
仅仅从正文里删掉作者名是不够的。PDF 元数据和源文件里的注释是两项独立的检查。 实测表明,\title 和 \author 默认并不会泄漏到 PDF 元数据里——pdfinfo 的 Title: 与 Author: 都是空的,写进去的只有 Creator: LaTeX with hyperref、Producer: pdfTeX-1.40.26 以及创建时间。真正泄漏的情形,是你自己(或模板)写了 \hypersetup{pdfauthor={...}, pdftitle={...}},那样真实姓名就会原样出现在 pdfinfo 里。投稿前敲一句 pdfinfo anon.pdf,看一眼 Author: 那一栏,就足以防住。
$ pdfinfo anon.pdf | head -6
Title:
Subject:
Keywords:
Author:
Creator: LaTeX with hyperref
Producer: pdfTeX-1.40.26
# strip your own margin notes out of the source you upload
latexpand main.tex > anon.tex # comments removed by default学会的类文件常常自带匿名模式,例如 ACM 的 acmart 就把 anonymous 定义为一个类选项(在类文件里以布尔键声明,启用时会在日志中写出 Using anonymous mode)。有现成的就用它最稳妥——因为类文件不只处理作者栏,还会照顾致谢、基金编号以及 \thanks 的处理。若只能自己动手隐去,别忘了致谢、基金号、自引(「在我们此前的工作 [12] 中」),以及烧进插图里的单位标志。pdffonts 和 pdfinfo 找不到的信息,最终只能靠自己重读一遍来发现。
送印刷厂——裁切标记、出血、PDF/X
印刷厂要的是期刊不要的三样东西:标示裁切位置的裁切标记(crop marks)、让颜色干净地延伸到边缘的出血(bleed),以及通常是 CMYK、字体完全嵌入的 PDF/X。西文排版可用 crop 宏包加上标记(\usepackage[cam,center]{crop})。日文同人志与自费出版所用的正式数字トンボ由 texjporg 的 gentombow 绘制,默认取 3mm 出血,并设置 PDF 的 /TrimBox(成品尺寸)与 /BleedBox(含出血)。jsclasses 的 tombow 类选项只画出「类似トンボ」的标记,真正入稿时应与 gentombow 配合。出血指的是把到边的图案延伸到成品线外约 3mm,避免裁切的细微偏差留下白边。
PDF/X(X-1a、X-3、X-4)相当于 PDF/A 的印刷版,要求 CMYK(及专色)、字体完全嵌入、面向印刷机的输出意图(ICC 配置文件),以及正确的 TrimBox/BleedBox(不设置 CropBox,禁止 ArtBox)。从 LaTeX 可用 pdfx 宏包输出,\usepackage[x-1a]{pdfx} 对应 X-1a(只允许 CMYK 与专色)。图像分辨率一般以 300–350 dpi 为准,色彩空间以印刷厂指定为准。最后用 veraPDF 之类的校验工具确认合规,并最终遵循该印刷厂自己的入稿规范——符合标准并不涵盖各家另加的要求。
% Western: crop marks from the crop package
\usepackage[cam,center]{crop}
% Japanese self-publishing: jsclasses option plus gentombow for real tombow
\documentclass[tombow]{jsarticle}
% PDF/X-1a output (CMYK and spot colours only)
\usepackage[x-1a]{pdfx}发送前的检查清单
- 先删掉中间文件,在干净的目录里从头重编一次。残留的
.aux会掩盖本该暴露的问题。 - 启用
\listfiles编译一次,把.log末尾的文件清单保存下来;有snapshot的.dep更好。 - 执行
pdffonts paper.pdf,确认emb一列全是yes,type一列没有Type 3。 - 用
pdfinfo paper.pdf查看Author:与Title:。双盲的话必须为空;同时确认 PDF 版本符合要求。 - 附上自制的
.sty/.cls,剔除.aux/.log/.pdf。.bbl要放入,并与主.tex同名。 - 让插图格式与引擎匹配(走 PDF 就用
.pdf/.png/.jpg,走 DVI 就用.eps),并确认相对路径能从根部解析。 - 若要求单一文件,用
latexpand(注释默认被去除);要打包整套,用bundledoc --localonly。 - 若是送印,确认裁切标记与约 3mm 出血、TrimBox/BleedBox 正确,以及经由
pdfx输出的 PDF/X。