Gnuplotでは、普通のfont変更は例えば~~~ font "Helvetica,12"
とかやればOkだ。ではギリシャ文字を含む時は?ここで、「ギリシャ文字といえば」の{/Symbol }
記法ではフォント変更ができないという問題に出くわした。
後から考えると別にバグでもなく仕様の問題だったのだが、類似記事が見当たらず、解決に恐ろしく時間のかかったのでメモとしてまとめておく。
なおいくつかの内容は厳密に仕様を確認せず、実験的な憶測で書いているところがあるのはご了承いただきたい。
前提として
- OSは MacOSX Big Sur または Ubuntu 20.04
- Gnuplot 5.2
- Gnuplotはscriptを書いて運用(対話型ではない)
- terminal はpdfcairo
の環境を想定する。「ギリシャ文字も含めてフォントをLatexに揃える」とする記事の多くがpdflatex, epslatexの想定しているが、ここではやはり文字も完備した単一の画像ファイルにこだわった。
以下ではComputer Modern系のフォントで$\eta_w$をgnuplotに入れることを想定する。
手順
CTANなどからフォントのファイル(otfまたはttfファイル)をダウンロードして所定のインストールの手続きに従う。(たとえばcmmi10.ttf)
完了してfontがOSに認識されていれば$ fc-list
でヒットし、使うべきフォント名がわかる。例えば
$ fc-list | grep cm
/Users/***/Library/Fonts/cmmi10.ttf: cmmi10:style=Regular
コロンに挟まれたcmmi10が使うべき名前である。CMU Serifの様にスペースを含む場合は間をハイフン-で埋める(CMU-Serif)。これを使ってfontを使いたいところで
set encoding utf8
set ylabel "η_w" font "cmmi10:Italic,"
と入れる。肝は、utf8の指定と半角のイェータを直接書いてしまうことである。
簡単な解説と注意
ギリシャ文字ををスクリプトに直接書くべし、という一番素朴なやりかたである。
大半のweb上の記事で紹介されている{/Symbol h}_w
の記法だと、fontは固定と言って差し支えない。これは直接打ち込んだ$\eta$と{/Symbol h}_w
とでギリシャ文字の内部処理が違うからであると思われる(後述)。
もちろんfontの指定は、Greekに対応したものを選ぶ必要がある。また、encodingをutf8にしておくことも重要である。
これはGnuplotに標準的に想定されている方法なのか?そんな全角とも半角ともわからない様なギリシャ文字を含むファイルで大丈夫なのか?と疑った方は、この衝撃的なdemoをご覧いただきたい
enhancedの命令の嵐もさることながら、{/Symbol a}
を排し整然とギリシャ文字が並ぶ光景が圧巻のdemoである。これがモダンなGnuplotなのか。
FAQとさらなる解説
ttf ? otf? pfa? pfb? どれ入れたらいいの?(sudo aptで入れるの?)
gnuplotは面倒なことにterminalによって何をするべきかが変わる。pdfcairoはOSに入っているfontを使う。fontをOSに入れる操作は主に2択である
- otfまたはttfファイルをダウンロードしてインストール操作を行う
-
sudo apt
で入れる
Latexの標準であるComputer Modernの大半は、CTANでotfまたはttfを落としてきてインストール操作をする。cmuはpackageが提供されているので後者でsudo apt install fonts-cmu
とするのが早い。
なお、otf,ttfは片方どちらかでよい。どっちを優先するべきなのかはよくわからない。とりあえずotfで様子見でもいいかも?すいません
本当に入ったかどうか確認したい
現在使用可能のfontはLinux, Macの場合fc-list
で出てくる。fonts-cmu
でcmuを導入したUbuntuでの例を一つ挙げる。
$ fc-list | grep cm | grep Roman
/usr/share/fonts/truetype/cmu/cmunrm.ttf: CMU Serif:style=Roman
/usr/share/fonts/truetype/cmu/cmunsl.ttf: CMU Serif Extra:style=RomanSlanted
/usr/share/fonts/truetype/cmu/cmunorm.ttf: CMU Concrete:style=Roman
/usr/share/fonts/truetype/cmu/cmunbmr.ttf: CMU Bright:style=Roman
フォーマットはFILEPATH: FONTNAME:style=STYLE
となっている。ttf,otfを使ってインストールした人で慎重な方は、使ったファイルがFILEPATHにあることを確認することをお勧めする。実際に使う時は、fontの変更をするところで名前を入れれば良い。FONTNAMEのところを使って
set terminal pdfcairo font "CMU-Serif,12"
というように使う。
ギリシャ文字入力めんどくさくないか?
めんどくさく思うほど長文を打つ機会はない様にも思うが...
正直全角で「あるふぁ」→変換で入れても意外と(自動で変換されているのか)問題なかったりする。
MacやLinuxではキーボードから直接ギリシャ文字やその他が入力できる。
- Mac -> alt(option) + (対応するalphabet) (ただしshell上とかだとうまくいかないかも)
- linux -> 要調査
- Windows -> 要調査
なお、scriptをつくる際は文字コードがUTF-8になってるかどうかをよく確認する必要がある。
では{/Symbol a}
とはなんだったのか?
enhanced postscriptでサポートされる記法の一つである。
この記法ではテキスト中の{中括弧}が特別扱いされていて、いくつかの機能をもつ。
その中に、PostScript Character Codeに対応する文字を呼ぶというものがある。{/Symbol a}はこのうちの1つである。1
書き方(nは40-377の数字, xは文字) | |
---|---|
{\n} | {/text nnn}と同じ文字 |
{/text \n} | Tの列の該当行の文字 |
{/Symbol \n} | Sの列の該当行の文字 |
{/Symbol x} | Sの列で、Tの列の文字xと同じ行の文字 |
{/ZapfDingbats \n} | (参考)Zの列の該当行の文字 |
ややこしいのは、{\n}で指定した文字はfontの指定が自由に効くのに対して、{/text x}, {/Symbol x}で呼び出された文字は予め規定されたPostscriptの基本書体で出てしまい、後からのfontの指定が効かないようになっているようだ。
なお(後述するが)GunuplotではUnicodeのコードポイント(U+0061みたいなやつ)で文字を指定できる。これで指定した場合はfontの指定は効く。
以上のことを確認するために、まとめの表とサンプルコードを用意した(Consolasが手元ない場合は、何か別のわかりやすいfontを指定して欲しい)
自由(font 〇〇で変えられる) | 固定(自動でPostscriptのfontが適応) | |
---|---|---|
a | a(直接入力) {\141} \U+0061 | {/text a}, {/text \141} |
アルファ | α(直接入力) \U+03B1 | {/Symbol a}, {/Symbol \141} |
set terminal pdfcairo size 2.5,1.5 font "Consolas,12"
set out "font2.pdf"
set encoding utf8
POSX = 0.1
POSY = 0.6
HS=0.1
set label 2 at POSX,POSY "a {\141} {/text a} {/text \141} {/Symbol a} {/Symbol \141}"
set label 3 at POSX,POSY-HS "a {\141} {/text a} {/text \141} {/Symbol a} {/Symbol \141}" font "Times-New-Roman"
set label 4 at POSX,POSY-2*HS "α {/Symbol a} \U+03B1"
set label 5 at POSX,POSY-3*HS "α {/Symbol a} \U+03B1" font "Times-New-Roman"
plot [0:1][0:1] -1 notitle
その他の数式用記号・文字どうするの?
この部分はあまりこだわりすぎることはお勧めしない。
記号 | PostScript Character Code | Unicode | 備考 |
---|---|---|---|
\pm | {/Symbol \261} | U+00B1 | |
+ | {\53} ,{/Symbol \53} | U+002B | |
- | {\55} ,{/Symbol \55} | U+002D | textとSymbolで長さが少し違う |
\times | {/Symbol \264} | U+00D7 | |
\leq | {/Symbol \243} | U+2264 | |
\geq | {/Symbol \263} | U+2265 | |
\neq | {/Symbol \271} | U+2260 | |
\simeq | U+2243 | ||
\simeq | U+2252 | ||
\infty | {/Symbol \245} | U+221E | |
右矢印 | {/Symbol \256} | U+2192 | |
ブラックサークル | {/ZapfDingbats \154} | U+25CF | |
黒い星 | {/ZapfDingbats \110} | U+2605 | |
\vec | U+20D7 | 他の文字と組み合わせて使う | |
\hat | U+0302 | 他の文字と組み合わせて使う | |
\tilde | U+0303 | 他の文字と組み合わせて使う | |
\bar | U+0304 | 他の文字と組み合わせて使う | |
\dot | U+0307 | 他の文字と組み合わせて使う |
指定したフォントでの記号が欲しければ、ギリシャ文字を直接入れたとの同じ要領でまず直接入力を試みる(キーバインドとかを駆使すれば結構これでもいける。)
ダメなら、Unicodeのコードポイントを直接入れる。Gnuplotにはcodepointに対応するために処方が用意されている。やや不恰好なscriptになるが、甘んじて\U+02243
と打つ。
Postscriptのやつでよければ(それでもなんとも言えないscriptだが){/Symbol \n}
で入れる。
なお使用するフォントに欲しい記号がない場合は存在するPostscriptフォントで代替されるようだ。その結果を見て受け入れられるかチェックするしかない。欲しい記号が全て揃った最強のフォントを無限時間かけて探すより、Postscriptの記号で妥協した方が賢明に思える。
- 指数表記の-2000を書きたい($-2\times10^3$)
-2{/Symbol \264}10^{3} , {\55}2{\U+00D7}10^{3}
- $\dot{\gamma}$などの上付のアクセント記号
{γ\U+0307} , ...
- 線分ABを表す記号
{A\U+035E}B
Enhanced modeでできることについては
Syntax for postscript enhanced option
Enhanced postscript
なども参照のこと
Unicodeのcode pointを調べるならUnicode キャラクター図鑑などがある。
またgnuplotの面白いdemoも一読に値する。
参考
全体
fc-list
の使い方は
-
ここは仕様をよく確認したわけではないので、いくつか実験してみた結果である ↩