マクロツイーター

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

graphicx パッケージの“ドライバ関連”のトラブルを一気に消し去る話(tcgraphicss パッケージ)

夏、真っ盛りですね! で、夏といえば、ゆきだるま☃!

“本質的に難しい”graphicx の話

既に本ブログで何度も取り上げている話題であるが、「画像の挿入」は LaTeX の学習における“有名な難所”の一つとなっている。

特に現在は、「graphicx パッケージを用いて画像を挿入する」という機能は、LaTeX の学習を始めて間もない初心者でも利用する“ごく当たり前の機能”と認識されている。しかしこの graphicx というパッケージは、初心者が扱う障害となる、“本質的な難しさ”を抱えている。

graphicx パッケージの何が“本質的に難しい”のか。それは次の点である。

ドライバ依存をもつ。

周知の通り、graphicx はドライバ依存をもち、(DVI 出力のエンジンで)それを使用する時には、dvips や dvipdfmx などの“ドライバオプション”を適切に指定する必要がある。このような“ドライバ依存性”は、少なくとも DVI 出力のエンジン(pLaTeX 等)のユーザにとっては“当然知っているべき”基本的知識であり、事実、graphicx パッケージについての解説記事の大多数は、ユーザが“ドライバ依存性”について十分に理解していることを前提としている。

ところが実際には、これから graphicx を使おうとする初心者ユーザは、そもそも「自分が使うべき“ドライバ”は何か」、すなわち「自分が使っている DVI ウェアは何か」についての知識を持ち合わせていないことが多いようである。そのため、“ドライバ”について不適切な設定(例えば、dvipdfmx を使っているはずなのに dvips オプションを指定してしまう)を行ったまま文書を作ってしまう。LaTeX では「ドライバが間違っている」ことは検出できないため、多くの場合、全く不可解な結果になりユーザは途方に暮れてしまう。

このような不幸な事態を招いているのは、LaTeX の指導における「“ドライバ”の扱い」に対する矛盾した態度であると、私は考えている。現在においては、LaTeX ユーザは「導入について述べた単体の解説記事」を見て TeX システムの導入(インストールと初期設定)を行うことが普通になっている。当然、そういった解説記事はユーザに対して「この設定が利用する DVI ウェアは何か」について学習者に明確に認知させるべきである。*1しかし、初心者についての解説記事を書く人の中には、「『DVI ウェアが何か』みたいな“細かい話”について(TeX の導入の段階で)初心者に説明すると余計な負担になり好ましくない」という認識をもっている者がいる。確かにそれも一理はあるが、少なくとも、先に述べた「graphicx の解説記事が想定している前提」とは相容れない。

このような残念な状況が続くことを前提にする限りにおいて、graphicx パッケージの“本質的な難しさ”を解決するには、

graphicx パッケージがもつ、
ドライバ依存を完全に解消する

より他に術はないだろう。

“本質的に難しくない”graphicx を作りたい話

graphicx をドライバ非依存にすることは可能だろうか。一見したところではそれは不可能であるように思える。DVI において画像ファイルを挿入するにはドライバ依存の special 命令が必須であるからである。

しかし、ちょっと待ってほしい。「special 命令」が必須というのは、「“ユーザが指定した”画像を挿入する」場合の話である。つまり、この仕様こそが、graphicx を“初心者にとって本質的に難しい”ものにしている元凶であることに注意してほしい。

確かに、一般の使用においては、「画像を挿入する」という場合に、「挿入する画像を自分で選択したい」という要求は自然なものであろう。しかし、まだコンパイルの操作さえおぼつかないような LaTeX の初心者の立場で考えると、それはあまりにも“贅沢な要求”であるとも考えられる。すなわち、

ユーザが画像を指定することを止めて、代わりに
特定の画像、例えば、ゆきだるま☃を常に挿入する

という仕様は考慮の余地がある。少なくとも、それによって“ドライバ依存”に関する一切のトラブルから解放されるのであれば、そのほうが「初心者にとって望ましい」状態であることは疑いない。

“本質的に難くない”graphicx を作った話

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

tcgraphicss パッケージ*2の読込は、以下のように、graphicx パッケージの読込の後に行う必要がある。パッケージオプションは存在しない。

\usepackage{graphicx}
\usepackage{tcgraphicss}

これだけで、graphics パッケージの全ての機能が、ドライバ非依存の動作に変更される。

画像を挿入してみる

例えば、ドライバについてよく理解していない初心者が次のような文書を作成したとする。

% pLaTeX 文書
\documentclass[a5paper]{jsarticle} % ドライバ指定が
\usepackage{graphicx}              % どこにもない!!
\begin{document}

figure環境を用いて図を記述した場合、
図は「無理のない」適切な場所に自動的に配置されます。
図にキャプションを付けることもできます。

\begin{figure}[tp]
  \centering
  % 画像に枠を付けた
  \setlength{\fboxsep}{0pt}
  \setlength{\fboxrule}{2pt}
  % 画像を挿入したい
  \fbox{\includegraphics[clip,width=5cm]{tiger.eps}}
  \caption{figure環境の例}
\end{figure}

\end{document}

tiger.eps は“例の虎の絵”である。)

graphicx のドライバの既定値が dvips であるシステム(TeX Live 等)を仮定すると、このソースを platex + dvips で PostScript に変換した場合は、次のようにユーザが指定した虎の絵の画像が、想定通りの位置に出力される。

platex + dvips での出力)

しかし、同じソースを platex + dvipdfmx で PDF に変換した場合、画像がすれて出力されてしまう。

platex + dvipdfmx での出力)

この理由はもちろん「ドライバ指定がマチガッテル」(dvipdfmx を使うのに dvips が(既定で)指定されている)からである。しかしこの場合、platex や dvipdfmx の実行中にエラーや警告は一切出ないので、“ドライバについて何も知らない”初心者にとっては、どこを間違えたかの手がかりを得る手段が全く無いことになる。

ここで tcgraphicss パッケージを読み込んでみよう。

% pLaTeX 文書
\documentclass[a5paper]{jsarticle}
\usepackage{graphicx}
\usepackage{tcgraphicss}% ドライバ非依存!
\begin{document}
% あとは先と同じ
platex + dvips での出力)

 
platex + dvipdfmx での出力)

この場合、graphicx がドライバ非依存な動作に切り替わるため、dvips と dvipdfmx のどちらを利用した場合でも(虎の絵が☃の絵に変わっていることを除いて)完璧な出力が得られる。これなら、初心者が混乱してしまうこともないであろう。

\rotatebox してみる

画像の読込(\includegraphics 命令)は graphicx パッケージの代表的な機能であるが、このパッケージが提供する機能は他にもある。例えば、\rotatebox 命令を用いると、テキストを任意の角度だけ回転させて出力することができる。次の例では、図の中にある“294mm”という文字を 90 度回転させるために \rotatebox を使っている。

% LaTeX 文書
\documentclass[a5paper]{article} % ドライバ?
\usepackage{graphicx}            % 何ソレおいしいの?
\begin{document}

\begin{center}
  \setlength{\unitlength}{0.15mm}
  \begin{picture}(200,200)
    \put(60,-20){\vector(-1,0){60}}
    \put(150,-20){\vector(1,0){60}}
    \put(105,-20){\makebox(0,0){210\,mm}}
    \put(-20,95){\vector(0,-1){95}}
    \put(-20,184){\vector(0,1){95}}
    % ここで "294mm" の文字を回転して出力させるため
    % \rotatebox 命令を利用している
    \put(-25,140){\makebox(0,0){
       \rotatebox[origin=c]{90}{294\,mm}}}
    \thicklines
    \put(0,0){\framebox(210,279){%
        \sffamily\bfseries\huge A4}}
  \end{picture}
\end{center}

\end{document}
    (拡大→)

\rotatebox も special 命令を用いて実装されているためドライバ依存性をもつ。(既定のドライバ指定が dvips の場合、)dvips と dvipdfmx では正常に出力されるが、dviout で DVI ファイルを表示した場合、\rotatebox を適用した文字が消えてしまう。

それでは、先程と同様に、tcgraphicss パッケージを読み込んでみよう。

\documentclass[a5paper]{article}
\usepackage{graphicx}
\usepackage{tcgraphicss}% ドライバ? そんなの関係ねぇ!
\begin{document}
    (拡大→)

ご覧の通り、今回も、(文字列が☃列に変わっていることを除いて)完璧な出力が得られる。

まとめ

TeX のアレ性のため、LaTeX のパッケージの開発においては、時として“解決困難な本質的な問題”に突き当たってしまうことがある。そのような時は、「出力を☃に変える」という方策について考えを巡らせてみよう。もしかしたら、そこから画期的な解決法が生み出されるかも知れない。

*1:「どの DVI ウェアを使っているのか」について予め正解を知っているのはその記事を書いた人に限られるからである。もちろん、TeX の導入から graphicx の使用までの一連の課程を提供している文献であったら、その中の任意の時点で“ドライバ”を扱うことができるのであるが。

*2:綴りの最後に余分な s があることに注意。もちろんこれは snowman の s である。