自分がどのLaTeXを使ってるか知りたい話

:::note

これは「[TeX ＆ LaTeX Advent Caleandar 2018](https://adventar.org/calendars/3382)」の1日目の記事です。
（2日目は [puripuri2100さん](https://puripuri2100.hatenablog.com/entry/2018/12/02/091222) です。）

:::

今年も相変わらず「TeX & LaTeX Advent Calendar」が始まりました。今年の重点テーマは「**とにかくLua(La)TeXしよう**」です。LuaLaTeXに関する情報がたくさん集まることに期待しましょう。

というわけで、LuaLaTeXにイマイチ関係してないネタ話を一つ<sub>（ええっ）</sub>

## 人生いろいろ、“LaTeX”もいろいろ

LuaLaTeXは新しい[^new]LaTeXエンジンですが、LaTeXにある程度関心のある人なら&#x200b;**「最近は“LaTeXの種類”がやたらと増えている」**&#x200b;ということはご存知でしょう。日本において（一定以上）使われているものに限っても、“LaTeXの種類”はこれだけあります。

  * pLaTeX ←15年ほど前はコレしかなかった[^lie]
  * upLaTeX
  * pdfLaTeX
  * XeLaTeX
  * LuaLaTeX

このうち、後の3つは「PDFファイルを直接出力する[^xelatex]」タイプのエンジン[^engine]です。対して、前の2つ（pLaTeXとupLaTeX）は「（TeXの本来の出力形式である）DVIファイルを出力する」タイプのエンジンです。最近ではエンジンの種類に関わらずPDFファイルを成果物とすることが普通ですが、この&#x200b;**「DVIからPDFへの変換」**&#x200b;について、現状では「dvipsを使う[^dvips]」「dvipdfmxを使う」という2種類の方式が並存しています。従って、「“LaTeX”を使ってPDFファイルを得る」というワークフローについては、次の**7つの方式**があることになります。

 1. pLaTeX＋dvips ←15年ほど前はコレが圧倒的多数だった
 2. pLaTeX＋dvipdfmx
 3. upLaTeX＋dvips
 4. upLaTeX＋dvipdfmx
 5. pdfLaTeX
 6. XeLaTeX
 7. LuaLaTeX

[^lie]: 嘘です。欧文文書を作る場合には欧文LaTeX（`latex`で起動するやつ）が使われていました。
[^new]: 実用的に使えるようになったのが大体2、3年前のことです。バージョン1.0が2016年9月にリリースされました。
[^xelatex]: XeLaTeXは実は云々……という話はここでは措いておきましょう。
[^engine]: 慣習的に、LaTeXの処理系のことを**エンジン**(engine)と呼びます。
[^dvips]: dvipsはDVIファイルをPostScriptファイルに変換するソフトウェアです。PDFファイルを作りたい場合は別のソフトウェア（Acrobat DistillerやGhostscript）を使ってPostScriptをPDFに変換することになります。

## 7つのLaTeX、7つの世界

「LaTeXの環境の違い」については、ワークフローの違いの外にも様々な観点があります。例えば、OSの違い（WindowsかMacか）、ディストリビューションの違い（TeX LiveかW32TeXか）、バージョンの違い（TeX Liveが2017か2018か）などです。しかし、これらと異なり[^other-diff]、ワークフローの違いというのは大きな影響をもっています。それは「**異なるワークフローの間にはLaTeX文書コードの書き方の互換性はそもそも存在しない、従って、ワークフローが異なると文書コードの書き方も異なる**」ということです。

[^other-diff]: OSやディストリビューションの違いについては、「LaTeXの文書の書き方」には可能な限り影響を与えないように努力が払われるのが普通であり、実際に書き方に違いが出ることは滅多にありません。（Windows特有のフォントを用いた文書はMacではコンパイルできない可能性はあるが、それは「資源が足りない」のであって「書き方が間違いである」わけではない。）なお、「文書コードの書き方」以外の事項、例えば環境設定の手順などについてはOSやディストリビューションによって大きく異なることがあります。

例えば、TikZを利用した**pLaTeX＋dvipdfmx向け**の文書のソースの冒頭が次のようにだったとしましょう。

```latex
% pLaTeX＋dvipdfmx用
\documentclass[dvipdfmx,a4paper,9pt]{jsarticle}
\usepackage{tikz}
%……(以下略)
```

この文書は**LuaLaTeXでは通用しません**。jsarticle文書クラスはLuaLaTeXには非対応であり、また、PDF直接出力のエンジンなのに`dvipdfmx`のドライバオプションを指定しているのは不合理だからです。代わりに次のようにする必要があるでしょう。

```latex
% LuaLaTeX用
\documentclass[a4paper,9pt]{ltjsarticle}
\usepackage{tikz}
%……(以下略)
```

他にも&#x200b;**「ワークフローによって使えるか否かが違う」**&#x200b;という例はいくらでもあります。

  * powerdotクラスはdvipsでのみ使用できる。
  * dvipsでは外部画像ファイルはEPS形式しか使えない。
  * 和文のOpenType-CFFフォントはpdfLaTeXでは使えない。

ある意味、それぞれのLaTeXのワークフローは、それ**独自の“世界”**&#x200b;を作っているといえるでしょう。ユーザは”自分のLaTeX”のための文書コードを書く必要があるのです。

## あなたのLaTeXはどこですか？

このような現状を生き抜くためにLaTeXユーザが絶対に知っておくべき事項があります。それは&#x200b;**「自分がどの“LaTeX”を使っているのか」**&#x200b;というこです。「ソレを知らないなんてアリエナイ」と思う人もいるでしょうが、実際にネットを見回すと、「ソレを知らない」せいで「“自分のLaTeX”のための文書コードが書けずに何もできない」という事例に出会うことは珍しくありません。

「ソレを知らない」の最も厄介な点は、「他人がソレを教えてあげられない」ということでしょう。LaTeXの解説記事を書く人も、「読者がdvipdfmxを使っているか否か」を教えることはできないので、「dvipdfmxを使っている場合は、～～～」と書くしかありません。もしその文章を読んでいる当の本人が「dvipdfmxを使っているかどうか判らないので先に進めない」となると、もう誰がどうすることもできません。

つまり、「自分がどの“LaTeX”を使っているのか知らない、知る術も判らない」状態に陥ってしまうと、**完全に詰んでしまう**わけです。

（以上、長い長い前フリおわり）

## ハロー、マイLaTeX！

……というわけで、そういう詰み状態の人の助けとなるような、チョットした「テスト文書」を作ってみました。

  * [hello.tex](https://gist.github.com/zr-tex8r/27bc6ddf376d4f716e7276c7dad5ec75) （Gist/zr-tex8r）

いつも通りのワークフローを使って、この`hello.tex`を**PDFファイルに**変換してみましょう。（中を覗くと怖ろしげ:scream:なTeX言語がいっぱい書いてありますが見なかったことにしましょう:upside_down:）結果のPDFファイルの中を見ると、そこに&#x200b;**「答え」が書いてあります！**

>   Hello, (ワークフローの名前)!

:::note warn

hello.texから作られたDVIファイルをDVIビューア（dvioutやxdvi）で開いた場合の動作は**未定義**です。

:::

実際の変換結果の例を挙げておきます。

(pLaTeX＋dvipsの場合)
![hello-1.png](https://qiita-image-store.s3.amazonaws.com/0/14550/5520c806-6888-0695-902b-f20d8f21227f.png)

(LuaLaTeXの場合)
![hello-2.png](https://qiita-image-store.s3.amazonaws.com/0/14550/b241dbd9-c31a-02ef-eb3d-1948de681eaa.png)

(upLaTeX＋dvipdfmxの場合)
![hello-3.png](https://qiita-image-store.s3.amazonaws.com/0/14550/829cc109-7acb-0968-98e0-5b5b573e6d21.png)

## まとめ

自分が何を使っているかを知って、圧倒的成長:muscle:<small>（まとめろ）</small>