Monthly Archives: 9月 2017

2017-09-26

Emacs 25.2以降でASCIIと日本語のフォントを別々に設定する(一部の記号のフォントが変更できない場合)

最近Emacs 25.3へ変えたら一部の記号(○や※等)が正しく表示されなくなったのですが、結論から言うと use-default-font-for-symbols を使えということでした。

以前次のような設定で解決したと思ったのですが、最近Emacs 25.3へ変えたら一部の記号だけASCII用のフォントで表示されてしまいました。

(progn
  (set-face-attribute 'default nil :family "Inconsolata" :height 120)
  (set-fontset-font nil 'cp932 (font-spec :family "MS Gothic")))

emacs-25ブランチへの最近の変更を見てみましたがそれらしい変更点は見つけられず。元々以前の時も何が原因なのか分からずじまいだったので、たまたまうまく行っていただけだったのかもしれません。

不思議なのは一部の記号(○や※)がASCIIのみに対するフォント設定に影響されてしまうことです。上の設定をした後で各文字でどのフォントが選ばれるか試してみました。

(face-font 'default nil ?○);;=>"-outline-Inconsolata-normal-normal-normal-mono-16-*-*-*-p-*-iso8859-1"
(face-font 'default nil ?×);;=>"-outline-MS ゴシック-normal-normal-normal-mono-16-*-*-*-c-*-iso8859-1"
(face-font 'default nil ?あ);;=>"-outline-MS ゴシック-normal-normal-normal-mono-16-*-*-*-c-*-iso8859-1"

「○△□☆…∵→」あたりの記号でASCII用のフォントが使われてしまいます。describe-charで各文字を確認してみましたが、おかしくなるものに共通するのは「script: Symbol」であることくらいでしょうか。

「○」のフォントを次のようにして強制的に設定してみました。

(set-fontset-font "fontset-default" ?○ (font-spec :family "MS Gothic") nil 'prepend)

describe-fontsetで確認するとちゃんと#x25cbのフォントはMS Gothicになっています。でもなぜかMS Gothicが選ばれません。

仕方ないのでソースコードを追うことに。

  1. face-font 関数はxfaces.cにある。 FACE_FOR_CHAR がcharacterに応じてfaceを割り出している部分っぽい。
  2. FACE_FOR_CHAR はdispextern.hにあって HAVE_WINDOW_SYSTEM ならそのまま face_for_char 関数を呼び出す。
  3. face_for_char 関数はfontset.cにある。んん? 冒頭に use_default_font_for_symbols なんてものがある。同ファイルの上の方で use-default-font-for-symbols という変数を定義している。

use-default-font-for-symbols の説明を読む。

use-default-font-for-symbols is a variable defined in ‘C source code’.

Its value is t

Documentation:

If non-nil, use the default face’s font for symbols and punctuation.

By default, Emacs will try to use the default face’s font for displaying symbol and punctuation characters, disregarding the fontsets, if the default font can display the character. Set this to nil to make Emacs honor the fontsets instead.

「non-nilのとき記号や区切り文字にfaceのデフォルトフォントを使用します」……だって!?

試しに (setq use-default-font-for-symbols nil) にしたら全てが解決しました。なんてこった……。

というわけで最終的に次のようにしたらうまくいきました。

;; デフォルトはASCII用のフォントでなければダメっぽい。
(set-face-attribute 'default nil :family "Inconsolata" :height 120)
;; ASCII以外のUnicodeコードポイント全部を一括で設定する。他国語を使用する人は細かく指定した方が良いかも。
(set-fontset-font nil '(#x80 . #x10ffff) (font-spec :family "MS Gothic"))
;; 記号をデフォルトのフォントにしない。(for Emacs 25.2)
(setq use-default-font-for-symbols nil)

なんでこんなことになってるんでしょうね。一貫性があったfontsetの挙動に対して、一部の文字種を特別扱いする筋の悪いやり方に見えますが。

Emacs25でSymbolをデフォルトフォントで表示するように変更されたみたいなのですが、Emacs 25.2になって従来(Emacs24)と同じ挙動が出来るように use-default-font-for-symbols が追加されたみたいです。

Improve font selection for punctuation and other symbols · emacs-mirror/emacs@e070728
Emacs25でフォントの選択が 改良 されたコミット。
Use another font for some characters
set-fontset-fontが効かなくて困るよという話。
bug#24644: 26.0.50; Emacs 25: set-fontset-font does not take effect with
set-fontset-fontが効かなくて困るよという話。
Allow selection of font for symbols as in Emacs 24.x · emacs-mirror/emacs@4ff4b66
use-default-font-for-symbolsを追加したコミット。
「GNU Emacs 25.2」がリリース | OSDN Magazine
Emacs 25.2の変更点として use-default-font-for-symbols のことに触れている。

大人しく プログラミングのストレス軽減!日本語が使えるコーディングに最適なフォント7選 みたいなプログラム用フォントと日本語フォントを合成したフォントを使った方が良いのかもしれません。

(2021-07-29追記:自分でFontForgeで合成しました)

2017-09-25

ZenFone3 MAXで星空を(万座編)

ちょっと草津白根山に遊びに行ったついでに万座のホテル近くから空を撮影してみました。ZenFone3 MAXをミニ三脚で固定して撮影。ほぼ全てシャッタースピード32秒、ISO1600の設定。後からPhotoshopでレベル補正等あり。

わし座(中央やや上の斜め三つ星が目印)~いて座(中央一番下の南斗六星が目印)方面で天の川がギリギリ映っている気がします。

2017-09-25-aquila-sagittarius.jpg

夏の大三角形(左がアルタイル、右がベガ、上がデネブ)。

2017-09-25-summer-triangle.jpg

カシオペア座(おなじみのW形)。

2017-09-25-cassiopeia.jpg

下にオリオン座、上におうし座(V字を左に倒したようなのが顔)で向かい合っています。左にぎょしゃ座。上の方(おうしの背中)にはすばることプレアデス星団が映ってます。

2017-09-25-orion-taurus-auriga.jpg

秋の四辺形でおなじみのペガスス座。左カドからAの形でアンドロメダ座。

2017-09-25-pegasus.jpg

うお座。上半分くらいの領域に、Vの字を右90度回転したような形がお分かりでしょうか。

2017-09-25-pisces-cetus.jpg

こぐま座(木の少し上に北斗七星を小さくしたようなひしゃく形)、ケフェウス座、りゅう座。

2017-09-25-ursaminor-cepheus-draco.jpg

ホテルの方を撮影するとこんな感じになりました。

2017-09-25-hotel1.jpg 2017-09-25-hotel2.jpg

破線になっているのはおそらく点滅しながら飛んでいた飛行機か何かだと思います。

2017-09-25-airplane.jpg

自分で撮影するとそれが何を映したものなのか知りたくなるので星座を覚えることにつながりますね。

星座を覚えて何の意味があるんですかね。まぁ、意味なんて他の物事との関連性の中にあるものなので組み合わせ次第で無限にあって私たちに分かるのなんてその極々一部なんでしょうけれど。とりあえず星座は星の位置を特定する住所になっているそうですね。全天は星座を元にエリア分けされていて、全ての星はそのどれかに所属することになるのだとか。星の位置なんてコンピュータで扱うなら何らかの座標で表した方が楽なんでしょうけど、人間は星の並びを形で覚えているわけで何座の近くにあると言ってもらえた方が分かりやすいわけです。世界地図上の緯度経度で言われるよりもどの島(大陸)のどの国の近くと言ってもらえた方が分かりやすいのと同じです。要するに地球から見た宇宙の地図を形作る元になっているというわけですね。星座を覚えると宇宙の中での方向感覚が身につきます。公転したり自転したりしている地球の上にいる私たちが、宇宙の中で今どの方向を向いているのかイメージできるようになります。とはいえこの地図には方向はありますが距離がありません。あくまで地球から見た宇宙の図というのがポイントですね。いつの日か人類が恒星間を行き来できる日が来たならば、もっと違う地図が必要になるかもしれません。

スマホのカメラでも30秒開ければ星はそれなりに映ることが分かりました。もっと綺麗に撮れればと思いますが、これ以上は明らかに沼なのでやめておきます。

2017-09-13

ZenFone3 MAXで星空を

少し前にNexus5Xが壊れたのでZenFone3 MAXに変えたのですが、こんな記事を見かけたので試しに撮ってみました。

ZenFone 3のマニュアル撮影、32秒の長時間露光で星空を撮影する方法 : ASUS好きのZenBlog(ゼンブログ)

20170913-zenfone3-star-1.jpg 20170913-zenfone3-star-2.jpg

近所で撮影。シャッター速度32秒、ISOは明るすぎないように適当に調整。5秒のセルフタイマーにして、自転車のスマホホルダーに逆さまに置いて撮影しました。最後に見やすいようにPhotoshopでレベル補正だけ。MAXのカメラはDeluxeほど良くないので一部の設定は適用できません。

案外映りますね。というか目で見るよりよっぽど見えるや(泣)。

両方ともはくちょう座が見えてます。

周囲が少し明るかったので、またどこか山にでも行ったときに試してみたい感じ。