dvioutでupLaTeXのDVIを扱う話

先日Qiitaに投稿した「[［改訂新版］upLaTeXを使おう]」の記事の補足として、「**upLaTeX文書のDVIをdvioutで扱う方法**」について解説します[^now]。

[^now]: 元々の「upLaTeXを使おう」の記事には「dvioutについて」という内容があったのですが、「今更dvioutの話はそれほど需要がないだろう」ということで一旦削除していました。
[［改訂新版］upLaTeXを使おう]: http://qiita.com/zr_tex8r/items/5c14042078b20edbfb07

## 前提

  * W32TeX、あるいはWindows上のTeX Live2014以降。
  * dvioutの「3.18.4 ALPHA 1」版（2013年12月）以降。
  * ユーザはdvioutの扱いに慣れている[^novice]。

[^novice]: さすがに、今時「dvioutに慣れていないdvioutユーザ」なんていないよね……。

※<font color="#007700">上級者向け注意：</font> dvioutでは「VFを用いずにTFMだけで和文フォントを運用する」ことができますが、ここでは他のDVIウェアと同様に「VFを用いる運用」を前提にします。

## 設定

dvioutの設定画面に関する注意：

  * dvioutの設定画面は「Options→Setup Parameters…」で開きます。
  * 原則として、何か設定値を変更した場合は［適用］と［Save］を押す必要があります。

### 手順①：フォントバッファサイズを増やす

upTeX用の論理フォントファイルはpTeX用のものに比べてサイズが大きいため、dvioutのフォントバッファのサイズ（既定は400KB）を予め増やしておく必要があります。

  * 設定画面の[System]タブを開きます。
  * font buffer sizeの値（`bf:`）を「4000」以上に増やします。

### 手順②：TrueTypeフォントマップファイルを有効化する

upTeXの論理フォントを扱うためにはTrueTypeフォントマップファイルを利用する必要があります[^ttfont]。

  * 設定画面の[Font2]タブを開きます。
  * `ftt:`の値が空の場合は、`^x\map\ttfonts.map`を入力します。
      * 「`ftt:`のボタンを押す→［はい］」でこの値が入ります。
  * `ftt:`に既に`^x\map\ttfonts.map`が入っている場合は何もしません。

※`ftt:`に既に`^x\map\ttfonts.map`**以外**の値が入っている場合はこの記事では扱いません。

[^ttfont]: dvioutではフォントマップの設定を設定画面上で行えますが、そこで扱える和文論理フォントはJISコードのものに限られ、Unicodeのものは扱えません。

### 手順③：カスタムフォントマップファイルを編集する

カスタムフォントマップファイル（`$user.map`）にupTeXの和文論理フォントのための項目を追加します。

  * dvioutが実行中であれば、一旦終了します。
  * カスタムフォントマップファイルの場所を特定します。
      * TeX Liveを `C:\texlive\20XX` にインストールした場合は次の場所になります。

            C:\texlive\20XX\tlpkg\dviout\map\$user.map

      * dvioutを自分でインストールした場合は次の場所になります。

            (dvioutのディレクトリ)\map\$user.map

  * カスタムフォントマップファイルに以下の内容を追記します[^font]。
    ※文字コードはシフトJISにします。

    ```
    uprml-h  "ＭＳ 明朝"      unicode
    uprml-hq "ＭＳ 明朝"      unicode
    uprml-v  "@ＭＳ 明朝"     unicode
    upgbm-h  "ＭＳ ゴシック"  unicode
    upgbm-hq "ＭＳ ゴシック"  unicode
    upgbm-v  "@ＭＳ ゴシック" unicode
    ```

[^font]: フォント名については、**Windowsにインストールされた**フォントであれば他のものでも使用できます。uprml-vとupbgm-v（縦組用の論理フォント）については、フォント名の前に`@`を付けます。実は、Windowsにインストールされたもの以外のフォントも利用する機能もあるのですが、それはこの記事では扱いません。

※仮に、TeX Liveで自動更新（`tlmgr update`）を行った場合にdvioutが更新された場合でも、カスタムフォントマップファイルは上書きされないはずです。

#### TeX Liveで将来の版にカスタムフォントマップの内容を引き継ぎたい場合

TeX Liveでは毎年1度新しい版がリリースされます。新しい版は古い版と別にインストールするものなので、dvioutのための設定もその度に繰り返す必要があります。それでも、カスタムの詳細な設定内容を記したファイルであるカスタムフォントマップファイルについては、TeX Liveの異なる版の間で共通に参照できるようにした方が都合がよいでしょう。その場合は以下の手順に従います。

 1. 本来のカスタムフォントマップファイル（`$user.map`）には以下の行**だけ**を書いておきます[^path]。

    ```
    %input  ..\..\..\..\texmf-local\fonts\map\dviout\user.map
    ```

 2. 本来のものの代わりに、

        C:\texlive\texmf-local\fonts\map\dviout\user.map

    をカスタムフォントマップファイルとして使用します。

これを行うと、将来の版のTeX Liveをインストールした場合も、手順①と②および上記手順の1を行うだけで、既存のカスタムフォントマップファイルを引き継ぐことができます。

[^path]: `%input`の引数を絶対パスで書くと期待通りに動作しないので相対パスを書きました。ただ、これも正式にはサポートされていないのかも知れません。

## 動作確認

LaTeX文書の作成については、通常の「upLaTeX文書の作成」と「dviout用の文書の作成」の注意点に留意していれば大丈夫です。

```latex:sample1.tex
% upLaTeX文書, UTF-8
\documentclass[uplatex,a4paper]{jsarticle}
\begin{document}

% 遠慮なくUnicodeしよう!!
㊷森鷗外と内田百閒が髙島屋で☃を作った。

\end{document}
```

```text:コンパイル方法
uplatex sample1
```

生成されたsample1.dviをdvioutで開くと、以下のような正常な出力が得られるはずです。

![sample1.png](https://qiita-image-store.s3.amazonaws.com/0/14550/54a8a5fd-5ae6-5f8c-275e-7e223177dd40.png)

## 注意点

  * upLaTeX文書が（精確にはDVI文書が）BMP外（符号値がU+10000以上）の文字を含む場合、DVIファイルの読込自体は正常に行われる[^parse]ようですが、当該の文字の表示は化けてしまいます。

    ```latex:sample2.tex
    \documentclass[uplatex,dviout,a4paper,ja=standard]{bxjsarticle}
    \begin{document}

    “𠮷野家的”な髙島屋。

    \end{document}
    ```

    ![sample2.png](https://qiita-image-store.s3.amazonaws.com/0/14550/b99a0945-e0bc-0a34-bb07-9589160e3354.png)

[^parse]: つまり、dvioutのDVI解釈器は`set3`命令に対応しています。