マクロツイーター

はてダから移行した記事の表示が崩れてますが、そのうちに直せればいいのに(えっ)

TikZ を dviout に対応させる話(ただし画期的)

夏、真っ盛りですね! 夏の日差しを浴び………………(中略)……ゆきだるま☃!

ゆきだるま☃のスゴイ問題解決パワー

さて、本ブログでは以前から、☃のもつ強力な「問題解決能力」に注目してきた。ご存知の通り、TeX は激アレである。このため、LaTeX 上の開発においては、時に「本質的に解決困難な問題」にぶち当たってしまうことがある。こういう時に「出力を☃に変える」という画期的な方策を取ることで、たちどころに解決してしまう、という話である。具体的には、今まで次のような事例を紹介している。

そういうわけで、今年の「ゆきだるま☃の日*1」のネタとして、日本語の LaTeX 界隈において長く未解決のまま残されている問題に手を付けることにする。その問題とは

TikZ(およひ PGF)パッケージの dviout 対応

である。

dviout で TikZ するとアレ

例えば、TikZ で頑張って「三角形の外心」の図を描いたとする。

[triangle1.tex]
% pLaTeX文書
\documentclass[dviout,a4paper]{jsarticle}% dvioutしたいが…
\usepackage{tikz}
\usetikzlibrary{calc}
\colorlet{myblue}{blue!80!black}
\begin{document}

\begin{center}
\begin{tikzpicture}[x=5mm,y=5mm]
  \coordinate (A) at (4,4);
  \coordinate (B) at (0,0);
  \coordinate (C) at (6,0);
  \coordinate (O) at (3,1);
  \draw[myblue!80] (O)--($(A)!.5!(B)$);
  \draw[myblue!80] (O)--($(B)!.5!(C)$);
  \draw[myblue!80] (O)--($(C)!.5!(A)$);
  \draw[myblue!80,overlay] (O) circle[radius=3.16228];
  \fill[myblue] (O) circle[radius=2pt] node[left=2pt] {O};
  \draw[thick] (A)--(B)--(C)--cycle;
  \fill (A) circle[radius=2pt] node[above=2pt] {A};
  \fill (B) circle[radius=2pt] node[left =2pt] {B};
  \fill (C) circle[radius=2pt] node[right=2pt] {C};
\end{tikzpicture}
\end{center}

\end{document}

これは本来は次のような小奇麗な図を出力するはずである。(これは dvipdfmx で*2出力したものである。)

しかし周知の通り、TikZ は dviout に対応していない。そのため、前傾の文書をコンパイルした結果の triangle1.dvi を dviout で開くと、まず次のような不吉なエラーダイアログが出現する。

ここで[無視]を選ぶと、文書の版面が表示されるが、肝心の図は何だか訳のわからないゴミのようなものに化けてしまっている。無残である。

dviout の未対応は本質的な問題

PGF/TIkZ の dviout 対応が一向に進まない最大の原因は「誰もソレをやろうとしないから」であることは間違いない。しかし、実際に PGF の dviout 用のドライバの開発を本気で考え始めると、解決すべき様々な問題が待ち構えていることにすぐに気づくであろう。というのも…………………(省略☃)。

しかし、この数々の困難な問題も、ひとたび☃のパワーを借りればたちまち解決してしまう。賢明な読者の皆さんには、もう答えはお判りであろう。

TikZ の出力を☃に変えればよい!

単純明快である。

scdviout-pgf パッケージ

というわけで、さっそく作ってみた。

使い方はとても簡単で、tikz(あるいは pgf)パッケージを読み込む前に、dviout のドライバオプションを付けて scdviout-pgf パッケージを読み込む。(例によって、ドライバオプションはグローバルに指定してもよい。)

\usepackage[dviout]{scdviout-pgf}% これを書くだけ!
\usepackage{tikz}

これにより、PGF/TikZ のドライバとして同梱の pgfsys-scdviout.def が指定される。これは dviout 用に実装された(画期的な)ドライバであるため、PGF/TikZ の図が出力されるようになる。

dviout で TikZ できて、しかも素敵!

それでは早速使ってみよう。先ほどの triangle1.tex について、tikz の前に scdviout-pgf を読み込むように変更する。

% pLaTeX文書
\documentclass[dviout,a4paper]{jsarticle}% dvioutしたい!
\usepackage{scdviout-pgf}% これでTikZできる!
\usepackage{tikz}
%……あとはそのまま

なんとこれだけで、さっきは無残に失敗していた dviout での図の表示が、今度は何事もなく完了する。素晴らしい!

もっと dviout で TikZ してみる

もう少し頑張って、複数の図を含む文書を作ってみる(文書ソース triangle2.tex)。

もし、scdviout-pgf を読まない状態で dviout で見てみると……これはひどい

ところが、scdviout-pgf を読み込んだ状態だと……とっても素敵!

おめでとうございます!

まとめ

ゆきだるま☃のパワー、恐るべし!

*1:もう既にお馴染みであろうが、念のため補足しておく。毎年 8 月 8 日が「ゆきだるま☃の日」である。

*2:もちろんドライバ指定を dvipdfmx にして。