共著者から「Word で送ってください」と言われた瞬間、LaTeX 使いの一日は終わります。橋渡しの定番は pandoc——Markdown・LaTeX・.docx のあいだを行き来する変換器ですが、往復の勝手はまるで違います。Word → LaTeX は、もともと無かった構造を作る作業なので、失うものがありません。LaTeX → Word は逆で、\label と \ref の対応、\newcommand の意味、数式の構造といった、あなたが積み上げた構造を平らに潰していきます。LaTeX はプログラムで、.docx は出来上がった結果の記録です。プログラムを走らせて結果を残すことはできても、結果からプログラムを復元することはできません——この非対称が、このページの話の骨格です。
なぜ LaTeX → Word のほうが失うものが多いのか
答えは単純で、行き先に受け皿が無いからです。.docx は本質的に「段落と文字装飾とスタイル名」の入れ物で、\newcommand に相当する仕組みも、\ref が指す番号を再計算する仕組みも持っていません。ですから pandoc は、あなたの意図を Word の語彙に翻訳できるところまで翻訳して、翻訳できない部分は落とします。番号は「そのとき計算された数字」として固定され、相互参照は生きたリンクではなくただの文字になります。逆向きはずっと気楽です。Word 文書には見出しレベルと箇条書きと太字くらいしか構造が無いので、pandoc はそれを \section や itemize に写すだけで済み、元より情報が増えることはあっても減ることはありません。この非対称は pandoc 自身の歴史にも刻まれていて、.docx の書き出しができるようになったのは 2012 年の pandoc 1.9、読み込み(しかも変更履歴を理解する)は 2014 年に Jesse Rosenthal が加えたもの——プロジェクト開始から 6 年と 8 年が経っていました。
pandoc の基本——-f と -t、そして --pdf-engine
pandoc の使い方は入力形式を -f(--from)、出力形式を -t(--to)で指定するだけです。中央にひとつの抽象構文木(AST)を置き、入力側の reader が AST を作り、出力側の writer が書き出す——この構造のおかげで、形式の組み合わせが増えても実装は掛け算にならずに済みます。作者の John MacFarlane はカリフォルニア大学バークレー校の哲学の教授で、Haskell を学ぶために書きはじめました。2006 年 8 月 3 日に公開された最初の版はおよそ 3000 行、それでもすでに Markdown・reStructuredText・HTML・LaTeX を相互に変換できました。いまでは入力 50 種類以上・出力 70 種類以上の形式を扱うまでに育ちました。なお --pdf-engine=lualatex を付ければ LaTeX エンジン経由で PDF まで一息に出せますが、pandoc は TeX Live には含まれません。Haskell で書かれた独立したプログラムなので、別途インストールが必要です。
pandoc -f markdown -t latex in.md -o out.tex # Markdown to LaTeX
pandoc in.md -o out.pdf --pdf-engine=lualatex # Markdown straight to PDF
pandoc in.tex -o out.docx # LaTeX to Word
pandoc in.docx -o out.tex # Word to LaTeX出力を細かく作り込む手段も2つ用意されています。--template は文字ベースの出力形式(latex、html など)の外枠を差し替えるもので、プリアンブルや \documentclass を自分の投稿用テンプレートに置き換えられます。.docx のようなバイナリ形式には効かないので、そちらは前述の --reference-doc の担当です。もうひとつが Lua フィルタ(--lua-filter)で、読み込み後・書き出し前の AST を直接書き換えます。「特定の環境を別の見出しに変える」「\todo{...} を全部消す」といった処理は、正規表現で LaTeX ソースをいじるより、この段階でやるほうがはるかに安全です。
pandoc が読める LaTeX、読めない LaTeX——警告は出るのか
pandoc は LaTeX の一部しか理解しませんが、完全に黙っているわけでもありません。 数式については、解析できないものに出会うと Could not convert TeX math という警告を出したうえで、その数式を LaTeX のまま出力に残します——落とすのではなく、そのまま渡す設計です。自作マクロも意外に強く、latex_macros という拡張が有効なとき、pandoc は公式マニュアルの言葉どおり「LaTeX のマクロ定義を解析し、得られたマクロをすべての LaTeX 数式と生の LaTeX に適用」します。つまり \newcommand{\R}{\mathbb{R}} 程度なら通ります。本当に静かに消えるのは、その先です。pandoc が「これは LaTeX の生コードだ」と判断したブロック(tikzpicture 環境など)は AST に raw として保持されますが、.docx や HTML の writer はそれを書き出しません。警告は数式のときのように出ないので、Word で開いたときにはじめて図が丸ごと消えていることに気づく、という事故が起こります。
--reference-doc で Word の体裁を決める
出力された .docx の見た目が気に入らないときに触るのは、テンプレートではなく --reference-doc です。公式マニュアルは仕組みをこう説明しています——参照 docx の中身は無視され、そのスタイルシートと文書プロパティ(余白・用紙サイズ・ヘッダー・フッターを含む)だけが新しい docx に使われる。つまり参照ファイルは「白紙の書式見本」であって、雛形の文章ではありません。だから正しい作り方は、まず pandoc から既定の参照ファイルを取り出し、それを Word や LibreOffice で開いてスタイル(Heading 1、Body Text、Table Caption など)を投稿規定どおりに直し、保存して使い回すことです。マニュアルは「参照 docx は pandoc が生成した docx を改変したものが最良」とも書いています。取り出すコマンドでは -o を --print-default-data-file より前に置く必要があります。
# 1. extract the default reference file (-o must come first)
pandoc -o custom-reference.docx --print-default-data-file reference.docx
# 2. edit the STYLES in Word or LibreOffice, then save
# 3. reuse it for every export
pandoc in.tex -o out.docx --reference-doc=custom-reference.docxWord → LaTeX で実際に効くオプション
.docx は実体が XML の ZIP 書庫なので、pandoc は中身を直接読めます。取り込みで最初に付けるべきは --extract-media=media で、これは公式マニュアルの説明どおり「文書に含まれる、あるいはリンクされた画像やメディアを指定ディレクトリに取り出し、画像への参照を取り出したファイルに合わせて書き換える」もの。これを忘れると図がどこにも出てきません。共著者から返ってきたファイルには変更履歴が残っていることが多く、--track-changes=accept(採用)/reject(却下)/all(すべてを span として保持)で扱いを決められます。このオプションは docx reader にしか効きません。 文献は --citeproc と .bib の組み合わせで処理でき、CSL スタイルは --csl で指定します。段落が 1 行に収まらず折り返されるのが煩わしければ --wrap=none を足してください。Word の段落スタイルは custom-style として保持されるので、著者が使っていた独自スタイルを LaTeX 側の環境に対応づける手がかりになります。
pandoc in.docx -o out.tex \
--extract-media=media \
--track-changes=accept \
--wrap=none
# with a bibliography and a journal style
pandoc in.docx -o out.tex --citeproc --bibliography=refs.bib --csl=apa.cslpandoc を入れずに Word へ渡す——tex4ht の ODT 出力
あまり知られていませんが、TeX Live だけでワープロ形式まで出せます。 make4ht -f odt file.tex を実行すると .odt(OpenDocument テキスト)ができます。中身を開けてみると、これが単なる画像貼りではありませんでした——数式は application/vnd.oasis.opendocument.formula という ODF の数式オブジェクトとして埋め込まれ、その中身は MathML です。つまりワープロ側で数式が数式のまま生きています。mk4ht oolatex file.tex でも同じ経路が走ります(古い記事には oolatex という単独コマンドが出てきますが、TeX Live 2024 では mk4ht のジョブ名として呼ぶ形です)。Word は ODF テキストを開けますし、確実を期すなら LibreOffice で開いて .docx として保存し直せます。数式を編集可能なまま渡したいときは、pandoc 経由より結果が良いことがあります。
# LaTeX to OpenDocument text, using only TeX Live
make4ht -f odt file.tex
# the same route under its historical name
mk4ht oolatex file.tex他の道具も名前だけは挙げておきます。writer2latex は LibreOffice/OpenOffice の文書を LaTeX に変換するオープンソースの Java ツール、GrindEQ は Word ↔ LaTeX の商用変換器で MathType の数式に強いことで知られます。どちらも TeX Live には含まれず、この記事を書いた環境にも入っていないので、動作は確認していません。導入するなら、まず手元の実物のファイルで小さく試して、数式と図が生き残るかを自分の目で確かめてください。
Word を要求する共著者とどう付き合うか
- LaTeX を正本にする。
.docxは「出力」であって作業ファイルではありません。Word 側で直接編集された版を正本にした瞬間、往復のたびに劣化が始まります。 - 渡すのは節単位で。 全文を 1 個の
.docxにするより、コメントが欲しい節だけを渡すほうが、戻ってきたときの取り込みがはるかに楽です。 - 戻ってきたら
--track-changes=allでまず読む。 何が変わったかを見てからacceptで取り込むか、変更点だけを手で本文に写します。 - 図は最初から画像で持つ。 TikZ を pandoc に通すと消えるので、図は SVG か PDF に書き出したものを
\includegraphicsで参照する構成にしておくと、変換のたびに壊れません。 - 数式を編集させたいなら ODT 経由も試す。
make4ht -f odtは数式を MathML の数式オブジェクトとして残します。 - 投稿規定は
--reference-docに閉じ込める。 余白やスタイルを毎回 Word で直すのは、二度目からは必ず忘れます。