LaTeXの文章の中でditaaを使いたい。

LaTeXで文書を書いている時に、図表を入れたい場合がある。表やグラフなら、table環境やpgfplotsパッケージを使えばよいよね、ということになる。 だがほんのちょっとした図を描きたいときにはどうしたものだろう。 例えば、こんなような。 f:id:dakusui:20180929181517p:plain

わざわざ、WordやPowerPointやWriterとかそんなようなツールを立ち上げて描画して、.pngにして、includegraphicsとかめんどくさい。大した図じゃないのに。 さらに問題なのは図表のもとになったファイル(.docとか.pptとか)を別に保存しておかないとならないことだ。でないと変更ができなくなってしまう。私の場合、そういうファイルは極めてしばしばどこかに行ってしまうし、製図したツールのサポートがいつまでもあるとは限らない。MicrosoftやLibreオフィススイートなら大丈夫なようにも思えるが、卒業や転職を気にライセンスが使えなくなったりすることもあるし、オープンソースコミュニティの存続やプロダクトの互換性がどこまで担保されるかというのは一応は未知数のことだ。

さて、冒頭に触れたditaaというのは、アスキーアートで書いた図表を綺麗にレンダリングしてくれるエンジンだ。

ditaa

実は先ほどの図は、ditaaに以下のアスキーアートを与えた時に得られる図なのだ。

    +--------+   +-------+    +-------+
    |        | --+ ditaa +--> |       |
    |  Text  |   +-------+    |diagram|
    |Document|   |!magic!|    |       |
    |     {d}|   |       |    |       |
    +---+----+   +-------+    +-------+
        :                         ^
        |       Lots of work      |
        +-------------------------+

LaTeXのソースファイル中に書いた、上のようなアスキーアート

f:id:dakusui:20180929190232p:plain

こんな風にレンダリングされたら便利ではなかろうか?少なくとも私は使いたい。 ということでそういうものを作ってみた。gistはここにある。

The "ditaa" environment · GitHub

このエントリの以降の部分はこのgistにコメントとして付した使用方法を和訳したものである。

事前条件

  • ditaaがインストールされていること。(コマンドラインからditaaが実行できること)。最近のメジャーなUbuntuLinuxディストリビューションならsudo apt install ditaaとするだけでインストールできると思う。Macでもbrewが使えればsudo brew install ditaaだけでOKだった。Windowsの場合はよくわからないのだがscoop というものがあるらしいので、これで簡単にインストールできるのかも知れない。その辺の最近の情勢がよく分からないので誰か教えて欲しい。
  • pdflatexなりlatexなり、LaTexのソースファイルをコンパイルする時に--enable-write18 オプションを与える必要がある。つまり、残念なことだがOverLeafやShareLaTeX(OverLeafに統合されるらしいが)では使えない。

使用方法

  • ditaa.styファイルを .tex ファイルと同じディレクトリに置く。
  • ditaaディレクトリをイメージがおいてあるディレクトリ(\graphicspathコマンドで指定するディレクトリ)の下に作る。ちなみにditaa.styはこのディレクトリの下にあるditaaディレクトリに.ditaaファイルや.pngファイルを作る.
  • .texファイルの冒頭でusepackage[imagepath=IMAGEPATH]{ditaa}と書く。IMAGEPATHの部分は前述の\graphicspathで指定するディレクトリと同じものである。
  • あとは普段通り、 .texコンパイルすることになるが --enable-write18オプションを忘れないこと。

後はこんなようなTeXソースが

\begin{ditaa}{ditaa caption example}{ditaaexample}
    +-----+     +----+     +---+
    |Store+---->|This+---->|One|
    +--+--+     +----+     +---+
       |
       V
    +-----+
    |THIS |
    +--+--+
       |
       V
    +-----------+     +--+
    |another one+---->|Hi|
    +-----------+     +--+
\end{ditaa}

こんなふうにレンダリングされることになる。

screenshot from 2018-09-27 06-43-54

ちなみに生成される図には\label{fig:ditaaexample}のように、ラベルが自動で与えられるので\ref{fig:ditaaexample}とすれば文中からその図を参照できる。 ラベルが衝突すればどちらにせよエラーになる(と思う)ので問題にはならない筈だが、ditaa環境の第二引数、つまりこの例ではditaaexampleはditaaが.pngを生成する際のファイル名に用いられるので一応注意して欲しい。

ちなみに

     \begin{ditaa}[6cm]{ditaa caption example2}{ditaaexample2}
       +---------+
       | cBLU    |
       |         |
       |    +----+
       |    |cPNK|
       |    |    |
       +----+----+
    \end{ditaa}

のようにすれば、図の幅を指定できる。本当は\includegraphicsに指定できる全てのオプションを使えるようにしたかったのだが、私のLaTeX力では無理だった。

Tips

近頃はascii-flow みたいなサイトでアスキーアートの作図ができるので、一緒に使うと便利だと思う。

今後の課題

  • 内部的に\write18という外部プログラムを実行するためのコマンドを使ってditaaの起動を行っている。---enable-write18を指定する必要があるのもこのためである。従ってOverLeafのようなオンラインLaTeXサービスでの利用はできない。このパッケージが将来的に広く使われるようになればうまい方法があるのかも知れないが(ditaaコマンドを特別扱いするとか)、私がLaTeXを使うのは何年ぶりだろうという話だし、なんなら.styファイルを作るのも\newenvironmentコマンドを使うのも初めてなので一体どうすればいいのか見当もつかない。LaTeX識者のアドバイスをお待ちしたい。
  • \includegraphicsコマンドに与えられる引数は全てサポートされるべきだが、そうなっていない。keyvalとかそういうのを使うようなのだが、難しすぎてよく分からない。本文中に書いたように私のLaTex力を超えると判断した。いい加減ペーパー自体を書かなきゃいけないし。これについてもLaTeX識者のアドバイスをお待ちしたい。