お知らせ+活動記録+たわごと

HP と Twitter を補完するとともに、互いの密接な連携を図るため、本ブログを開設した。三位一体を目指す。情報提供、広報活動、教育・啓蒙活動の一環として、肩の力を抜き、冗長性を廃し、簡にして要を得た文章を書くよう心がける。
<< December 2019 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 >>
 
MOBILE
qrcode
PROFILE
無料ブログ作成サービス JUGEM
 
Gnuplot で pdfcairo ターミナルを使うための手続き
1. pdfcairo ターミナルに切り換えたきっかけ

最近購入した "Gnuplot in Action", 2nd ed. を流し読みしていたとき、
A major breakthrough is the development of a family of terminals that are all based on a single set of contemporary libraries for graphics and text rendering. Because these terminals all share the same back end, you can now create bitmaps (PNG), vector images (PDF), and graphs for interactive viewing (wxWidgets) with consistent appearance across all formats. Gnuplot takes advantage of the cotemporary features of the underlying libraries to produce high-quality graphs through the use of over-sampling, anti-aliasing, and so on.
.....
In the past, gnuplot's support for PDF was relatively weak, particularly in comparison to the very full-featureed PostScript terminal. This situation has now been reversed, and the Cairo-based PDF terminal is probably to be preferred over the classic PostScript terminal.
という指摘(14ページ)が目にとまった。213, 214, 220, 233ページでも 2D グラフィックス・ライブラリー cairo に基づくターミナルに言及している。その的確な現状認識に触発され、RIETAN-FP v2.81 に至るまで長く出力先に指定してきた gnuplot の postscript ターミナルを pdfcairo ターミナルに切り換えようと決意した。グラフの枠と目盛りの線幅を同一にできないという postscript ターミナルの欠陥には我慢がならなかった。古くからあるターミナルだが、未だに枯れきっていないのである。PDF ファイルへの変換に余計な時間がかかるのも気に入らなかった。一方、pdfcairo なら高品質の PDF ファイルが直接生成する。

以前 pdfcairo の利用を検討した際には、Homebrew を通じて macOS 上で gnuplot と cairo とを連携させる方法が突き止められず、あえなく挫折した。今回は不退転の覚悟で臨み、徹底的に調査した。その結果、習い覚えたノウハウとテクニックを以下に報告する。

2. macOS 版のインストール

macOS 用 gnuplot は、次の手続きに従ってインストールすることを推奨する:
  1. すでに gnuplot をインストール済みだったら、必ずアンインストールする。たとえば Homebrew でインストールした場合は、ターミナルで "brew uninstall gnuplot" と入力してアンインストールする。
  2. 古いバージョンの gnuplot が残っている場合は削除用コマンドが指示されるので、その通り入力する。
  3. Wake Forest University の Web サーバー から gnuplot のインストーラー gnuplot-5.2.3-quartz.pkg をダウンロードする。
  4. gnuplot-5.2.3-quartz.pkg をダブルクリックして gnuplot 5.2.3 をインストールする。
  5. Applications フォルダーに gnuplot(実体は Gnuplot.app パッケージ)が生成したことを確認する。
gnuplot をダブルクリックし、"gnuplot> set terminal" と入力すると利用できるターミナルが出力されるが、その中に cairo、多言語テキスト配置・レンダリング用ライブラリー pango、フォント選択用ライブラリー fontconfig を使うターミナル pdfcairo, pngcairo, epscairo に加え、wxt と aquaterm ターミナルも含まれている。

残念ながら、上記サーバーで公開されている gnuplot は更新頻度が低い。こうしてインストールした gnuplot 5.2.3 は最新版ではないものの、拙作ソフトから起動している限り安定に動く。対数グラフさえプロットしなければ、まずトラブルは起きないだろう。

3. macOS 版の実行用コマンド

上記の macOS 用 gnuplot は pdfcairo を出力先とする RIETAN-FP v2.82 以降と互換性がある。macOS 版 RIETAN-FP の出力する hoge.plt における文字のシフトやマージンはこの gnuplot 用に最適化されている。シェルスクリプト中では
/Applications/Gnuplot.app/Contents/Resources/bin/gnuplot-run.sh
を gnuplot コマンドとして使えばよい。gnuplot-run.sh 中で11個の環境変数が定義された後、同じフォルダー内の(環境変数を設定できない)実行形式ファイル gnuplot が起動する。/usr/local/bin/gnuplot が存在しなければ、起動可能な /usr/local/bin/gnuplot が置かれるが、以前インストールした gnuplot が残っていると、それが実行されてしまう。したがって絶対パス付きの gnuplot-run.sh を実行する方が安全・確実である。Gnuplot スクリプトファイル *.plt は cat コマンドでテキストデータに変えた後、パイプを通じて gnuplot-run.sh に渡すか、gnuplot-run.sh の引数にすればよい。たとえば hoge.plt を入力して hoge.pdf を生成するには、
cat hoge.plt | /Applications/Gnuplot.app/Contents/Resources/bin/gnuplot-run.sh > hoge.pdf
とする。

4. Windows 版のインストール

Windows 用インストーラーは SourceForge からダウンロードできる。Windows 用 RIETAN-FP・VENUS システムに同梱している gnuplot は、インストーラーの実行によって生成した gnuplot フォルダーに他ならない。ありがたいことに、その gnuplot では cairo + pango + fontconfig、ひいては pdfcairo が標準で使える。ただし、fontscale と offset の最適値は macOS 用と微妙に異なる。

5. Windows 版の実行

Windows 版 BusyBox を活用する bash スクリプトでは gnuplot は macOS の場合と同様に実行できる。たとえば hoge.plt を入力して hoge.pdf を生成する時は、
cat hoge.plt | "C:/Program Files/gnuplot/bin/gnuplot" > hoge.pdf
とする。すなわち gnuplot.exe を絶対パス付きで実行すればよい。

6. 特殊文字と日本語の出力

出力先として pdfcairo を指定したとき、gnuplot スクリプトファイル中でギリシャ文字や記号などをどのように記述すればいいのかについては、"Gnuplot in Action" の10.2.3を参照されたい。RIETAN-FP v2.82 以降が出力する *.plt も恰好の手本となる。その際の手間を減らすために、RIETAN-FP・VENUS システムのマクロが出力する *.plt ファイル中の8進コード(\+3桁の8進数の繰り返し)を以下に列挙しておく:
\316\261: α
\316\262: β
\316\263: γ
\316\270: θ
\316\273: λ
\316\274: μ
\302\260: ° (度)
\303\205: Å
\342\210\222: −(マイナス; UNICODE: U+2212)
\342\200\262: ′ (プライム)
\342\200\262: ̋ (ダブルプライム)
特定文字の8進コードを知るには、「文字コード変換」で変換するとよい。その際には「Unicode 対応 文字コード表」も役立つ。イタリックの書体にするには、たとえば θ の場合 "{/:Italic \316\270}" と入力する。

イタリックでない文字は、たとえば
{/Symbol \260}: ° (度)
{/Symbol \242}: ′ (プライム)
というように PostScript 文字コードを書いてもよい。ただし sans-serif 書体(6節参照)にはならない。

上述の8進コードや PostScript 文字コード (Symbol) は macOS、Windows を問わずに通用する。Unicode のテキストファイルを出力できない高級言語でビルドしたプログラムで gnuplot スクリプトファイルを出力する場合に役立つ。

一方、テキストエディターでスクリプトファイルを編集するのであれば、「RIETAN vs. Z-Rietveld」に例示したように "set encoding utf8" という行を挿入し、それ以降にギリシャ文字、記号、かな漢字などを直接書いて、UTF-8 エンコーディングでファイルを保存する方がはるかに楽だ。

7. 最適なグラフ用フォント

欧文フォントは serif 体と sans-serif 体に大別される(「セリフ体とサンセリフ体の違いとは?欧文フォントの基本と種類」参照)。一般に、グラフ中のラベルや数値には serif 体よりも sans-serif 体のフォントが適している。事実、Gnuplot のマニュアルには pdfcairo ターミナルのデフォールトは sans (= sans-serif) だと記されている。sans-serif 体の代表的フォント Arial は macOS にも標準で組み込まれる。したがって具体的なフォントを指定したいならば、Windows、macOS を問わず font "Arial" とすればよい。「gnuplotのTips」によれば、Windows の場合、OS によるフォントの別名が有効ではなく,C:¥Windows¥Fonts にあるフォント(ArialやSymbolなど)以外では sans-serif, serif 程度しか有効でないそうである。確かに Windows では、Arial を指定しないとイタリックの書体にならない。

"Gnuplot in Action" の215ページには
If a sans-serif font is selected as the default font for a terminal, then the font subsystem will attempt to find sans-serif glyphs for all requested characters even for special symbols.
と書かれている。つまり、記号やギリシャ文字なども同様な外見のフォントが自動的に選ばれる。

なお、fontscale のデフォールトは0.5だが、これの変更により実質的なフォント・サイズを一挙に変えられる。

8. マイナスの出力法

Gnuplot 5.0.4以前の pdfcairo には major tics(主目盛)に対する数値が負のとき、数字の前にマイナスでなくハイフンが付いてしまうという瑕疵があった。Gnuplot 5.0.5からは "set minussign" コマンドによりハイフンでなくマイナス (UNICODE: U+2212) を出力できるようになった。ただし、前述の UTF-8 エンコーディングを適用するため、
set encoding utf8
set minussign
という二つの命令をペアで実行しなければならない。両コマンドを使ってプロットした Ni の分散補正と質量減衰係数の波長(エネルギー)依存性を下図に示す。確かに負の f' と f'' の符号がハイフンでなくマイナスになっている。


9. 余白の切り取り

terminal pdfcairo には crop オプションがなく、pdfcairo へのグラフ出力では余白が自動的にカットされることも、利便性の高さと処理時間の短縮に寄与する。タイトルやラベルの一部が隠れてしまうようだったら、
set margins <left>, <right>, <bottom>, <top>
という命令で余白を微調整すればよい。負の値だと gnuplot が決めたマージンが使われる。

10. Parallels Desktop + Windows 10 上で使用する際の留意点

Retina ディスプレイの Mac を使い、Parallels Desktop + Windows 10 の環境下で Gnuplot 5.2.X を実行すると、文字サイズが異常に大きくなる。そういうトラブルを避けるには、Windows のスクリーン設定を変更する必要があることを二年近くかけて突き止めた。詳しくは Evernote ノート「Windows 用 Gnuplot 5.2.7 を活用するためのノウハウ」を参照せよ。

11. ターミナル間の互換性

"Gnuplot in Action" 中の一節(213〜214ページ)、
Because an entire family of terminals(注: pngcairo, pdfcairo, epscairo, wxt のこと)shares a common back end, it's now possible to generate bitmap (PNG), vector (PDF and EPS), and interactive (wxWidgets) versions of the same graph, with only minor differences between them.
では cairo・pango ライブラリーを使うターミナル間の互換性の高さが強調されているが、実際はそう簡単にターミナルを変更できる訳ではない。グラフの見かけ、とりわけラベルや数値のサイズとオフセットを最適化するには、試行錯誤を繰り返さねばならない。

12. おわりに

ターミナル pdfcairo への出力で得られた PDF ファイルは LaTeX, Microsoft Word, Keynote, Adobe Illustrator などの文書に直接挿入できる。文書に貼り付ける図は PDF ファイルに統一しているし、余白を切り取ったグラフが出力されるのも好都合なため、今後は pdfcairo をフル活用していく。
コメント
コメントする









 

(C) 2019 ブログ JUGEM Some Rights Reserved.