2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-04-28

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ではキーボードから直接ギリシャ文字やその他が入力できる。

参考(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に対応する文字を呼ぶというものがある。{/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

font2.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
Enhanced postscript
なども参照のこと

Unicodeのcode pointを調べるならUnicode キャラクター図鑑などがある。
またgnuplotの面白いdemoも一読に値する。

参考

全体

fc-listの使い方は

  1. ここは仕様をよく確認したわけではないので、いくつか実験してみた結果である

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?