TikZ の external library を dvipdfmx で使う

これまで blog 記事を書くときは、大体 pLaTeX で元の文書を書き、それを大体そのまま MathJaX を有効にした blog に転用してきた。問題なのは図だが、多くの場合は TikZ で図を描き、blog 用には結構面倒な手順で図を 1 個ずつ画像ファイルに変換していた。図の数がひとつやふたつくらいなら別に問題ないのだが、この記事みたいに図が多いとかなり面倒なことになっていたので、できれば(半)自動化が望ましい。以前ちょっと調べたときは external library というのがその解決法になりそうに見えたので試してみたのだが、その時はエラーが出てどう直したらいいかわからなかったのでそのまま放置していた。

この度、再度詳しく調べ直してみたところ、dvipdfmx を使って pdf 化している時には external はデフォルトではうまく行かないようになっていることと、どうすればそれを乗り越えられるかがわかった。この情報はどうも web で検索しても見当たらなかったので、同じことで引っかかる方の参考になればと思って公開しておく。

  1. まず LaTeX 文書側で必要な準備は、preamble で tikz を読み込んだ後で
    \usetikzlibrary{external}
    \tikzexternalize[system call={platex \tikzexternalcheckshellescape
    -halt-on-error -interaction=batchmode -jobname "\image" "\texsource"
    && dvipdfmx "\image"}]
    

    としておくということ。上の例では platex を使ったが、必要に応じて uplatex に適宜変更のこと。jlatex や、素の latex (pdflatex ではなく)でも行けるのかもしれないがそこまでは確かめていない。

    なお、pLaTeX で図中で label 等に日本語を使っている場合は、

    \usetikzlibrary{external}
    \tikzexternalize[system call={platex -kanji=euc \tikzexternalcheckshellescape
    -halt-on-error -interaction=batchmode -jobname "\image" "\texsource"
    && dvipdfmx "\image"}]
    

    のように -kanji オプションで日本語コードを指定しないと、図中の日本語が文字化けする可能性がある。そういう場合はそもそも元々の platex コマンドの呼び出し時に -kanji オプションを与えているはずなので、それと同じ文字コードを指定する(euc/sjis/utf8/jis の 4 つのうちどれか)。…と考えると、いつまでも pLaTeX にしがみついていないでさっさと upLaTeX や LuaLaTeX-ja に移行すべきなのかもしれない(笑)。

  2. また、初回の platex 等のコマンド起動時に -shell-escape オプションを与えて、platex -shell-escape aaa.tex のように実行すること。2回目以降では -shell-escape は不要。

こうすると、初回の platex 等のコマンドの実行時に tikzpicture 環境の部分だけを図として切り出した pdf ファイルが、元ファイルに連番を付加したファイル名で生成される(はず)。2度目以降の platex 実行時には、そうやって作られた図の pdf が include されるので、タイプセット時間が短縮される。

【2020/12/25 追記】platex では、図版の pdf の生成はできたものの、それの include はうまく行っていませんでした(この記事を書いた当時は動いていたのかもしれないですが(はっきりしなくてすみません)、現状はダメでした)。include まで成功させるには、さらに

\pgfkeys{/pgf/images/include external/.code={\includegraphics{#1}}}

という記述を preamble に追加する必要もありました。

また、作られた図の pdf を加工して、必要に応じて png 等に変換することもできるだろう。図の部分のソースを変更した場合は、図の pdf ファイルの作り直しのために再度 -shell-escape オプションを与える必要がある。

注意点をいくつか。

  1. 図の中に LaTeX の label-ref による相互参照が入っている場合、正しく働くかどうかは確かめていない。TikZ のマニュアルを見ると何やらそれ用の対処が入っているようなので、ちゃんと動いてくれることは期待できそう。
  2. ファイル名・ディレクトリ名(フォルダ名)に日本語(非 ASCII 文字)を使っていると、うまく行かない可能性がかなり高いと思う。おとなしく全部 ASCII 文字を使うようにしよう。PC 上のユーザー名が日本語で、ドキュメント保管場所にどうしても日本語文字が入ってしまう…という場合、サブディレクトリ(サブフォルダ)とファイル名に日本語を使わず、platex 等のコマンドに相対パスだけが与えられるようにして ASCII 文字だけからなるパス名が渡るようになっていればほぼ安全だろう(※ もっとも、TEXINPUTS 環境変数等に日本語のディレクトリ名が入っているとまずそう…)。

あ、Mathpower 2017 の数学の決闘・決勝問題第1問は、職場の方が見事な解を提示して下さり、個人的には解決ずみの話となりました。ニコ生のタイムシフト再生で観た同時進行の解説では「階乗」の性質がなぜ成り立つのかわからなくて考察対象から外したままそれっきりだったんですが、べき等の性質をすごくうまく使うと行けるんですね…!脱帽するしかありませんでした。

そして何と、その方はこの問題では交換法則はあまり重要ではなく、交換法則なしでも \(0*1\) の値は \(0\) か \(1\) しかありえないことが示せる、ということまで含めて示してくださっていました。これはびっくりですね…。交換法則を要求しない場合、演算 \(a*b\) は max, min 以外に「左の要素(つまり \(a\))を返す」または「右の要素(\(b\))を返す」という演算も解になる、という結果になっていました。これらが、交換則以外の与えられた条件をすべてみたす十分条件になっていることは容易にわかりますが、なんと必要性まで言えてしまう、というのはすごいですね。


投稿日

カテゴリー:

,

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください