Aquamacs

一緒に研究しているドイツ人が初めての Emacs として Aquamacs を使い始めたので、いろいろ聞いてくるだろうから、しばらく Aquamacs を使ってみる事に。いろいろカスタマイズされていておもしろい。ここはそのメモを書く場所。(ブログの日付に関係なく随時更新。)

  • Aquamacs が用意しているデフォルトの設定ファイルの場所
Aquamacs.app/Contents/Resources/lisp/aquamacs/
  • ユーザーの初期設定ファイルの場所
~/Library/Preferences/Aquamacs Emacs/Preferences.el
  • Recent Files.el や minibuffer-history.el などが初期設定ファイルと同じ場所にある。Emacs を一度終了しても、Find file の履歴や M-x ... の履歴を覚えてくれているのは目から鱗。わざわざ aquamacs-find-file を用意している。
  • 前回のウインドウの位置を勝手に覚えてくれる。
~/Library/Preferences/Aquamacs Emacs/frame-positions.el
  • Ctrl-; に割り当てられている toggle-mac-option-modifier もなるほど!という感じ。OSX はアクセント記号付きのアルファベットなどの入力で option キーを使うけど、そうすると Metaキーがなくなる。 実際自分はあきらめて Ctrl-[ または esc を使っていたけど、これは Metaキーではない。トグルで切り替えればよかったのか。Aquamacs は各種キーボード配列にあわせた設定が用意されている。Options メニューに項目がある。
  • フルスクリーン。シフト+コマンド+リターンで、フルスクリーンのトグル (aquamacs-toggle-full-frame)
  • タブの切り替えはコマンド+{ or コマンド+}
  • 日本語の入力関係については、そのままの状態でことえりでの基本的な入力はできる。でも、ことえりのショートカットなどが使えないみたい。

OSX の Mail.app の宛先アドレスの候補を編集

同じ人から複数のメールアドレスでメールを受け取って返信をすると、Mail.app がそれらのメールアドレスを覚えてしまう。そうすると、名前からアドレスを補完入力したときに、アルファベット順などでメインでないアドレスが最初に候補に出てきて、そちらに送信してしまうことがある。このような状況になった場合は

「ウインドウ」メニューの「宛先の履歴」で必要のないアドレスを「リストから取り除く」

としておけば良い。
(備忘録)

Stokesian Dynamics のレビュー記事から(2)

更新: 2011-02-19 に文章を修正。

2001年の物性研究に掲載された市來さんのレビュー

Twitter市來健吾さんに質問をして、その回答を頂いた事への反応で、前のエントリーの続きです。(新たに書く時は別エントリーの方が追記をしていくよりもいいのかな?)

.@ryseto さんへの返事1)やばい、早速、切り返された、しかも『レビューの英語版を予定されている』ってプレッシャー付きだ(^^;)

プレッシャーなんて(^^)、楽しみにしています!!

『ここでの res 形式は、粒子 1 の速度を各粒子に働く力の線形結合で表現するという意味ですよね?これは「粒子間の力を重ね合わせて」ですか?』の「粒子 1 の速度を」が、ちょっと分からないです。

書いている時に勘違いしてしまいました。resistance 形式はある粒子へ働く力を、自分や他の粒子の速度について重ね合わせる事でしたね。

ここは、ぼくのイメージしているものと、書いたことばにギャップがあるかも。ぼくの頭はlubを想定してて(自己部分は除いてあって)粒子1の力へのlubの寄与は、1−2間のlub+1−3間のlub+…と、重ね合わせになってる、かな。

行列表現でも、主要項がどうやって構成されるのかというイメージを持つ事が大切なのですね。私の中では重ね合わせるイメージが、自らの速度だけが主要項な
F_1 = - R U_1+C_{2}U_2+C_{3}U_3+\cdots
でした。(ここでは粒子 1 が受ける力を F_1 と書いています。
2 体力は、2 粒子間の相対速度に依存する lubrication 力を重ね合わせていくということなんですね。
F_1 = F_{11} + F_{12} + F_{13} + \cdots = - R U_1 - C_{12}(U_1-U_2) - C_{13}(U_1-U_3)+\cdots
という見方が欠落していました。
接近している2粒子の相対速度が大きい時ほど強い2体力が働きます。
「高濃度」ではこの2粒子間の相対速度からの寄与が大きく、この展開形式が「よい結果を与える」という事なのですね。

速度場の多重極展開では、Stokes 方程式の線形性を根拠に、各粒子の表面が流体に及ぼす力を重ね合わせる事で、ある場所の速度が他の粒子やそこにある粒子にどのように乱されるかを表現するのですね。(これは抽象的で、Stokes抵抗やlubrication力のような具体的なイメージが掴み難いですね。高濃度での破綻は、lubrication力という変化が速くなる所を扱えない事以外に、流体場の方程式が線形だとしても、粒子の存在によって流体場が穴だらけになり、単純な重ね合わせで書けないのではと思っています → そうすると、高濃度での多体効果が本当にうまく取り込めているのかという疑問が生じますね。[その方向での研究が進行中です...])

『コロイド凝集体のように粒子間の相対速度が小さく粒子が接近している場合はどうでしょうか?』ぼくは、ここは面白いポイントだと思っている。原因と結果があって、相対速度を小さくしている原因は、動かないようにホールドする力があるはずだと。

Bossis(1991) に、force-free な凝集した粒子と、接触している粒子が cohesive に結合した rigid な凝集体の2つを比較していますよね。SD の面白さはやはり前者なんですよね。Wagner&Brady(2009) も、Shear thickening の原因をこの lubrication 力によって一度密な部分が形成されると固まりは早い変形に対して抵抗するという話ですね。
ただ、私が気にしているのは後者です。極端な場合として、完全に rigid に結合した凝集体の場合、どの粒子間の相対速度も 0 です。imposed flow が無い時はもちろん力がゼロでちゃんと正解ですが、imposed flow がある時にある粒子にかかる力は、流れが各粒子にどのように disturb されるかを重ね合わせて見積もる必要があります。(大きい凝集体に対して2体厳密解を使う時、imposed flow が粒子に邪魔されて凝集体の内部まで到達しない場合も、内部の2体に対して乱されていない imposed flow を含んだ2体厳密解を使うのでエラーが紛れ込みますね。)

『多体問題を res 形式で多重極展開するという試みでうまくいったケースはない』は、多重極展開はまず2体で考えるとして、res形式のそれって応力場を何らかのソースで展開するのかな。積分方程式の定式化で一重層と二重層って話はあるけど、よく分からない

一度、2体力の重ね合わせのイメージが掴めてからだと、変な質問だったと感じます。

のんびり日記に書いてる余裕がなかったので、ひたすらツイートにて断片的な返事でした。時間をおいてまとめたらいいかも。そうだ「古典的な論文の解説」の方にJeffrey-Onishiを入れておこう。あれはそれまでのまとめであり、骨のあるいい論文だ。

忙しい中ありがとうございました。市來さんにこうやって質問する機会があり嬉しいです。

Stokesian Dynamics のレビュー記事から

2001年の物性研究に掲載された市來さんのレビュー

市來さんがブログに、物性研究に掲載されたStokesian Dynamicsレビューの英語版を予定されているとの事だったので、気になっていた事をツイッター経由で質問してみた。

レビュー記事について質問があります。mob形式とres形式は前者が希薄、後者が高濃度が得意とはどういう事でしょうか?両者とも、多重極展開なら希薄で良くなると思うのですが。

これは Stokesian Dynamics が登場する経緯についての一節から。

1980 年代、高濃度 suspension の振舞を数値的に計算しようという機運が高まっていた。しかし Brownian dynamics は、そのたたいて気な抵抗力が特に粒子濃度が高い場合に singular な振舞を引き起こしてしまう事が知られていた。この状況で Brady & Bossis (1984,1985)[14,15] はどうすればこの粘性抵抗を 2 体相互作用の重ね合わせでうまく表現できるかを模索した。 Stokes 問題の線形性から選択肢は必然的に mobility 形式、つまり速度を重ね合わせで表現するか、あるいは resistance 形式、つまり力を重ね合わせで表現するかのいずれかであった。経験的に、mobility 形式は希薄な極限でよい近似であり、resistance 形式は高濃度でよい結果を与える事は知られていた。こうした混乱した状況は Stokesian Dynamics 法 [16] の出現により解決された。

そして早速回答を頂いた(約10年前に書かれたものを、原稿も見ずにすぐに反応できるなんてすごい!)

まず、多重局展開は(ぼくが記事で書いてるものは)速度場に関するもので、必然的にmob形式(だけ)ということになります。

行列の形で多体問題を表現する方法として、 mobility形式と resistance形式があります。これらは、当然、等価なものの、別の表現です。

道具として使おうとしている自分にとっては、線形な Stokes 方程式から出発した帰結として各粒子へのドラッグ力と各粒子の速度の関係が線形結合が与えられているので、mob形式とres形式の両者が等価という意識が強かったです。

これらの問題、あるいはmob行列やres行列の具体的な形を計算するのは、多体問題なので、大変なので、簡単に計算したいということで、2体近似の重ね合わせで何とかならないか、というのが、ここの部分での(歴史的な解説としての)話です。

当該部分の「mob形式」という言葉は、したがって、速度場の多重局展開から、粒子の disturbance の影響が別の粒子に及ぼす影響を取り入れる、という意味の2体効果が入った「mob形式」というのが、正確な意味です。

まさにこの具体的な導出の違いから両者を区別するという意識が抜けていました。

当然、これは希薄な極限で(のみ)正確になるものです。一方の「res形式」と言っているのは、粒子間の力を重ね合わせて表現する、というナイーブな状況をイメージしてもらうといいです。ふつうの粒子法(MDとかDEMとか)がやってることです。

ここは少し引っかかります。一般的な粒子の運動方程式を解く問題の相互作用は、確かに 2 体間力ですが、粒子 1 と粒子 2 の間に働く力 F_{12}、粒子 1 と粒子 3 の間に働く力 F_{13} など 2 体間力を足し合わせて合力として粒子 1 に働く力が得られ、それから運動が決まります。しかし、ここでの res 形式は、 粒子 1 の速度を各粒子に働く力の線形結合で表現するという意味ですよね?(修正:2011-02-14T22:45:02+09:00→)粒子 1 に働く力を各粒子の速度の線形結合で表現するという意味ですよね?これは「粒子間の力を重ね合わせて」ですか?(追記:書く時に勘違いしていました。今とっさに修正しましたが、後でゆっくり考えてこの部分再度質問してみます。)

Stokes flowの場合(も)、粒子が接近した場合、力が特異になる(とびぬけて大きくなる)ので、その寄与が支配的になり、その部分だけとりこめば、結構正確な記述ができます。そう言う意味で、「res形式」は粒子濃度の高い場合に正確な記述と成ります。

記事での表現は「mobility 形式は希薄な極限でよい近似」と「resistance 形式は高濃度で良い結果を与える」と「近似」と「よい結果を与える」の2つを使い分けられていたのですね。「寄与が支配的」という意味がわかりました。(コロイド凝集体のように粒子間の相対速度が小さく粒子が接近している場合はどうでしょうか?)

「res形式」の具体的なものは、2体の厳密解のres表現のこと、物理的には lubrication の寄与(力の特異な部分)ということになります。

「res形式」の多重局展開はないのか?という問いは、意味があるかな?Jeffrey-Onishiの厳密解は(resもmobも) 1/r 展開になっているので、その意味で、低次の打ち切りでは、希薄極限でのみ正しい「res形式」ってのも有りますね。

ここで2体の1/r 展開の打ち切りを例に出されたという事は、多体問題を res 形式で多重極展開するという試みでうまくいったケースはないのですね。

Stokesian Dynamics の魔法のようなトリックの、簡単な種明かしをしようと、変に言葉を切りすぎた表現に成っていたかも知れないですね。でも、以上のような状況だ、ということです。また、どんどん鋭い質問、してください。(と、ここまで約15分 10:36)

質問はいつも勘違いからですから決して鋭くないです。むしろ恥をかく事の方が多いですが、自分にとって勉強になるのでこういう機会はありがたいです。今回も、「2 体相互作用の重ね合わせ」の模索について知らなかったため意識に残らず、その後の「系経験的に」以降を一般論として読み違えての質問でした。

とりあえず関数に(Cocoa Emacs のフォント)


Emacs Lisp の素人だからちゃんとしたものは書けないけど、とりあえず「こういう事ができます」のエントリー。日本語を必要としない場合は set-frame-font でインタラクティブにフォントを変更できる。日本語と英字フォントを設定するそういう関数を書いてみた。アルファベット表記のフォントファミリー名で設定する。もしこういう関数を用意しておけば、初期設定ファイルでのフォント設定は次の1行で終わり。

(when window-system
  (set-font-ascii_japanese "Menlo" "Hiragino Maru Gothic ProN" "14")
)

初期設定だけではなく、インタラクティブに M-x set-font-ascii_japanese と使う事もできる。

関数の定義は以下の通り。一応動作するけど未完成版。

(defun set-font-ascii_japanese (ascii-font-family jp-font-family size)
  "フレーム上の英字フォントと日本語フォントをASCII-FONT-FAMILY と JP-FONT-FAMILY に
設定する(フォントはファミリー名で指定)。英字フォントのサイズを SIZE に設定する。"
  (interactive
   (let* ((completion-ignore-case t)
	  (af (completing-read "ascii font: "
			       '("Menlo" 
				 "Monaco"
				 "Courier")))
	  (jf (completing-read "japanese font: "
			       '("Hiragino Maru Gothic ProN" 
				 "Hiragino Kaku Gothic ProN"
				 "Hiragino Mincho ProN"
				 "Osaka")))
	  (si (completing-read "size: " nil)))
     (list af jf si)))
  (let* ((h (* (string-to-number size) 10))
	 (fontspec (if (string= ascii-font-family "") nil
		     (font-spec :family ascii-font-family)))
	 (jp-fontspec (if (string= jp-font-family "") nil
			(font-spec :family jp-font-family))))
    (if (and fontspec jp-fontspec)
	(progn
	  (if (eq h 0) (setq h 140))
	  (set-face-attribute 'default nil :family ascii-font-family :height h)
	  (set-fontset-font nil 'japanese-jisx0213.2004-1 jp-fontspec)
	  (set-fontset-font nil 'japanese-jisx0213-2 jp-fontspec)
	  (set-fontset-font nil 'katakana-jisx0201 jp-fontspec) ; 半角カナ
	  (set-fontset-font nil '(#x0370 . #x03FF) fontspec) ; ギリシャ文字
	  (set-fontset-font nil '(#x0080 . #x024F) fontspec) ; 分音符付きラテン
        ))))

(dolist (elt '(("^-apple-hiragino.*" . 1.2)
		 (".*osaka-bold.*" . 1.2)
		 (".*osaka-medium.*" . 1.2)
		 (".*courier-bold-.*-mac-roman" . 1.0)
		 (".*monaco cy-bold-.*-mac-cyrillic" . 0.9)
		 (".*monaco-bold-.*-mac-roman" . 0.9)))
    (add-to-list 'face-font-rescale-alist elt))

まだ何か不備がありそうだけど、こういう感じの関数を完成させればいいかな。

途中でフォントを変えたい場合には、やはりターゲットを日本語に指定してappend を使わずに、set-fontset-fontする必要があった。

Cocoa Emacs のフォント設定について

随時更新(最終更新:2012年3月28日)

書き散らかしている状態なので、ややこしく見えるかもしれないけどそんな事無いです。最終的には MacEmacs Wikiにできるだけ簡潔にかきます。

概要

フォント設定のスタンダードな方法は、初期フレームとそれ以降のフレームのフレームパラメータのデフォルト値を指定する連想リスト default-frame-alist でフォントを指定すること。日本語を使う場合は、複数のフォントを使い分けるためフォントセットを指定する。設定例(1)はその方針。もう1つ別の方法があり、フレームのフォントを set-face-attribute という関数を使って変更する。これもフォントセットが自動的に作られて、それを後で調整する。それが設定例(2)。いずれの方法でも、最終的にはフレームのフェイスに対して1つのフォントセットが選ばれた状態になる。

現在の Emacs 23.2 では、例(1)の方法だと初期画面を抑制したときにフォントが正しく設定されないバグがある。対処法としては、(text-scale-increase が動作しなくても気にならなければ)font-spec オブジェクトを作る時にサイズを指定する方法か、または初期設定ファイルの中で set-face-font を使ってフェイスのフォントを一度指定するという方法がある。このバグがなければ、例(2)より例(1)のほうが正しい方針だと思う。(Emacs 24.0.50で確認したところ、上の対処をしなくても動作する。でも不必要なフォントセットが生成されているのが気になる。)

方針

  • Emacs 23.2 (Cocoa Emacs)で適切な方法でフォントを設定する
  • 日本語と半角英数混在で等幅 (ascii : 日本語 = 1 : 2)
  • 日本語フォントもASCIIフォントもファミリー名で指定

使う関数

  • create-fontset-from-ascii-font : 1つのASCIIフォントをベースに新しいフォントセットを作る。その中で関数 new-fontset が呼ばれる。
  • set-face-attribute :フレーム上の(通常のテキスト領域やモードラインなど)フェイスの属性を設定する関数。
  • set-fontset-font : フォントセットを調整する関数。指定したターゲット(範囲や文字セット名)に対して、使うフォントを設定する(ターゲットが重なる時は、後の設定で上書きされるので注意)。フォントを指定する方法はいろいろある。
    • font-spec によって作った font-spec オブジェクト
    • (フォントファミリー名 . フォントレジストリ名) というコンスセル(cons)。
    • フォント名文字列
    • nil とすることで、あるターゲットに対してフォントの割当がないことを明示する。
  • font-spec: ファミリー名やその他の属性から、font-spec オブジェクトを作る関数。

言葉の説明

  • fontset フォントセット:いろんな種類の文字を扱うためのフォントの集合。名前は "-apple-menlo-medium-normal-normal-*-*-150-*-*-m-0-fontset-myfontset" といった感じ。名前の末尾がdefaultとstandardとstartupという3つのフォントセットは最初から用意されている。英字フォントしか使わない場合でも、フレームのデフォルトフェースはあるフォントセットに対応付けられている。(face-attribute 'default :fontset) を評価することで確認できる。
  • フレーム
  • フェイス

設定例 (1)「default-frame のフォントを設定」

  • 新たにフォントセットを作り default-frame-alist のフォントで、そのフォントセットを指定する方針。
  • フォントセットは create-fontset-from-ascii-font を使って作る。
  • フォントの指定はファミリー名から font-spec オブジェクトを作ってする。

設定例 (2) 「フレームのフォントを指定」

  • 関数 set-face-attribute を使いフレームのデフォルトフェイス(←通常のテキスト領域)のフォント変更する。
  • すると名前の末尾が auto1, auto2 となるフォントセットが自動生成され、現在のフレームのフォントセットに設定される。(auto1 は12ptのフォントで、それ以外のサイズを指定すると auto2 も作られる。)
  • set-face-attribute の第2引数は、nil なら全てのフレームの属性(attribute)を変更する。t なら、新しいフレームのためのデフォルトを変更する。起動時からのフォントを変更するには nil
  • set-fontset-font の第1引数は、フォントセットの名前だけど、nil ならフレームのフォントセットを、 t ならデフォルトのフォントセットになる。(set-face-attribute と同じように「フレーム」は「全てのフレーム」を意味しているようだ。)
  • default-frame-alist でフォントを指定していない場合、新しくフレームを作った時のフォントは set-face-attribute の設定に従う。(ちなみに set-frame-font で現在のフレームのフォントを設定しても、新しいフレームはそれに従わない。)
  • フォントの指定はファミリー名から font-spec オブジェクトを作ってする。

フォント関連のコマンド

  • 現在のフレームに設定されているフォントセットは (face-attribute 'default :fontset) を評価(C-x C-e)すればみれる。
  • (frame-parameters) を評価(C-x C-e)すれば、フレームパラメータがみれる。
  • フォントリストの一覧は M-x list-fontsets
  • M-x set-default-font はフレームのフォントを変更できるが、「This function is obsolete since 23.1」らしい。かわりに、set-frame-font を使うように指示されている。
  • M-x set-frame-font はインタラクティブに、現在のフレームのフォントを変更できる。
  • M-x set-face-font はインタラクティブに、Face のフォントを変えられる。Face を default にすると編集領域に。modeline のフォントなども変えられる。

メモ

  • 関数 font-spec を使った方法が紹介されているのは、そこでサイズを指定するため。rescale するなら、単純にフォント名ストリングでいいはず。
  • でも、フォント名≠フォントのファミリー名だから、やはり font-spec オブジェクトをファミリー名から作った方が確実?正しいフォント名の文字列はXFLDという記述法?
  • ヒラギノ角ゴ W6(太字)などを設定したい場合は、 set-fontset-fontの3つ目の引数を font-spec オブジェクトにして、そこで属性を指定すればできた。
;;ヒラギノ角ゴ ProN W6
(font-spec :family "Hiragino Kaku Gothic ProN" :weight 'bold)
;;ヒラギノ角ゴ StdN W8
(font-spec :family "Hiragino Kaku Gothic StdN" :weight 'bold)
  • face-font-rescale-alist はこちらを参考にした。
  • unicode 全域の文字セットにヒラギノを割り当てる方法は楽だけど、過去の方法をみると日本語関連の文字セットを1つ1つ割り当てているものが多いのでその方法に従う。使うところだけ指定する形。
  • 日本語の文字セットで jisx0208, jisx0212, jisx0213-1, jisx0213-2を全部指定していたけど重複があったみたい。ヒラギノは字数も多いのでjisx0213を指定したほうが良いかな(?)
  • いずれの方法も、(size, asciifont, jpfont) の3つの引数にまとまってきたけど関数にするべき?それはそれで柔軟性がなくなる?(追記:とりあえず書いてみた
  • 過去のメーリングリストで、こういうやりとりを発見(^^;) http://lists.gnu.org/archive/html/emacs-devel/2009-03/msg00191.html
  • フォントのファミリー名「ヒラギノ角ゴ ProN」を使っても大丈夫なはずだけど、コメントアウト用のフェイス(斜体)で等幅にならなかった。(これはただのバグかもしれない)
  • LaTeXコマンド毎にフェイスを使い分けるAUCTeXモードで、日英文字混在で等幅になるサイズ比が崩れた。(自分は YaTeX ユーザなので AUCTeX の設定の仕方が悪いのかもしれないけど)

  • face-font-rescale-alist で日英混在等幅になるのは、全てのサイズではなかったみたい。ちゃんと確認していなかった。Menloとヒラギノで実際に試したところ、次のサイズなら大丈夫だった。9pt, 10pt, 12pt, 14pt, 15pt, 17pt, 19pt, 20pt。
  • buffer-face-mode についての紹介があった。つまりモード毎に使うフォントを指定できる?(追記:2011-2-8)

fontset.c のコメントを転載

A fontset is a collection of font related information to give similar appearance (style, etc) of characters. A fontset has two roles. One is to use for the frame parameter `font' as if it is an ASCII font. In that case, Emacs uses the font specified for `ascii' script for the frame's default font.

Another role, the more important one, is to provide information about which font to use for each non-ASCII character.

There are two kinds of fontsets; base and realized. A base fontset is created by `new-fontset' from Emacs Lisp explicitly. A realized fontset is created implicitly when a face is realized for ASCII characters. A face is also realized for non-ASCII characters based on an ASCII face. All of non-ASCII faces based on the same ASCII face share the same realized fontset.

A fontset object is implemented by a char-table whose default value and parent are always nil.

An element of a base fontset is a vector of FONT-DEFs which itself is a vector [ FONT-SPEC ENCODING REPERTORY ].

An element of a realized fontset is nil, t, 0, or a vector of this form:

        [ CHARSET-ORDERED-LIST-TICK PREFERRED-RFONT-DEFRFONT-DEF0 RFONT-DEF1 ... ]

RFONT-DEFn (i.e. Realized FONT-DEF) has this form:

        [ FACE-ID FONT-DEF FONT-OBJECT SORTING-SCORE ]

RFONT-DEFn are automatically reordered by the current charset priority list.

The value nil means that we have not yet generated the above vector from the base of the fontset.

The value t means that no font is available for the corresponding range of characters.

The value 0 means that no font is available for the corresponding range of characters in this fontset, but may be available in the default fontset.


A fontset has 9 extra slots.

   The 1st slot: the ID number of the fontset

   The 2nd slot:
	base: the name of the fontset
	realized: nil

   The 3rd slot:
	base: nil
	realized: the base fontset

   The 4th slot:
	base: nil
	realized: the frame that the fontset belongs to

   The 5th slot:
	base: the font name for ASCII characters
	realized: nil

   The 6th slot:
	base: nil
	realized: the ID number of a face to use for characters that
		  has no font in a realized fontset.

   The 7th slot:
	base: nil
	realized: Alist of font index vs the corresponding repertory
	char-table.

   The 8th slot:
	base: nil
	realized: If the base is not the default fontset, a fontset
	realized from the default fontset, else nil.

   The 9th slot:
	base: Same as element value (but for fallback fonts).
	realized: Likewise.

All fontsets are recorded in the vector Vfontset_table.

DEFAULT FONTSET

There's a special base fontset named `default fontset' which defines the default font specifications. When a base fontset doesn't specify a font for a specific character, the corresponding value in the default fontset is used.

The parent of a realized fontset created for such a face that has no fontset is the default fontset.

These structures are hidden from the other codes than this file. The other codes handle fontsets only by their ID numbers. They usually use the variable name `fontset' for IDs. But, in this file, we always use varialbe name `id' for IDs, and name `fontset' for an actual fontset object, i.e., char-table.


変更履歴とその説明

  • 2012年3月28日: 設定例をgithub に置いた。
  • 4月4日: 設定例2のset-fontset-fontのところに分音符付きラテンを追加した。
  • 2月15日: 半角カナの文字セットを指定。(masutaka26 さんに教えていただいた)
  • 2月11日: フォントサイズの比を設定するときに add-to-list を使うように変更した。
  • 2月10日: fontset.c のコメントを転載を追加。いつも「C-h f」や「C-h v」で lisp のところまでは見に行くけど、C のコードまでは見ていなかった。
  • 2月8日: buffer-face-mode を紹介したブログをリンク
  • 2月4日: 設定例(1)と(2)の表現や順番を揃えた。
  • 2月3日: 任意サイズで等幅になるわけではないことに気がつき、大丈夫なサイズを書き加えた。
  • 2月1日: ファミリー名で日本語名を使った場合の不具合をメモの所に書いた
  • 1月25日: 設定例(1)を修正。あと、起動時のバグへの対処法として set-face-font を使った。これはバグが直れば必要ないはず。
  • 1月24日: 設定例(1) のミスを修正。概要の後半で default-frame-alist が無いときの挙動を勘違いしていたので削除。(だいたい様子は分かってきたつもりだけど、なかなか収束しない...)
  • 1月24日: 概要の文を修正。
  • 1月23日: 概要を追加。
  • 1月22日: フォントの設定を繰り返す時、set-fontset-font の所を append で設定していると前の設定を書き換える事ができないので、ターゲットを日本語の文字セットにして、append は使わないようにした。
  • 1月22日: 分音符付きラテンをアスキー文字用フォントに指定していたところは、set-face-attribute を使う場合は設定されているので必要なかった。create-fontset-from-ascii-font は ascii 文字のフォントしか設定しないので必要。
  • 2011年1月22日: 日本語の文字セットについて理解せずに、とりあえずもれのないようにと jisx0208, jisx0212, jisx0213 を設定したけどただの重複だった。いろいろ試して、最終的にsakitoさんが紹介されていた unicode を append で設定するほうが一番確実と判断した。

Cocoa Emacs フォントセット設定で不可解な現象

追記

2011-2-20 半田さんから対処し「Emacs の Bazaar レポジトリの emacs-23 branch」に commit したとの連絡を頂きました。私は締め切りが近い書類を提出後に試す予定です。
2011-2-22 確認しましたが、この問題はまだ直っていないようです。

本文

なぜか、inhibit-startup-message を t にして、face-font-rescale-alist を与え、background-color を default-frame-alist に加える、という3つの組み合わせでフォントの設定ができなくなる。background-color ではなく、foreground-colorだと大丈夫。inhibit-startup-messageをnilにするだけでも大丈夫。すごい謎。

(setq inhibit-startup-message t)
(create-fontset-from-ascii-font
 "Menlo-14:weight=normal:slant=normal" nil "menlomarugo")
(set-fontset-font "fontset-menlomarugo"
		  'unicode
		  (font-spec :family "Hiragino Maru Gothic ProN")
		  nil
		  'append)
(setq face-font-rescale-alist '((".*Hiragino.*" . 1.2)
				(".*Menlo.*" . 1.0)))
(add-to-list 'default-frame-alist '(font . "fontset-menlomarugo"))
(add-to-list 'default-frame-alist '(background-color . "white"))

Emacs は、OSX Workshop 10.6から。

GNU Emacs 23.2.1 (x86_64-apple-darwin10, NS apple-appkit-1038.35) of 2011-01-12 on MacProE2008 - MacOS X WorkShop - 10.6 

追記

;; 
;; フォントセットを作り、デフォルトフレームのパラメータに追加する
(let* ((fontset-name "myfonts") 
       (size 14)
       (asciifont "Monaco")
       (font (format "%s-%d:weight=normal:slant=normal" asciifont size)))
  (create-fontset-from-ascii-font font nil fontset-name))
(add-to-list 'default-frame-alist '(font . "fontset-myfonts"))
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 以下の3つの設定のいずれかを外すと、
;; Emacs 起動時のフレームにフォントセットが正しく設定される。
;;;;
;;(1)
(setq inhibit-startup-screen t)
;;(2)
(add-to-list 'default-frame-alist '(background-color . "FloralWhite"))
;;(3)
(setq face-font-rescale-alist
	'(("^-apple-hiragino.*" . 1.2)
	  (".*osaka-bold.*" . 1.2)
	  (".*osaka-medium.*" . 1.2)
	  (".*courier-bold-.*-mac-roman" . 1.0)
	  (".*monaco cy-bold-.*-mac-cyrillic" . 0.9)
	  (".*monaco-bold-.*-mac-roman" . 0.9)
	  ("-cdac$" . 1.3)))
;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;正しい動作 (上の3つの設定の何れかを外した場合)
;;(face-attribute 'default :fontset)
;;"-apple-monaco-medium-normal-normal-*-*-140-*-*-m-0-fontset-myfonts"
;;M-x list-fontsets の結果
;; Fontset: -*-*-*-*-*-*-*-*-*-*-*-*-fontset-default
;; Fontset: -apple-monaco-medium-normal-normal-*-*-140-*-*-m-0-fontset-myfonts
;; Fontset: -ns-*-*-*-*-*-10-*-*-*-*-*-fontset-standard
;; Fontset: -apple-Monaco-medium-normal-normal-*-*-*-*-*-m-0-fontset-startup
;; 
;; Emacs 23.2 で3つの設定を有効にした場合
;;(face-attribute 'default :fontset)
;;"-apple-Monaco-medium-normal-normal-*-14-*-*-*-m-0-fontset-auto2"
;;M-x list-fontsets の結果
;; Fontset: -apple-Times_New_Roman-medium-normal-normal-*-12-*-*-*-p-0-fontset-auto1
;; Fontset: -apple-Monaco-medium-normal-normal-*-14-*-*-*-m-0-fontset-auto2
;; Fontset: -*-*-*-*-*-*-*-*-*-*-*-*-fontset-default
;; Fontset: -apple-monaco-medium-normal-normal-*-*-140-*-*-m-0-fontset-myfonts
;; Fontset: -ns-*-*-*-*-*-10-*-*-*-*-*-fontset-standard
;; Fontset: -apple-Monaco-medium-normal-normal-*-*-*-*-*-m-0-fontset-startup
;;
;; Emacs 24.0.50 で3つの設定を有効にした場合
;;(face-attribute 'default :fontset)
;;"-apple-monaco-medium-normal-normal-*-*-140-*-*-m-0-fontset-myfonts"
;;M-x list-fontsets の結果
;; Fontset: -apple-Times_New_Roman-medium-normal-normal-*-12-*-*-*-p-0-fontset-auto1
;; Fontset: -*-*-*-*-*-*-*-*-*-*-*-*-fontset-default
;; Fontset: -apple-monaco-medium-normal-normal-*-*-140-*-*-m-0-fontset-myfonts
;; Fontset: -ns-*-*-*-*-*-10-*-*-*-*-*-fontset-standard
;; Fontset: -apple-Monaco-medium-normal-normal-*-*-*-*-*-m-0-fontset-startup