Gnuplotでギリシャ文字のfont変更(pdfcairo出力)

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`でヒットし、使うべきフォント名がわかる。例えば

```bash
$ 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をご覧いただきたい](http://www.gnuplot.info/demo/enhanced_utf8.html) 
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ではキーボードから直接ギリシャ文字やその他が入力できる。

参考(http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-use-special-characters-and-symbols-keyboard-shortcut-with-macos.html)

+ Mac -> alt(option) + (対応するalphabet)　(ただしshell上とかだとうまくいかないかも)
+ linux -> 要調査
+ Windows -> 要調査

なお、scriptをつくる際は***文字コードがUTF-8になってるか***どうかをよく確認する必要がある。


### では`{/Symbol a}`とはなんだったのか？

enhanced postscriptでサポートされる記法の一つである。

この記法ではテキスト中の{中括弧}が特別扱いされていて、いくつかの機能をもつ。
その中に、[PostScript Character Code](https://ayapin-film.sakura.ne.jp/Gnuplot/Docs/ps_guide.pdf)に対応する文字を呼ぶというものがある。{/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} |

```gnuplot
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
```

![font2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2646834/f66d9534-bf2f-cb4f-dd80-249f02e9e355.png)



### その他の数式用記号・文字どうするの？

この部分はあまりこだわりすぎることはお勧めしない。

| 記号   | 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](https://ayapin-film.sakura.ne.jp/Gnuplot/Docs/ps_guide.pdf)
[Enhanced postscript](http://takeno.iee.niit.ac.jp/~foo/gp-jman/data/20090907/gnuplot-ja-div/node417.html)
なども参照のこと

Unicodeのcode pointを調べるなら[Unicode キャラクター図鑑](https://unicode-table.com/jp/)などがある。
またgnuplotの[面白いdemo](http://www.gnuplot.info/demo/unicode.html)も一読に値する。



# 参考

全体

http://www.ecs.shimane-u.ac.jp/%7Estamura/gnuplot.html

https://ayapin-film.sakura.ne.jp/Gnuplot/Docs/ps_guide.pdf

`fc-list`の使い方は

http://bluearth.cocolog-nifty.com/blog/2018/05/gnuplot-with-li.html

https://atmarkit.itmedia.co.jp/ait/articles/1812/07/news021.html