校正・赤入れ(proofread)

査読者から「12 ページ 3 段落目の 4 行目」と書かれた指摘が返ってきたことがあるなら、LaTeX の校正でまず必要なのが lineno による行番号だと分かるはずです。人文系の学術誌の多くは行番号付きの原稿を投稿要件にしていますし、行番号があれば指摘は「L412」の一語で済みます。このページは校正の一周——行番号を振る、余白に宿題を貼る、共著者の赤入れを著者ごとに色分けする、latexdiff で「前回からどこが変わったか」を PDF で見せる、そして chktexlachecknag という三つのリンターに機械的な粗探しをさせる——を、すべて実際に動かした出力とともに追います。

査読原稿に行番号を振る — lineno パッケージ

\usepackage{lineno} を読み込んで \linenumbers と書けば、それ以降の本文の左余白に行番号が出ます。オプションで見た目を変えられます——modulo は 5 の倍数の行にだけ番号を出し(余白がうるさくならない)、pagewise はページごとに 1 から振り直し、switch は両面組みで番号を外側の余白に置きます。番号を止めたいところで \nolinenumbers、範囲だけ振るなら linenumbers 環境。文書の一部だけ、たとえば付録を除いた本文だけに振るのは日常的な要求です。

latex
\usepackage[modulo]{lineno}   % number every 5th line only
% \usepackage[pagewise]{lineno} % restart the count on each page
% \usepackage[switch]{lineno}   % outer margin, for twoside
\linenumbers
...
\nolinenumbers                % stop numbering (e.g. before the appendix)

ここに、知らないと査読でかみ合わなくなる落とし穴があります。既定では別行立ての数式に行番号が付きません。 amsmathequationalign を挟んだ文書を実測すると、本文の行番号は 1, 2, 3 と数式を飛び越えていきました。同じ文書に \usepackage[mathlines]{lineno} を指定すると 1 から 6 まで通し番号になり、数式の各行にも番号が付きます。つまり mathlines の有無で「L4」が指す場所が変わるわけで、査読者と著者が別の設定で組んだ PDF を見ていると議論が噛み合いません。数式の多い原稿では mathlines を付けておくほうが安全です。

オプション・命令効果
\linenumbers以降の本文に行番号を振りはじめる
\nolinenumbers行番号を止める(付録の直前などに置く)
modulo5 の倍数の行にだけ番号を出す
pagewiseページごとに 1 から数え直す
switch両面組みで番号を外側の余白へ置く
mathlines別行立て数式の各行にも番号を振る(既定では振らない)

lineno は 1995 年から続く古い道具で、TeX Live 2024 に入っているのは 2023 年 5 月 20 日付の v5.3 です。パッケージ冒頭の著作権表示に三世代が並んでいて、1995〜2003 年が Stephan I. Böttcher、4.x 系が Uwe Lück、そして 5.x 系を 2021 年から Karl Wette が引き継いでいます。30 年ぶんの互換性の面倒を見てきたパッケージなので、他のパッケージと組み合わせたときの挙動は素直ではありません。読み込み順で挙動が変わることがあるため、うまく番号が付かないときは lineno を最後に読み込んでみてください。

latexdiff の使い方 — 共著者に「どこが変わったか」を PDF で見せる

latexdiff old.tex new.tex > diff.tex を実行し、できた diff.tex をふつうに pdflatex にかけるだけです。それだけで、追加された語句と削除された語句が視覚的に区別された PDF が出ます。実際に走らせると、latexdiff は元の文章に \DIFaddbegin / \DIFadd{...} / \DIFdelbegin / \DIFdel{...} というマーカーを挿し込み、プリアンブルに \RequirePackage[normalem]{ulem} と色の定義を追加します。この道具が校正のなかで飛び抜けて価値が高いのは、相手に「LaTeX を読む」作業をさせずに済むからです——git の差分ではなく、組版された紙面の上で違いが見えます。

terminal
# the whole workflow
latexdiff old.tex new.tex > diff.tex
pdflatex diff.tex

# one file made of many \input files: flatten first
latexdiff --flatten old/main.tex new/main.tex > diff.tex

# diff straight against a git revision (produces main-diffHEAD~1.tex)
latexdiff-vc --git --flatten -r HEAD~1 main.tex

# a different visual style, e.g. bold instead of underline
latexdiff --type=CFONT old.tex new.tex > diff.tex

既定の見た目は、よく言われる「追加は下線、削除は取り消し線」より少し具体的です。TeX Live 2024 同梱の v1.3.3latexdiff --version は「(c) 2004-2022 F J Tilmann」と名乗ります)が挿入するプリアンブルは、\DIFadd{\protect\color{blue}\uwave{#1}}\DIFdel{\protect\color{red}\sout{#1}} と定義しています。つまり 追加は青の波線、削除は赤の取り消し線。この既定は --type=UNDERLINE という名前が付いていて、--type には CTRADITIONALTRADITIONALCFONTFONTSTRIKEINVISIBLECHANGEBARCCHANGEBARCULINECHBARCFONTCHBARBOLDPDFCOMMENT が並びます。白黒で印刷する査読者に送るなら FONTSTRIKEBOLD のほうが読めます。

latex
% What latexdiff actually writes into diff.tex (excerpt of a real run):
\RequirePackage[normalem]{ulem}
\providecommand{\DIFadd}[1]{{\protect\color{blue}\uwave{#1}}}
\providecommand{\DIFdel}[1]{{\protect\color{red}\sout{#1}}}
...
The measured value was \DIFdelbegin \DIFdel{3.2}\DIFdelend
  \DIFaddbegin \DIFadd{3.4}\DIFaddend \,mm.

実務での使いどころは二つあります。ひとつは投稿・改訂稿——多くの学術誌が「変更点を強調した版」の同時提出を求めるので、latexdiff の出力がそのまま提出物になります。もうひとつが共著者への送付です。分割執筆している文書なら --flatten を付ければ \input を展開してから比較しますし、latexdiff-vc --git --flatten -r HEAD~1 main.tex はワーキングツリーと過去のコミットを直接比べて main-diffHEAD~1.tex を書き出します。注意点として、latexdiff は LaTeX を構文としてではなくテキストとして扱うため、表や図の中の変更ではマークアップが壊れることがあります。壊れたら --append-safecmd で該当命令を安全リストに加えるか、その環境だけ --exclude-textcmd で除外してください。

共著者ごとに色を分ける — changes パッケージ

latexdiff が二つの版を外から比べるのに対し、changes は変更をソースの中に書き込みます。\definechangesauthor[name={Ada Lovelace}, color=blue]{AL} のように著者を登録しておき、\added[id=AL]{...}\deleted[id=AL]{...}\replaced[id=AT]{新}{旧}\comment[id=AT]{...} で赤入れします。\listofchanges を置くと「List of changes」という一覧が出て、実測では Added (AL): ... / Replaced (AT): ... / Deleted (AL): ... / Commented (AT): ... が誰の手によるものかとともに並びました。TeX Live 2024 に入っているのは v4.2.1(2021/07/15) です。

latex
\usepackage[markup=underlined]{changes}   % draft look; the default
\definechangesauthor[name={Ada Lovelace}, color=blue]{AL}
\definechangesauthor[name={Alan Turing},  color=orange]{AT}
\begin{document}
\listofchanges
The engine \added[id=AL]{weaves algebraical patterns} and
\replaced[id=AT]{computes}{calculates} the numbers.
\deleted[id=AL]{This sentence is redundant.}
\comment[id=AT]{Check the citation here.}

仕上げの一手が重要です。\usepackage[final]{changes} に切り替えると、changesマークアップを隠すのではなく、編集を適用します。実測では、\added の文言は残り、\replaced は新しいほうだけが残り、\deleted の一文と \comment は消えて「The engine weaves algebraical patterns and computes the numbers. Ordinary text.」という完成稿になりました。つまり最終版を作るのに命令を手で消して回る必要がありません。逆に言えば、final に切り替える前の PDF と後の PDF は中身が違うので、投稿前に必ず final で組み直して読み返してください。

余白に宿題を貼る — todonotes\todo

% で書いたコメントはコンパイルすると消えます——だから共著者には届きません。todonotes は宿題を出力に残すための道具です。\todo{check this number} は余白に付箋を描き、\todo[inline]{...} は本文の流れの中に帯として置き、\missingfigure{plot of the residuals} は「ここに図が入る」というプレースホルダの箱を描きます。\listoftodos は先頭に「Todo list」という目次を作り、実測では各項目がページ番号付きで並びました——読み終えるまでに何が残っているかが一目で分かります。

latex
\usepackage[textwidth=3cm]{todonotes}
% \usepackage[disable]{todonotes}   % final version: hides notes AND the list
\begin{document}
\listoftodos
Some text.\todo{check this number}
More text.\todo[inline,color=green!30]{rewrite this paragraph}
\missingfigure{plot of the residuals}

完成版を作るときは \usepackage[disable]{todonotes} に差し替えます。実測すると、余白の付箋も \missingfigure の箱も、そして冒頭の「Todo list」ごと消えました——命令を書いた場所はそのまま残せるので、次の改訂で disable を外せば宿題がまた現れます。ここが % コメントとの決定的な違いで、宿題を消さずに隠せるのです。ただし disable のまま投稿してしまうと、未処理の宿題が残っていることに誰も気づきません。投稿直前には一度 disable を外して \listoftodos を確認する、を手順に入れておくと安全です。

chktexlacheck — pdflatex が何も言わない誤りを拾う

この二つは組版としては正しいが読者には不親切、という誤りを拾います。 pdflatex は「コンパイルが通るか」しか見ていないからです。実例で示します。As shown in Fig. 1 and in Table \ref{tab:one}, see also \cite{knuth1984}. という一行を pdflatex に通しても、返ってくるのは LaTeX Warning: Reference 'tab:one' on page 1 undefined という参照の話だけ。同じ行を chktex にかけると、次の警告が二度出ます。

terminal
$ chktex -q ref.tex
Warning 2 in ref.tex line 3: Non-breaking space (`~') should have been used.
As shown in Fig. 1 and in Table \ref{tab:one}, see also \cite{knuth1984}.
                               ^
Warning 2 in ref.tex line 3: Non-breaking space (`~') should have been used.
As shown in Fig. 1 and in Table \ref{tab:one}, see also \cite{knuth1984}.
                                                       ^

ここで訂正しておきたいことがあります。よく「chktexFig. 1~ 抜けを叱る」と言われますが、既定の設定では叱りませんchktex~ 検査(警告 2)が見張るのは chktexrcLinker リストに載っているもの——\ref\vref\pageref\eqref\cite——の直前だけで、Fig. 1 のような素の文字列は対象外です。Fig. を拾わせたいなら、Abbrev リストに自分で足す必要があります。足したうえで同じファイルを検査すると、今度は Warning 12 in ref.tex line 3: Interword spacing should perhaps be used.Fig. の位置を指して出ました——ピリオドの後に文末の広い空きが入ってしまう、という指摘です。

警告番号指摘の内容拾われる書き方
2Non-breaking space (~) should have been used.Table \ref{...}see \cite{...} の直前の素の空白
8Wrong length of dash may have been used.範囲やダッシュに - 一本を使っている
11You should use \ldots to achieve an ellipsis.... を三点リーダの代わりに打っている
12Interword spacing should perhaps be used.Abbrev に登録した略語のピリオドの後
18Use TeX quotes as an alternative to the straight double quote.直線の二重引用符 " を使っている
26You ought to remove spaces in front of punctuation.句読点の前に空白がある
29$\times$ may look prettier here.5x10^3 のように x を掛け算に使っている
9'itemize' expected, found 'enumerate'.環境の入れ子がずれている
terminal
# The messages exactly as chktex prints them (one run, one bad file):
Warning 18 in bad.tex line 4: Use either `` or '' as an alternative to `"'.
Warning 11 in bad.tex line 4: You should use \ldots to achieve an ellipsis.
Warning 26 in bad.tex line 4: You ought to remove spaces in front of punctuation.
Warning 29 in bad.tex line 5: $\times$ may look prettier here.
Warning  8 in bad.tex line 7: Wrong length of dash may have been used.
Warning  9 in mm.tex  line 5: `itemize' expected, found `enumerate'.

lacheck はもっと寡黙で、そのぶん役割がはっきりしています。chktex が正規表現で書き方の癖を見張るのに対し、lacheck は文書の構造の整合を見ます。\begin{itemize}\end{enumerate} で閉じたファイルを渡すと、次のように両方の位置を対にして教えてくれます——"mm.tex", line 5: <- unmatched "\end{enumerate}""mm.tex", line 3: -> unmatched "\begin{itemize}"。同じ誤りを chktexWarning 9 として拾いますが、指すのは閉じたほうの一箇所だけ。長い文書で「どこから対応が壊れたのか」を知りたいときは lacheck のほうが速く答えにたどり着きます。両方走らせるのが正解です。

terminal
$ lacheck mm.tex
"mm.tex", line 5: <- unmatched "\end{enumerate}"
"mm.tex", line 3: -> unmatched "\begin{itemize}"

# chktex exits with the number of warnings, so CI can gate on it
$ chktex -q ref.tex >/dev/null; echo $?
2
# mute one check by number and it passes
$ chktex -q -n2 ref.tex >/dev/null; echo $?
0
# teach it your abbreviations via a local rc file
$ printf 'Abbrev { Fig. Eq. Sec. }\n' > my.chktexrc
$ chktex -q -l my.chktexrc ref.tex

chktex の終了ステータスが警告の本数そのものである点は、CI に組み込むときに効きます。上の実測では chktex -q ref.tex の終了コードが 2(警告 2 本)、-n2 で警告 2 番を黙らせると 0 になりました。つまり「この検査だけは許容する」という方針をリポジトリの設定として書き下せます。プロジェクトごとの設定は -l my.chktexrc で読ませるか、% chktex-file 26 のような行内指定で局所的に抑制します。

古い命令と使われていないラベルを叱る — nagrefcheck

nag は「動くが古い」書き方をコンパイル時に指摘するパッケージです。\RequirePackage[l2tabu,orthodox]{nag}\documentclassに置いて走らせると、ログに次のような苦言が並びます——Package nag Warning: Command \bf is an old LaTeX 2.09 command. に続けて Use \bfseries or \textbf instead on input line 5.$$...$$ is obsolete. Use \[...\] et al. insteadCommand \centerline is TeX. Use \centering or center environment insteadPackage epsf is obsolete. Use the graphicx package instead.、そして締めくくりに Package nag Warning: 5 complaints in total.。何十年も前のテンプレートを引き継いだ原稿を最初に通すと効果が大きい道具です。

もうひとつ、投稿前に一度は走らせたいのが refcheck です(TeX Live 2024 収録は v1.9.1)。\usepackage{refcheck} を足して二回コンパイルすると、参照されていないラベルをログに挙げてくれます——実測では Package refcheck Warning: Unused label 'sec:unused' on input line 5.Package refcheck Warning: Unused label 'eq:never' on input line 7. が出ました。番号を振ったのに一度も参照していない式は、たいてい「番号を外すべき式」です。原稿を短くしろと言われたときに真っ先に削れる場所でもあります。

latex
\RequirePackage[l2tabu,orthodox]{nag}   % MUST come before \documentclass
\documentclass{article}
\usepackage{refcheck}                   % lists labels nobody refers to
% Then: pdflatex paper.tex && grep -E "nag Warning|refcheck Warning" paper.log

校正の一周をどう回すか

道具の使い分けは、誰に何を見せるかで決まります。自分と共著者に向けた作業中の宿題は todonotes、誰の手による修正かを残したいときは changes、査読者に「前の版から何が変わったか」を示すのは latexdiff、そして機械にやらせられる粗探しは chktexlachecknag。この四つは競合しません。以下の順で回すと、同じ原稿に二度手間をかけずに済みます。

  • 執筆中は todonotes\todo{...}\missingfigure{...} で宿題を残し、\listoftodos で残数を数える。
  • 共著者に回す前に chktexlachecknag を走らせ、機械が拾える粗を先に消しておく。人間の目を粗探しに使わない。
  • 共著者へ送るときは lineno\linenumbers を有効にした版を作る。数式が多ければ mathlines も付ける。
  • 相手の赤入れは changes\added / \replaced / \deleted で受け取り、\listofchanges で処理漏れを防ぐ。
  • 版を渡すたびに latexdiff --flatten old.tex new.tex > diff.tex を作って同梱する。相手は差分 PDF だけ見ればよい。
  • 投稿直前に refcheck で未使用ラベルを掃除し、todonotesdisablechangesfinal に切り替えて組み直す。