これは「TeX & LaTeX Advent Caleandar 2014」の22日目の記事でした.
(21日目は termoshtt さんです.23日目は ti5942 さんです.)
3年前に作成していた文書で回路図を描く必要があり,Asymptoteで回路図を頑張って書こうとしたお話です.
LaTeXにおける図形描画
本題に入る前にAsymptoteとTikZの説明をします.テキストベースで,LaTeXまわりで図形を描画するツールとして,Asymptote,TikZがあります (ちなみにAsymptoteは美文書5版,TikZは美文書6版で取り上げられています).それぞれの特徴を簡単に挙げます.
- Asymptote
-
asy
コマンドで実行 - 内部でLaTeXコマンドを呼びだすが,インターフェイスとしては独立
- LaTeXコードに埋め込めるようなパッケージも存在していたはず
- C++のようなソースコード,独立した画像を出力
-
- TikZ
- tikzパッケージをインクルードして実行
- e-TeX拡張の処理系が必要
- LaTeXソースコードに埋め込む
- ソースコードはTeXマクロ
- beamerのアニメーションを描く時に便利
- tikzパッケージをインクルードして実行
私個人的には,
- ベタなTeXマクロでなく,Asymptoteの方が書きやすい/読みやすい
- TeXと分離して処理できる
- 例えば,TeXに出力するのではなくHTMLに埋め込む時にも取り回しが楽
という理由で好きだったのですが,最近はTikZの方が流行っているように見えます.そもそもAsymptoteがどれほど流行ったのか知りませんが.
とても簡単なサンプル
どちらも長方形を描く例です.サンプルなのでまどろっこしく書いています.
Asymptoteの例
void drawRectangle(real x, real y, real w, real h) {
draw((x,y)--(x+w,y)--(x+w,y+h)--(x,y+h)--cycle);
}
drawRectangle(0, 0, 100, 100);
TikZの例
\begin{tikzpicture}
\draw (0, 0) -- (100, 0) -- (100, 100) -- (0, 100) -- cycle;
\end{tikzpicture}
なぜAsymptoteで描いた?
当時TikZはあったかもしれないですが,私は存在を知りませんでした.どのみち,e-TeX拡張非対応の処理系(TeXLive 2010)も使っていたので使用できなかったと思います.
実装
ソースをこちらに置きました : circuit.asy
確か長方形や円などはプリミティブで書くコマンドがあったかと思いますが関数で自前で書きなおしています.抵抗やら電圧源などは,パラメータがあって少し複雑に見えますが,ただひたすらベタに書いてます.なんとなく読めるでしょうか?
垂直・水平方向にもパラメータで対応するようにしています.関数では描画の終了した点を返すようにしてパスを書きやすくしています.
実際の回路図の描画では,あまり流れるように図形の描画が宣言できていません.もうちょっと良い設計はあったんでしょうか...
ちなみにTikZでは?
なんと,回路図を描くパッケージがいくつかあります.この例では circuitikz
を利用しています.
...簡単ですね.
おわりに
確かにTikZの方がパッケージも充実しているのですが,記述性の方はAsymptoteの方が良いように感じるんですが,どうでしょうか.
結論として,
- 図形描画ツールとしてTikZと対比しつつAsymptoteを紹介した
- さくっと図形の構造化ができるAsymptoteで回路図を描いてみた
- その結果,オブジェクトを抽象化して描くことはできた
というお話でした.
昔作ったものをせっかくだからアップしておきたい,と思って書きだしたんですが,書きながら今一つだと感じていますhi
回路図描く時って普通は専用のツール(無料のやつだとQt-Bschとか)使う人がほとんどなんでしょうか.気になります.
ちゃんと確認していないのですが,この記事を書こうと思って探してみたらAsymptoteにもそれっぽいパッケージがありました.車輪の再発明はよくないですねぇ...