인쇄 입고(재단선, PDF)

LaTeX 문서 투고에서 걸려 넘어지는 이유는 대개 조판과 아무 상관이 없습니다. 내 컴퓨터에서는 완벽하게 통과하는데 arXiv의 빌드는 무너집니다. 학술지 편집부에서는 “글꼴이 임베드되지 않았다”는 답이 옵니다. 인쇄소는 재단 표시와 도련이 없다며 그대로 돌려보냅니다. 어느 것도 글의 질과는 무관하고, 받는 쪽이 자동 처리를 하려고 정해 둔 규칙에 걸린 것뿐입니다. 이 페이지는 보내기 전에 스스로 확인할 수 있는 것들을 차례로 늘어놓습니다. arXiv가 명문화한 요건, \listfiles로 만드는 사용 패키지 목록, pdffonts를 이용한 글꼴 임베딩 검사, 원고를 한 벌로 묶는 latexpandarlatexbundledoc, 이중 맹검을 위한 익명화, 그리고 인쇄 입고용 PDF/X까지입니다.

arXiv에 LaTeX을 투고할 때 무엇을 보내는가

보내는 것은 소스이지 PDF가 아닙니다. arXiv는 받은 .tex을 자기네 TeX Live로 다시 조판하므로, 올리는 것은 “저쪽에서 빌드가 되는 한 벌”입니다. 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가 콕 집어 드는 실패 가운데 하나입니다.

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 class, amsmath.sty 2023/05/13 v2.17o AMS math features, hyperref.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), 유니코드 대응표 유무(uni)를 보여 줍니다. PDF 직접 투고에 대해 arXiv는 “비표준·비임베드 글꼴을 이유로 PDF 투고를 거부할 수 있다”고 밝히고, “비트맵(Type3)이 아니라 아웃라인(TrueType/Type1) 글꼴을 쓸 것”을 요구합니다. 학술지의 제작 규정도 거의 같습니다. 그러니 합격 조건은 간단합니다. 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 글꼴도 embyes입니다. 비트맵이 실제로 PDF 안에 임베드되어 있으니, “글꼴이 모두 임베드되었습니까”라는 질문에는 떳떳하게 “예”라고 답할 수 있습니다. 차이는 오른쪽 uni 열에 있고, 거기에는 no가 적혀 있습니다. 유니코드 대응표가 없으므로 그 PDF는 검색도 복사도 되지 않습니다. 대개 심사자가 본문에서 낱말을 검색하지 못하는 형태로 처음 드러납니다. pdfTeX에서 이 상태를 일부러 만들려면 \pdfmapfile{}로 맵을 비우면 되는데, 뒤집어 말하면 글꼴 맵 설정이 망가진 환경이나 Type 3를 뱉는 낡은 작도 도구의 출력을 붙여 넣었을 때 아무 말 없이 이렇게 됩니다.

PDF의 버전 자체가 투고 요건이 되기도 합니다. TeX Live 2024의 pdfTeX가 기본으로 써내는 것은 PDF 1.5이며, pdfinfoPDF version: 항목에서 확인할 수 있습니다. 지정된 버전에 맞추려면 프리앰블 맨 위에 pdfTeX 원시 명령 \pdfminorversion=7을 두거나, 요즘 LaTeX이라면 \documentclass 앞에 \DocumentMetadata{pdfversion=1.7}을 씁니다. 실측에서는 둘 다 PDF version: 1.7이 되었습니다. PDF/A 생성 자체는 다른 페이지의 담당이니 아래 링크를 참고하세요.

나뉜 원고를 하나로 묶기 — latexpandarlatexbundledoc

장마다 \input으로 나눈 원고는 쓰기에는 좋지만, 투고 창구는 흔히 “하나의 .tex”을 요구합니다. TeX Live에는 목적이 다른 세 도구가 들어 있습니다. latexpand main.tex > flat.tex\input\include를 펼쳐 한 장짜리 .tex으로 만듭니다. arlatex --document=paper.tex intro.tex --outfile=selfcontained.tex은 보조 파일을 filecontents* 환경에 감싸 하나의 .tex 안에 담습니다. 실측에서는 이 출력도 그대로 pdflatex로 통과했습니다. 그리고 bundledocsnapshot이 만든 .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는 기본적으로 주석을 제거합니다. 설명서에도 기본값에서는 주석이 없는 단일 LaTeX 파일을 출력한다고 적혀 있고, 남기려면 --keep-comments를 명시해야 합니다. 뒤집어 보면 불편한 사실이 됩니다. .tex을 보내면 % 뒤에 적은 사적인 메모까지 그대로 상대에게 갑니다. “이 문단은 심사자 2를 겨냥한 것”류의 메모가 투고 파일에 남는 사고는 드물지 않습니다. bundledoc--localonly도 같은 발상입니다. TeX Live 쪽 파일을 제외하고 자기가 쓴 것만 묶습니다. 표준 패키지는 동봉하지 않아도 되지만 자작 파일은 반드시 넣으라는 arXiv의 요구와 정확히 맞물립니다.

이중 맹검을 위한 익명화 — 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 열이 모두 yes이고 type 열에 Type 3가 없는지 확인합니다.
  • pdfinfo paper.pdfAuthor:Title:을 봅니다. 이중 맹검이라면 비어 있어야 하고, PDF 버전이 요구대로인지도 확인합니다.
  • 직접 만든 .sty / .cls는 동봉하고 .aux / .log / .pdf는 뺍니다. .bbl은 넣고 이름을 주 .tex에 맞춥니다.
  • 그림 형식을 엔진에 맞춥니다(PDF 경로면 .pdf / .png / .jpg, DVI 경로면 .eps). 상대 경로가 최상위에서 풀리는지도 확인합니다.
  • 한 파일로 요구하면 latexpand(주석은 기본적으로 제거됨), 한 벌을 묶으려면 bundledoc --localonly를 씁니다.
  • 인쇄 입고라면 재단 표시와 약 3mm 도련, 올바른 TrimBox/BleedBox, pdfx를 통한 PDF/X 출력을 확인합니다.