Edited at

Latexmkから学ぶPDF化までの処理の流れ

More than 1 year has passed since last update.

 texファイルをpdf化するために,TeXShopやW32TeX,latexmk等を使って,ネット上で書かれている設定を何も考えずに動かせば,簡単にpdf化できます.

 しかし何事も,処理の基本的な流れを理解せずにブラックボックス化した状態で作業をすると,思わぬ落とし穴にはまることがあります(戒め).例外なく,実際latexにおいて穴に嵌ったので,一から勉強することにしました.

 本記事は,汎用的に理解できる形で書いていますが,設定等はTeXLive用でビューアにSkimを使うことを前提としています.


PDF化の流れ

 基本的に大まかには,


  1. texファイル(ソースファイル)からdviファイル(デバイスに非依存)を作成

  2. dviファイルからpdfファイルを作成

の流れになります.

 1.で使用するコマンドが,日本語だと大体platex

 2.で使用するコマンドが,大体dvipdfmx

 Unicodeに対応させたい人は,platexでなく,uplatexやxetexを使ったり,xetexだとdvipdfmxでなくてxdvipdfmxなんてのを使用したりします.

 機能の違いや歴史等を知りたい人がいれば,ここのページに分かりやすい説明が書いてありました.


platex

platexコマンドでtexファイルをコンパイルするとdvi,log,auxファイルが作成されます.


  • dviファイル:文書の見た目のレイアウトをデバイスに依存しない形で記録したバイナリデータ

  • logファイル:コンパイル時に出力されるエラー等を記録したテキストデータ

  • auxファイル:中間的にラベルと番号の対応付けを保存しておくためのテキストデータ


dvipdfmx

dvipdfmxコマンドでdviファイルからpdfファイルを出力します.

詳しい説明が欲しい人はこの辺りでも.


platexコマンドでの注意点


エラーが起きたときの挙動

 latexは,デフォルトではエラーが起きたときに,どうするかユーザの入力を促します.

Type <return> to proceed, S to scroll future error messages,

R to run without stopping, Q to run quietly,
I to insert something, E to edit your file,
1 or ... or 9 to ignore the next 1 to 9 tokens of input,
H for help, X to quit.
?

 基本的にはエラーが出た際には,X [return]で処理を中断して,エラー箇所を直してからもう一度コンパイルすればOKです.R [return]だとエラーを気にせずそのまま最後まで実行し,Q [return]だとそのまま静かに終了します.


複数回のコンパイル

 latexの機能として「相互参照」があります.これはソースファイル中の図表等に自動で番号を割り振ったり,著者が覚えやすい名前(ラベル)をつけておいて,後からその番号を参照するための機能です.

 platexコマンドでコンパイルする際,高速・省メモリ化のために,ソースファイルを上から順に読みながらファイルに出力を行って,そのときの結果を保存しません.結果,番号の参照(\ref)等があれば,最初のコンパイル時点ではplatexは覚えていないので,表示が「??」になります.

 platexコマンドでは,自身が前回出力したauxファイルがあれば,それをコンパイル中に検索することで,参照される番号を取得します.つまり,ソースファイルの振られている番号が追加・変更され,それを参照する場合,2回以上のコンパイルが必要となります.

 表示が「??」になる場合,logファイルを確認すれば警告が出ているので,ソースファイルが正しければ,その警告がでなくなるまでコンパイルすればOKです.

 ただし,警告が出なくなるまでのコンパイルの回数は,常に有限回数ではない点に気をつけてください.詳しくは,ここを参照してください.


外部コマンドの実行

 platexのデフォルトでは,ソースファイルをコンパイルする際に必要な外部コマンドを自動で実行する機能があります.

 例えば,画像ファイルを埋め込む場合,dviファイルを出力するときに,画像の高さや幅などのレイアウトの情報(バウンディングボックス情報)が無いと,配置をどのようにすればいいか解釈できません.なので,あらかじめextractbbコマンドで画像ファイルのバウンディングボックス情報を出力しておいて,それをplatex実行時に読み込むことによって解決します.しかし,必要な外部コマンドを全てをコンパイル前に実行するのはとても面倒なので,platexには外部コマンド自動で実行する機能を備えています.

 TeX LiveやW32TeXのデフォルトでは安全性を保つため,実行できるコマンドは制限されています.それぞれ許可されるコマンドが違う点に気をつけてください.詳細はここを参照してください.


Latexmk

 .texファイルをpdf化するために色々やらないといけない

  ⇛latexmkを使えば一発でpdfにできて便利

 要はlatexmkはpdf作成までに実行されるコマンド群を,まとめて実行してくれます.

 その各コマンドを実行する際のオプションを設定するために,設定ファイルを書かないといけません.

 「latexmkじゃなくてTeXShop等の統合環境を使うぞ」って人も,中の処理を理解するために,latexmkの設定を見ても損はないと思います.

 latexmkコマンドの設定ファイルはカレントディレクトリかホームディレクトリに,ファイル名を.latexmkrcとして記述します.

 よくネット上に書かれてる設定を下に書いて,それぞれ説明します


.latexmkrc

#!/usr/bin/env perl

$latex = 'platex -synctex=1 -halt-on-error';
$latex_silent = 'platex -synctex=1 -halt-on-error -interaction=batchmode';
$bibtex = 'pbibtex';
$biber = 'biber --bblencoding=utf8 -u -U --output_safechars';
$dvipdf = 'dvipdfmx %O -o %D %S';
$makeindex = 'mendex %O -o %D %S';
$max_repeat = 5;
$pdf_mode = 3;
$pvc_view_file_via_temporary = 0;
$pdf_previewer = "open -ga /Applications/Skim.app";

 ネット上で検索すればこのような設定がよく書かれているのですが,各変数の意味やオプションの意味を詳しく書いてあるところが殆どありませんでした.ある程度詳しく分かっている人なら,なんとなく意味が理解できると思うのですが,慣れていない人向けに少し詳しく書きます.


shebang

 まず1行目のshebang(シバン).ここからかよ!と思うでしょうが一応念のため..latexmkrcはperlでこのファイルを実行して各変数を読み込みます.この1行目のシバンでperlのインタプリタの実行バイナリを指定しています.インタプリタのフルパスじゃなく,/usr/bin/env perlと書くことで,環境変数PATHからヒットしたperlという名前の実行可能ファイルを指定しています.


$latex

 texファイルをコンパイルするコマンドの設定です.上の例ではplatexを設定しています.


platexのオプション


  • -synctex=1:SyncTeX を有効にします.SyncTeX対応のビューア(Skim等)ならば,ビューアからエディタにジャンプできる機能です.pdfファイルでなく,dviファイルのプレビューからジャンプしたい場合は,-src-specialsオプションを指定します.最近ではpdfまで出力してからジャンプする使い方が一般的になったために,src-specialはSyncTeXに置き換えられているようです.詳細はここを参照してください.

  • -halt-on-error :最初のエラーが出た時点で処理を止めるオプション.結果的に出力されるエラーを少なくできます.


$latex_silent

 これに関する情報が殆どありませんでした.ここを読むと恐らくlatexmk実行時の-silentオプションを使用した場合に,コンパイルするコマンドの設定のようです.silentオプションは,エラー等の出力を少なくしたいときに使用します.


platexのオプション


  • -interaction=batchmode:エラーが起きたときにユーザに入力を求めずにそのまま静かに終了します.-halt-on-errorオプションのみだと,指定ファイルが探せないときのエラーで,処理がおわらずユーザにファイル名の入力を求めることがあります.batchmodeを指定することで,エラーが起きたときにそのまま終了させることができます.他にはnonstopmodeやscrollmodeを指定することができます.詳しくはここを参照してください.


$bibtex

 参考文献を参照する際に,文献データベースから簡単に参照できる"bibtex"の実行設定です.上の例ではpbibtexを指定しています.


$biber

 biblatexのバックエンドでbiberを動かすときの設定です.biblatexはbibtexの強化版パッケージで,見た目をbibtexよりカスタマイズしやすくなっています.biblatexのバックエンドでは,bibtexやbiberが使用されます.

 biberはbibtexのコマンドツールとしての代替で,文献のソート順を変えたりもできます.


biberのオプション


  • --bblencoding=utf8:bblファイル(文献データベース)のエンコーディングをUTF-8とする

  • -u:入力ファイルのエンコーディングをUTF-8とする

  • -U:出力ファイルのエンコーディングをUTF-8とする

  • --output_safechars:ユニコード文字をLaTeXの命令を使ってエンコードした形で出力させるオプション
    biblatex+biberのソースファイル上での簡単な使い方はここ等を参照してください.


$dvipdf

 dviファイルからpdfを作成するコマンドの設定です.上の例では,dvipdfmxを指定しています.設定ファイル.latexmk上で展開できる変数で,コマンド引数を指定しています.


latexmk上で展開できる主な変数


  • %O:実行時オプション

  • %S:入力ファイル名

  • %D:出力ファイル名

  • %B:処理するファイル名の拡張子を除いた文字列


$makeindex

 索引を簡単に作成できるコマンドの設定です.上の例ではmendexを指定しています.


$max_repeat

 最大コンパイル回数を指定します.警告が出なくなるまでのコンパイル回数は発散してしまう恐れもあるので,ここで最大回数を指定します.上の例では5回にしています.


$pdf_mode

 使用するコマンドによってpdfの出力形式を合わせる設定です.


  • 0:pdf化しない場合

  • 1:pdflatexを使う場合

  • 2:ps2pdfを使う場合

  • 3:dviファイルからpdfを作成する場合

 今回使うplatexは,dviファイルからpdfを作成するので,上の例では3を指定しています.


$pvc_view_file_via_temporary

 latexmkのデフォルトでは,出力する際に,一定数の古い出力ファイルを保存して新規作成します.一定数に達すれば一番古いファイル削除してから新たに追加します.このオプションは後述する-pvcオプションをつけた際に,その出力ファイルを保存する数を設定します.

 上の例では,0を指定しており,一時ファイルが作成されず,前回の出力ファイルに上書きする形で出力されます.こうすることで,Skim上で出力されたpdfファイルの変更点を確認することができるようにしています.


$pdf_previewer

pdfファイルのビューアの設定です.上の例ではSkimを設定していますが,システムワイドでなく,ユーザ毎のインストールの場合,Skim.appの場所が~/Applications/Skim.appになるので注意してください.


latexmkでコンパイルしてみる

 ~/.latexmkrcを作成したらコマンドラインで

 $ latexmk [texファイルパス]

とすればPDF化できます.また,

 $ latexmk -pvc [texファイルパス]

と,pvcオプションをつけると,texファイルやbibファイル,styファイルなどの依存ファイルに変更がある度に,その都度コンパイルしてくれて便利です.


フォントの埋め込み

 pdfにフォントを埋め込まない場合,環境によってその表示が変わってしまったり,対応した和文フォント等が存在しないときに表示されない恐れがあります.pdfにフォントを埋め込むことにより,この問題を解決します.

 TeX Liveで日本語の埋め込みを行いたい場合,どういう設定を行えばよいか解説していきます.フォントはMac OS X上でインストールされているヒラギノフォントを利用することにします.

EL Capitan以降はこちら


権利的な話

 OS Xに付属のヒラギノフォントは,pdf文書に埋め込んで配布を行う際,EPUBなどフォント全体を埋め込まず,サブセットを埋め込むならば別契約は不要とされているようです.


texmf-local

 TeXLive2015のインストールディレクトリは通常/usr/local/texlive/2015となっています.

 2015と同じディレクトリにtexmf-localというディレクトリがあり,この中に追加する部分を構成すれば,設定が適用されます.

 このtexmf-localで設定すると,TeXLive標準でインストールされてあるtlmgrでアップデートかけた際に変更されないので,改めて設定をし直さなくても良い利点があります.

 よってここにフォントを設置していきます.


フォントマップ

 TeXは,文字コードとフォントファイルの結びつけをmapファイル(フォントマップ)で行っています.TeX Liveでは,ヒラギノ用のmapファイル(otf-hiragino.map)が既に存在するので,これを利用します.


otf-hiragino.mapの一部

% TEXT, 90JIS

hminl-h H HiraMinPro-W2.otf
hminl-v V HiraMinPro-W2.otf
hminr-h H HiraMinPro-W3.otf
hminr-v V HiraMinPro-W3.otf
hminb-h H HiraMinPro-W6.otf
hminb-v V HiraMinPro-W6.otf
hgothr-h H HiraKakuPro-W3.otf
hgothr-v V HiraKakuPro-W3.otf
hgothb-h H HiraKakuPro-W6.otf
hgothb-v V HiraKakuPro-W6.otf
hgotheb-h H HiraKakuStd-W8.otf
hgotheb-v V HiraKakuStd-W8.otf
hmgothr-h H HiraMaruPro-W4.otf
hmgothr-v V HiraMaruPro-W4.otf

 このmapファイルに合わせたフォントファイル名でリンクを貼り,このmapファイルを埋め込みの和文フォントのデフォルトセットとすることで,ヒラギノフォントを埋め込むことができます.

 ちなみにTeXLiveに標準でmapファイルが用意されている他のフォントは,IPAexフォント,小塚フォント,モリサワフォントなどがあります.


フォントの設置

 /usr/local/texlive/texmf-local/fonts/opentype/public/hiragino/というディレクトリを作成し,このディレクトリ内にmapファイルに記載されているファイル名でヒラギノフォントのリンクを貼ります.

$ sudo mkdir -p /usr/local/texlive/texmf-local/fonts/opentype/public/hiragino/

$ cd /usr/local/texlive/texmf-local/fonts/opentype/public/hiragino/
$ sudo ln -fs "/Library/Fonts/ヒラギノ明朝 Pro W3.otf" ./HiraMinPro-W3.otf
$ sudo ln -fs "/Library/Fonts/ヒラギノ明朝 Pro W6.otf" ./HiraMinPro-W6.otf
$ sudo ln -fs "/Library/Fonts/ヒラギノ丸ゴ Pro W4.otf" ./HiraMaruPro-W4.otf
$ sudo ln -fs "/Library/Fonts/ヒラギノ角ゴ Pro W3.otf" ./HiraKakuPro-W3.otf
$ sudo ln -fs "/Library/Fonts/ヒラギノ角ゴ Pro W6.otf" ./HiraKakuPro-W6.otf
$ sudo ln -fs "/Library/Fonts/ヒラギノ角ゴ Std W8.otf" ./HiraKakuStd-W8.otf

 これでmapファイルの指定通りにフォントの設置ができました.


ls-Rデータベースの反映

 先の手順でフォントを設置しましたが,このままではTeXはこれらフォントファイルを認識してくれません.

 TeXLiveはデフォルトで,ls-Rという名前のディレクトリインデックスを使用しています.このファイルにより,TeXが認識するファイルを記憶します.なので,先ほど設置したフォントのリンクを認識させるために,ls-Rを更新させます.TeX Liveはmktexlsrというコマンドにより,ls-Rを自動で更新することができます.

 $ sudo mktexlsr


デフォルトセットのフォントマップを指定する設定

 otf-hiragino.mapファイルをTeX上で使用するソフトに設定します.しかし,フォントを扱うソフトは,DVIファイルを処理するソフトだけでも,dvips,dvipdfmx,xdvi,pdftexなど,多くの種類があります.これらソフト毎にいちいち設定していくのは大変面倒です.

 TeXにはupdmap(システムワイドの場合updmap-sys)という,フォントを使用する設定を統一的に管理できるユーティリティが存在します.これによってTeX全体の設定を変更します.和文フォントの場合,udpmapのkanjiEmbedオプションを使うと設定が行えます.


kanji-config-updmap

 前述のudpmapのkanjiEmbedオプションでの設定ですが,TeX Liveではkanji-config-updmapというupdmapのラッパーであるperlスクリプトがあります.これを使うことで,設定のミスを防ぎつつデフォルトのフォント設定を行うことができます.

 kanji-config-updmapは"otf-"から始まる名前のフォントマップを読み込むことができます.今回設定したいマップファイルは"otf-hiragino.map"なので,拡張子を除き,

 $ kanji-config-updmap hiragino

とすれば,和文の埋め込み用フォントをhiraginoに設定することができます.

和文フォントを埋め込まないようにするには,

 $ kanji-config-updmap noEmbed

とすればOKです.

システムワイドに設定したい場合はkanji-config-updmap-sysを使います.

これでフォントの埋め込みの設定は完了です.


El Capitanでのフォント埋め込みの設定について

! Sierra + MacTeX-2016 でも以下と同じ操作で可能なことを確認しました

El Capitanになってヒラギノフォントの形式とファイルのパスが変更されました.ヒラギノはOpenTypeからOpenTypeCollectionになり,拡張子は.otfから.ttcになりました.なので以前の設定(mapファイルやフォントのリンク設置)では上手くできません.El Capitanでのフォント埋め込みの設定を以下に記述します.


フォントマップ

Tex Liveの最新版には新しいヒラギノに対応したフォントマップが作成されています.このフォントマップを利用するためには,最新のTex Liveをインストールするか,最新にアップデートする必要があります.アップデートするにはTex Liveのパッケージ管理ソフトtlmgrを使用します.

 $ sudo tlmgr update --self --all

ここで

Unknown directive ...containerchecksum c5920x........ , please fix it! at 

/usr/local/texlive/2016/tlpkg/TeXLive/TLPOBJ.pm line 210, <$retfh> line 5579.

等のエラーが出てくる場合,tlmgr自体が古い可能性があります.tlmgrを最新にするためには,tlmgr - TeX Live - TeX Users Group等からupdate-tlmgr-latest.shをダウンロードし,実行します.

 $ sudo sh update-tlmgr-latest.sh


フォントのリンク設置

新しいフォントマップが導入されたので,それに合わせてフォントのシンボリックリンクを張っていく作業をしなければいけないのですが,実は最新のTex Liveでは,リンクを張る作業を自動でやってくれるcjk-gs-integrateスクリプトが導入されています.手動でやるより確実なのでこちらを使うことにします.

$ cd /usr/local/texlive/[任意のバージョン]/texmf-dist/scripts/cjk-gs-integrate

$ sudo perl cjk-gs-integrate.pl --link-texmf --force
$ sudo mktexlsr


使用するフォントマップの設定

以前では$ kanji-config-updmap hiraginoでupdmapでのヒラギノの指定が出来ました.El Capitanになって形式が変わったヒラギノフォントでは,新しく用意されたhiragino-elcapitan-pronを設定します.

 $ sudo kanji-config-updmap-sys hiragino-elcapitan-pron

以上でEl Capitanでのフォント埋め込みの設定が完了しました.


El Capitanのフォントについての詳しい話

El CapitanでTexのフォント埋め込みする設定について参考にしたページです.

TeX界の El Capitan 迎撃戦記 - TeX Alchemist Online

TeX Live/Mac - TeX Wiki


おわりに

latexmkのPDF化までの一連の処理の流れを理解することで,大まかなTeXの仕組みが分かると思います.OSやTeXのアップデートをかけた後に,「あれ?上手くコンパイルできないな...」ってなったとしても,ある程度原因が分かるようになるかなって思います.


参考にしたページ

TeX Wiki - 外部コマンドの実行

TeX Wiki - SyncTeX

TeX Wiki - dvipdfmx

latexmk.txt

konn-san.com 建設予定地 - latexmk で楽々 TeX タイプセットの薦め(& biblatex+biberで先進的な参考文献処理)

情報科学 B (藤原)2015 年度版 - 「タイプセット」ボタンを押した時,何が行われているか.

Qiita - TeX処理系御伽話

Qiita - LaTeXの相互参照はいつでも解決(収束)するのか?

雑記帳 - TeX処理系の気に食わない点(0) — エラー時の挙動

むしゃくしゃしてやった,今は反省している日記 - BibLaTeXの使い方まとめ

TeX Live を使おう──Linux ユーザと Mac OS X ユーザのために── - 日本語フォントのセットアップ

マクロツイーター - updmap-setup-kanji のアレな話

TeX界の El Capitan 迎撃戦記 - TeX Alchemist Online

TeX Live/Mac - TeX Wiki