Skip to content

Instantly share code, notes, and snippets.

@h20y6m
Last active December 30, 2021 07:04
Show Gist options
  • Save h20y6m/c9b65053c9e694fc5b03c4a72653c18e to your computer and use it in GitHub Desktop.
Save h20y6m/c9b65053c9e694fc5b03c4a72653c18e to your computer and use it in GitHub Desktop.
(u)pLaTeXでPDF出力?

(u)pLaTeXでPDF出力?

これは「TeX & LaTeX Advent Calendar 2021」の4日目の記事です。 (3日目は CareleSmith9 さん、5日目は doraTeX さんです。)

この記事はカレンダーが埋まらなさそうなとき用に用意したくだらないネタです。

まだまだ空きがあるので皆さん登録しましょう!!

はじめに

少し古い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を呼び出してしまえばよいのです。つまり、

  • DVIファイルの出力が完了したあと自動的にdvipdfmxを呼び出してPDFファイルに変換する
  • プリミティブを追加しdvipdfmxが呼び出されることをTeXコードから判定できるようにする

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

やってみた

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

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に移行しましょう!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment