印刷交稿 (裁切标记、PDF)

LaTeX 文档投稿出问题,原因通常和排版毫无关系。本地编译完美无缺,arXiv 的构建却失败;期刊编辑部回信说字体没有嵌入;印刷厂因为缺少裁切标记和出血直接退回。这些都与文字质量无关,只是撞上了接收方为了自动处理而定下的规则。本页依次列出你在按下提交之前能自己确认的事项:arXiv 明文写下的要求、\listfiles 生成的宏包清单、用 pdffonts 检查字体嵌入、用 latexpandarlatexbundledoc 把稿件压成一份、双盲评审所需的匿名化,以及送印用的 PDF/X。

向 arXiv 投稿 LaTeX 时该送什么

你送的是源文件,不是 PDF。 arXiv 会用自己的 TeX Live 重新编译收到的 .tex,所以上传的是「在对方机器上能构建起来的一整套」。arXiv 自己的投稿帮助明确写了这几点:对于名为 foo.tex 的文件,不要放入随附的 foo.auxfoo.logfoo.tocfoo.lotfoo.loffoo.dvifoo.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 点名列出的失败之一。

terminal
# 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 classamsmath.sty 2023/05/13 v2.17o AMS math featureshyperref.sty 2024-01-20 v7.01h Hypertext links for LaTeX。清单会有几十行,但有了它,「只在对方那边失败」的排查会轻松许多。半年后编辑部说「无法复现」时,日志里留着当时的版本表,差别是决定性的。

log
*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

terminal
$ 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,可以在 pdfinfoPDF version: 一栏确认。要匹配指定的版本,可在导言区最上方放 \pdfminorversion=7(pdfTeX 的原始命令),或在如今的 LaTeX 中于 \documentclass 之前写 \DocumentMetadata{pdfversion=1.7}。实测下来两者都得到 PDF version: 1.7。生成 PDF/A 本身由另一页负责,请参见下方链接。

把分成多份的稿件压成一份——latexpandarlatexbundledoc

按章用 \input 拆开的稿件写起来舒服,但投稿系统往往只要一个 .tex。TeX Live 里带着三件目的不同的工具。latexpand main.tex > flat.tex 会把 \input\include 展开成一份扁平的 .texarlatex --document=paper.tex intro.tex --outfile=selfcontained.tex 则把辅助文件各自包进 filecontents* 环境,存进单个 .tex——实测中这份输出直接就能用 pdflatex 编译通过。而 bundledoc 读取 snapshot 生成的 .dep把所需的全套文件打成 tar.gz

terminal
# 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 元数据里——pdfinfoTitle:Author: 都是空的,写进去的只有 Creator: LaTeX with hyperrefProducer: pdfTeX-1.40.26 以及创建时间。真正泄漏的情形,是你自己(或模板)写了 \hypersetup{pdfauthor={...}, pdftitle={...}},那样真实姓名就会原样出现在 pdfinfo 里。投稿前敲一句 pdfinfo anon.pdf,看一眼 Author: 那一栏,就足以防住。

terminal
$ 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] 中」),以及烧进插图里的单位标志。pdffontspdfinfo 找不到的信息,最终只能靠自己重读一遍来发现。

送印刷厂——裁切标记、出血、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 之类的校验工具确认合规,并最终遵循该印刷厂自己的入稿规范——符合标准并不涵盖各家另加的要求。

latex
% 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 一列全是 yestype 一列没有 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。