h20y6m.github.io

2021年12月04日

(u)pLaTeXでPDF出力?

これは「TeX & LaTeX Advent Calendar 2021」の4日目の記事として投稿した『(u)pLaTeXでPDF出力? · GitHub』の転載です。

はじめに

少し古いpLaTeXの入門記事には以下のようなコードが書かれていることも多いと思います。

\documentclass{jarticle}

しかし、最近のpLaTeX + dvipdfmx(またはptex2pdf)でPDFを作成している場合、このコードは間違っています。

このファイルを最近のpLaTeXでタイプセットすると以下のような行がログに出力されていると思います。

(c:/texlive/2021/texmf-dist/tex/latex/l3backend/l3backend-dvips.def)))

このl3backend-dvips.defは名前の通りdvipsバックエンド用のファイルです。つまり上記のようなファイルを最近の(u)pLaTeXでタイプセットするとdvips専用のDVIファイルが出来上がります。当然このDVIファイルをdvipdfmxで処理した結果は期待通りの出力になるとは限りません。

(u)pLaTeX + dvipdfmxでPDFを作成する場合は以下のように\documentclassのオプションに必ずdvipdfmxを指定する必要があります。

\documentclass[dvipdfmx]{jarticle}

そうすれば以下のように正しくdvipdfmxバックエンド用のファイルl3backend-dvipdfmx.defが読み込まれます。

(c:/texlive/2021/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def

しかし、初心者ユーザーがこの「おまじない」を入れ忘れてしまったり、LuaLaTeXのようなPDF出力エンジンを使用しているのに「おまじない」を入れてしまたりしてトラブルを引き起こすのは想像に難くないでしょう。この「おまじない」をしなくてすむ方法はないものでしょうか。

残念ながらTeXエンジンからは出力したDVIファイルがその後どのようなDVIウェアで処理されるかを知るすべはありません。TeXエンジンに未来を見る力はないのです。

しかし、もしTeXエンジンが出力したDVIファイルがdvipdfmxで処理されることが分かっていれば自動的に適切なバックエンドが読み込まれるようにできるはずです。というかいっそのことTeXエンジンがdvipdfmxを呼び出してしまえばよいのです。つまり、

のような改造を施せばよいわけです。

やってみた

というわけで、やってみました。

TeXエンジン終了時のDVIファイルをクローズ後に自動的にdvipdfmxが起動されPDFファイルが出力されます。

>dir /b
test.tex

>type test.tex
\typeout{\string\dvipdfmx=\the\dvipdfmx}
\documentclass[dvipdfmx]{jarticle}
\usepackage{bxjalipsum}
\begin{document}
\jalipsum{wagahai}
\end{document}

>platex-dvipdfmx test
This is e-pTeX, Version 3.141592653-p3.10.0-210701-2.6 (utf8.sjis) (TeX Live 2022/dev) (preloaded format=platex-dvipdfmx)
 restricted \write18 enabled.
entering extended mode
(./test.tex
pLaTeX2e <2021-06-01>+2 (based on LaTeX2e <2021-11-15>)
L3 programming layer <2021-11-12>
\dvipdfmx=1
(c:/texlive/2021/texmf-dist/tex/platex/base/jarticle.cls
Document Class: jarticle 2020/09/30 v1.8f Standard pLaTeX class
(c:/texlive/2021/texmf-dist/tex/platex/base/jsize10.clo))
(c:/texlive/2021/texmf-dist/tex/latex/bxjalipsum/bxjalipsum.sty)
(c:/texlive/2021/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def
(|extractbb --version)) (./test.aux) [1] [2] [3] [4] [5] [6] [7] [8] [9]
(./test.aux) )
Output written on test.dvi (9 pages, 51952 bytes).
run dvipdfmx... test.dvi -> test.pdf
[1][2][3][4][5][6][7][8][9]
285695 bytes written
success.
Transcript written on test.log.

>dir /b
test.aux
test.dvi
test.log
test.pdf
test.tex

【追記】バイナリは2日目に作った独自リポジトリにこっそり入れておきます。

おわりに

こんなくだらないことを考えていないでLuaLaTeX + LuaTeX-jaに移行しましょう!