LaTeXでPlantUMLを使う(本来のやり方)
$\LaTeX$にはplantuml
パッケージなるものがあり、以下のような使い方をします。
\documentclass{scrartcl}
\usepackage{plantuml}
\begin{document}
\begin{plantuml}
@startuml
Alice -> Bob: test
@enduml
\end{plantuml}
\end{document}
しかし、この方法には欠点があります。
- VSCodeでハイライトが効かない
- PlantUML部分が長いと$\LaTeX$ファイルの管理が大変
- 環境変数
PLANTUML_JAR
を設定する必要がある
そこで、PlantUMLファイル(.pu)を\includegraphics
で直接読み込めるようにしてみました。
(PlantUMLファイルをVSCodeで編集する方法に関してはこの記事を参考にしてください)
LaTeXでPlantUMLファイルを読み込もう
環境はLuaLaTeXです。それ以外の環境だと動かない可能性があります。
方針
epstopdf
パッケージを使うと、\epstopdfDeclareGraphicsRule
コマンドで、\includegraphics
で特定の拡張子のファイルのときのみ変換処理を施すということが可能になります。この仕様を利用します。
方法
必要なソフトウェア:
- Pythonをインストールしておきます
-
PlantUMLをダウンロードして
plantuml.jar
にリネームし、$\LaTeX$ファイルがあるディレクトリに配置します - InkscapeもインストールしてPATHを通します
- Javaも最新版を入れておきましょう
以下のスクリプトを「pu2pdf.py」という名前で作成します。
from sys import argv
import os
if len(argv) == 3:
cat = 'cat'
if os.name == 'nt':
cat = 'type'
tmp_dir = 'svg-inkscape'
os.makedirs(tmp_dir, exist_ok=True)
svg = os.path.join(tmp_dir, argv[1] + '.svg')
os.system(cat + ' ' + argv[1] + ' | java -jar plantuml.jar -charset UTF-8 -tsvg -pipe > ' + svg)
os.system('inkscape -z --file=' + svg + ' --export-pdf=' + argv[2])
また、$\LaTeX$ファイルのプリアンブル部分にはこのように書きます。
\usepackage{graphicx}
\usepackage{epstopdf}
\epstopdfDeclareGraphicsRule{.pu}{pdf}{.pdf}{
python pu2pdf.py #1 \OutputFile
}
あとは、$\LaTeX$の本体部分でこのようにすれば、PlantUMLのファイルを使うことができます。
\includegraphics{ファイル名.pu}
lualatex -shell-escape ファイル名.tex
を実行します。この-shell-escape
オプションがないと動きません。
Pythonスクリプトの解説
Windows環境にも対応するため、Windows環境の場合はcat
コマンドの代わりにtype
コマンドを使用します。
次にPlantUMLを呼び出し、パイプを利用してPlantUMLファイルの内容を流し込みます。また、リダイレクトを利用してSVGに吐き出します。
最後にInkscapeを呼び出してSVGからPDFに変換します。
余談: Pandocでも使える
Pandocでも使えます(yamlでheader-includesを使ってプリアンブルに宣言する必要はある)。
![キャプション](ファイル名.pu)