正しいデストラクターを呼び出せますか?

//"sample01.cpp"
#include <stdio.h>
#include <stdlib.h>

#include <new>
#include <memory>

class Foo;

Foo *createFoo();

int main(int argc, char* argv[])
{
	Foo * f = createFoo();
	delete f;

	return 0;
}
//"sample02.cpp"
#include<stdio.h> 

class Foo
{
public:
	Foo()
	{
		fprintf(stdout, "ctor.\n");
	}

	~Foo()
	{
		fprintf(stdout, "dtor.\n");
	}
};

Foo *createFoo()
{
	return new Foo();
}

上のような感じのプログラムを書いて、いやな目にあった。上のコードだとFooのデストラクターは呼び出されない。リソースの後始末の処理とかデストラクターでしてたんだけど、それが行われなかったわけやね。
VC++(2005)は"sample01.cpp"をビルドすると警告を出すんだけど……(C4150)。他の警告に埋もれて、見落としていた。
上のコードだと、 delete が、どうオブジェクトを扱えばいいのかコンパイル時にわからんわけで、まあ、そりゃあかんのだろう。
もうすこし警告に気をつけろ……と。
そして、C++の仕様とか、もっと勉強せえってことだね……。

ちなみに"sample01.cpp"を"-Wall"オプションをつけて、g++でコンパイルしてみたら、g++も警告を出す(g++ 4.5.2)。警告のメッセージ自体が結構詳しい内容で、なるほどねーとか思った。

ただ、

//"sample01b.cpp"
#include <stdio.h>
#include <stdlib.h>

#include <new>
#include <memory>

class Foo;

Foo *createFoo();

int main(int argc, char* argv[])
{
	std::auto_ptr<Foo> f(createFoo());
	f.reset();

	return 0;
}

ってなものにすると、g++は"sample01b.cpp"に対して何も警告を出さなかったりする。……恐ろしい。VC++ 2005は警告を出した。コンパイラーによって、得意不得意がいろいろあるね。

Pimplイディオム

こういうの、Pimplイディオムっていうらしいけど(名称、知らなかった)、自分が書いたのは、Pimplイディオムの悪い書き方だと思う。つか、Fooを破棄する処理は、いつもなら"sample02.cpp"の側に書いて、"sample01.cpp"からその処理を呼ぶようにするんだけど……。今回はうっかりそう書かなかった。そしてほげった。ははは……。

余談

まどマギのタイトル改変してみたけど、あまり上手にできてないなぁ。

ILSpy

[ILSpy、Moonlight 4 (preview)、Nuget 1.1、tyr F#、等々 ≪ ++C++; // 未確認飛行 C ブログ]より)

//wiki.sharpdevelop.net/ilspy.ashx" title="ILSpy - SharpDevelop Wiki" target="_blank">[ILSpy - SharpDevelop Wiki]:開発元の公式ページ。
//community.sharpdevelop.net/blogs/christophwille/archive/2011/02/16/new-from-sharpdevelop-ilspy.aspx" title="New from SharpDevelop: ILSpy - Christoph Wille" target="_blank">[New from SharpDevelop: ILSpy - Christoph Wille]:アナウンス。

redgateの.NET Reflectorが有償化される。.NET Reflectorと同様のアプリケーションILSpyを作り、オープンソースで公開した人たちがいる。
自分は.NET Reflectorをちょろっとしか使っていなかったので、ILSpyが.NET Reflectorと同等の機能を持っているかはわからないけど、自分の使う範囲では十分そう。

ソースコードをビルドしたい場合、たぶんWindows SDK 7.1が入っていたら問題ないかと思う。
x64環境でビルドするさいは、"msbuild.exe"の場所が異なっているので、"releasebuild.bat"、"debugbuild.bat"、"clean.bat"の"msbuild.exe"のパスを修正してやる必要がある。

%windir%\microsoft.net\framework\v4.0.30319\msbuild

となっているのを、

%windir%\microsoft.net\framework64\v4.0.30319\msbuild

とする。

「XAMLでキュゥべえ」ビルドしてみた

[XAMLでキュゥべえ - 赤坂玲音Blog 〜CODE SENSES〜]にあるものを使って、単純なアプリケーションをビルドしてみた。XAMLは、その言葉をときおり見かけはすれども、いじったことなかった。調査(調査ってほど大げさなものじゃないけど)をかねてやってみた。なので、ハローワールド*1に毛が生えたようなアプリケーションだ。

Windows 7 x64、Visual Studio 2010 Express(C# & C++)、Windows SDK 7.1が入っている環境、Windows XP SP3 x86Visual Studio 2005 Express(C++)、Windows SDK 7.1が入っている環境で試した。たぶん、Visual Studioなくても、Windows SDK 7.1が入ってれば大丈夫だと思われる。
Windows SDK 7.1は"C:\Program Files\Microsoft SDKs\Windows\v7.1"にインストールされているとする。

[連載:XAMLの基礎知識 − @IT][第1回 Hello Worldとテキスト・エディタで始めるXAML − @IT]にあるサンプルを、だいぶん流用させてもらった。

  1. "win.xaml"、"app.xaml"、"qb.proj"というテキストファイルを作る。テキストファイルは文字コードUTF-8で保存する*2。それぞれのファイルの内容は後述。
  2. コマンドプロンプトを開く。
  3. "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.Cmd" を実行する*3
  4. "msbuild" "qb.proj" を実行すると、"qb.exe" のできあがり。

"qb.proj"のToolsVersionは4.0とした。Visual StudioWindows SDKの別ヴァージョンやらが入っていると、その環境の違いを考えてプロジェクト書かないといけない*4。単純なサンプルに、そんな面倒なことを考えたくないので、4.0に決めうち。

実行画面


これが表示されるだけ。めちゃめちゃ単純なアプリケーション。

ソースコード、プロジェクトファイル

win.xaml
<?xml version="1.0" encoding="UTF-8"?>
<Window
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  Title="Face of QB."
  Width="640"
  Height="480"
>
<Canvas>
     <Ellipse Fill="#FFB23A77" Stroke="Black" Width="120" Height="120" Canvas.Left="33" Canvas.Top="92" />
     <Ellipse Fill="#FF6E1111" Height="60" Width="60" Canvas.Left="64" Canvas.Top="122"/>
     <Ellipse Fill="#FFF4F4F5" Height="30" Width="30" Canvas.Left="106" Canvas.Top="112"/>
     <Ellipse Fill="#FFB23A77" Stroke="Black" Width="120" Height="120" Canvas.Left="464" Canvas.Top="92" />
     <Ellipse Fill="#FF6E1111" Height="60" Width="60" Canvas.Left="495" Canvas.Top="122"/>
     <Ellipse Fill="#FFF4F4F5" Height="30" Width="30" Canvas.Left="534" Canvas.Top="112"/>
     <Path Data="M218,331.99992 C223,347.99965 227,361.99935 254,366.99935 281,371.99935 303.33333,359.99937 322,349.99937 344,360.66604 344.94601,367.9588 372,368.99881 398,369.9983 407,358.99934 413,338.9998" Height="37.063" Stretch="Fill" Stroke="Black" Canvas.Left="219" Canvas.Top="344" Width="195"/>
</Canvas>
</Window>
app.xaml
<?xml version="1.0" encoding="UTF-8"?>
<Application
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  StartupUri="win.xaml"
/>
qb.proj
<?xml version="1.0" encoding="UTF-8"?>
<Project
  xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
  DefaultTargets="Build"
  ToolsVersion="4.0">

  <PropertyGroup>
    <AssemblyName>QB</AssemblyName>
    <OutputType>winexe</OutputType>
    <OutputPath>.\</OutputPath>
  </PropertyGroup>

  <ItemGroup>
    <ApplicationDefinition Include="app.xaml" />
    <Page Include="win.xaml" />

    <Reference Include="System" />
    <Reference Include="WindowsBase" />
    <Reference Include="PresentationCore" />
    <Reference Include="PresentationFramework" />
    <Reference Include="System.Xaml" />
  </ItemGroup>

  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>

*1:カタカナで書くと、えらいことまぬけだな。

*2:サンプルではASCII左反面の範囲の文字しか使ってないから、あまり気にしないでもいい。ASCII左反面に収まらない文字をコメントなんかとして書き加えたりする場合には注意する必要がある。

*3:"SetEnv.Cmd"は引数なしの場合、デバッグビルドになる。リリースビルドにする場合は、/Release を最初のオプションとして与える。まあ、単純なサンプルなんでどっちでもいいだろうけど。

*4:ビルドツール(というか、.NET Framework、かね?)のヴァージョンによって細かいところが変わってくる。

Apache FOPのwriting-modeと座標変換行列

CTMクラスには平行移動の情報ももっているけど、ここであつかうものでは全部0だから無視する。

"lr-tb"の変換行列
\(\array{\\{1}\quad{0}\\{0}\quad{1}}\)
"rl-tb"の変換行列
\(\array{\\{-1}\quad{0}\\\quad{0}\quad{1}}\)
"tb-rl"の変換行列
\(\array{\\{0}\quad{1}\\{1}\quad{0}}\)

"rl-tb"と"lr-tb"をかけても"rl-tb"だわな。
\(\array{\\{-1}\quad{0}\\\quad{0}\quad{1}}\)\(\array{\\{1}\quad{0}\\{0}\quad{1}}\)=\(\array{\\{-1}\quad{0}\\\quad{0}\quad{1}}\)
"rl-tb"どうしだと、"lr-tb"と同じになる。
\(\array{\\{-1}\quad{0}\\\quad{0}\quad{1}}\)\(\array{\\{-1}\quad{0}\\\quad{0}\quad{1}}\)=\(\array{\\{1}\quad{0}\\{0}\quad{1}}\)

Apache FOPのwriting-modeにからむ実装自体は無理矢理感が漂っているけど(だから、対応状況のwriting-modeの項目が全部"no"になっているんだろう)、いろいろな実装の考え方があるのだなあと、ちょっとおもしろかった。
あとこういうものだとわかれば、注意してつかうこともできるし、なんも実装されてないよりはいいかな。"tb-rl"は、ちょっと……あれだけど。(^_^;)

XSL-FOのwriting-mode

writing-modeの実装は、いろいろ大変なようだな……。
Apache FOPとRenderX XEPでのwriting-modeの対応を見てみた。

Apache FOP

[Apache FOP Compliance Page]
writing-modeには対応していない。

いちおう、writing-mode="lr-tb"、"rl-tb"、"tb-rl"なんかを受け付けるけど……。
"rl-tb"は、座標系の原点が左上から右上に、そしてX方向が逆になる。レンダリングされた文字列が鏡に映したようにひっくり返る。
"tb-rl"は描画の向きを時計回りに90度寝かせる(XSL-FO的には反時計回りに-90度か?)。だから、時計回りに90度回転させた文字が、上から下に並ぶということになる。
座標の変換やってる(であろう)"CTM.java"ってのを見たら、アフィン変換で座標を写像しているだけみたいだ……。すごい力業だな。
さらに、"rl-tb"を指定したエリアの子エリアに"lr-tb"を指定したとしても、親エリアと同じ"rl-tb"のまま。"CTM.java"で、アフィン変換用の行列を表現するクラスCTMが定義されている。クラスCTMには、CTMオブジェクトの積を得るメソッドがある。もしかして、親エリアと子エリアのCTMオブジェクトの積を求めてるんじゃ……。それで、"rl-tb"エリアの子が"lr-tb"の場合、得られるCTMオブジェクトは、"rl-tb"のCTMオブジェクトと同じものになってるのでは?*1 "rl-tb"の子エリアに、さらに"rl-tb"を指定すると、"lr-tb"指定とおなじものになるんだが、"rl-tb"のCTMオブジェクトどうしの積の結果、"lr-tb"のCTMオブジェクトと同じものが得られるから、やっぱCTMオブジェクトの積を求めてるんだろうね。
あるエリアのwriting-mode記録して、親と子のwriting-modeを比較して……とか処理するのを嫌って、座標変換の行列の積を求めるって処理にしてるのだろうか?
アフィン変換でwriting-modeってこと自体が、すごい無理矢理な実装だと思うけど、でもwriting-modeに正式対応してるなんて書いてないから、この処理にあまり文句はつけまい。
あと、バッドノウハウの部類になるものではあるけど、"rl-tb"指定エリアの子エリアに、さらに"rl-tb"指定して"lr-tb"に戻すっていうの、わかって使うぶんにはいいかもね。
他のXSL-FO処理系には渡せないものになるけど。

RenderX XEP

[XEP User Guide - Appendix A. XSL-FO Conformance]

writing-modeプロパティに関しては、次の記述がある。日本語縦書きに必要な"tb-rl"などには対応していない。

Only "lr-tb" and "rl-tb" values are supported. All other values are treated as "lr-tb."

でもまあ、"lr-tb" と "rl-tb" に関しては、ちょこちょこいじった感じ、それなりに、きちんと実装されている感じはする。
まあ、"rl-tb"でアラビア文字とか扱ってみたわけじゃないから、細かいところでおかしな処理してるかもしれんけど、そこまでは試してない。

*1:このへん、想像。あまり細かいところまでは読んでない。

サンプル

XEPで設定ができているか確認するサンプル。ただ、"italic"、"oblique"、"bold"とかって、そういう字形があるかによる。MS Wordとかみたいに、無理矢理斜体や太字にしない。なので、設定しても、基本フォントの字形と変わらない*1。ただ、字詰めが変わるので、それで設定が正しいか確認できるかと思う。

<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format" xml:lang="ja">
	<fo:layout-master-set>
		<fo:simple-page-master master-name="page-master" page-height="297mm" page-width="210mm" margin-top="0mm" margin-right="0mm" margin-bottom="0mm" margin-left="0mm">
			<fo:region-body margin-top="10mm" margin-right="10mm" margin-bottom="10mm" margin-left="10mm"/>
		</fo:simple-page-master>
	</fo:layout-master-set>
	
	<fo:page-sequence master-reference="page-master" initial-page-number="1">
		<fo:flow flow-name="xsl-region-body">
			<fo:block font-family="MS ゴシック" font-size="16pt">MS ゴシック:おはようございます。abcdef!!</fo:block>
			<fo:block font-family="MS ゴシック" font-size="16pt" font-style="oblique">MS ゴシック:こんにちは。abcdef!!</fo:block>
			<fo:block font-family="MS ゴシック" font-size="16pt" font-style="italic">MS ゴシック:こんにちは。abcdef!!</fo:block>
			<fo:block font-family="MS ゴシック" font-size="16pt" font-weight="bold">MS ゴシック:こんにちは。abcdef!!</fo:block>
			<fo:block font-family="MS ゴシック" font-size="16pt" font-weight="bold" font-style="italic">MS ゴシック:こんばんは。abcdef!!</fo:block>

			<fo:block font-family="MS Pゴシック" font-size="16pt">MS Pゴシック:おはようございます。abcdef!!</fo:block>
			<fo:block font-family="MS Pゴシック" font-size="16pt" font-style="oblique">MS Pゴシック:こんにちは。abcdef!!</fo:block>
			<fo:block font-family="MS Pゴシック" font-size="16pt" font-style="italic">MS Pゴシック:こんにちは。abcdef!!</fo:block>
			<fo:block font-family="MS Pゴシック" font-size="16pt" font-weight="bold">MS Pゴシック:こんにちは。abcdef!!</fo:block>
			<fo:block font-family="MS Pゴシック" font-size="16pt" font-weight="bold" font-style="italic">MS Pゴシック:こんばんは。abcdef!!</fo:block>

			<fo:block font-family="MS UI Gothic" font-size="16pt">MS UI Gothic:おはようございます。abcdef!!</fo:block>
			<fo:block font-family="MS UI Gothic" font-size="16pt" font-style="oblique">MS UI Gothic:こんにちは。abcdef!!</fo:block>
			<fo:block font-family="MS UI Gothic" font-size="16pt" font-style="italic">MS UI Gothic:こんにちは。abcdef!!</fo:block>
			<fo:block font-family="MS UI Gothic" font-size="16pt" font-weight="bold">MS UI Gothic:こんにちは。abcdef!!</fo:block>
			<fo:block font-family="MS UI Gothic" font-size="16pt" font-weight="bold" font-style="italic">MS UI Gothic:こんばんは。abcdef!!</fo:block>

			<fo:block font-family="MS 明朝" font-size="16pt">MS 明朝:おはようございます。abcdef!!</fo:block>
			<fo:block font-family="MS 明朝" font-size="16pt" font-style="oblique">MS 明朝:こんにちは。abcdef!!</fo:block>
			<fo:block font-family="MS 明朝" font-size="16pt" font-style="italic">MS 明朝:こんにちは。abcdef!!</fo:block>
			<fo:block font-family="MS 明朝" font-size="16pt" font-weight="bold">MS 明朝:こんにちは。abcdef!!</fo:block>
			<fo:block font-family="MS 明朝" font-size="16pt" font-weight="bold" font-style="italic">MS 明朝:こんばんは。abcdef!!</fo:block>

			<fo:block font-family="MS P明朝" font-size="16pt">MS P明朝:おはようございます。abcdef!!</fo:block>
			<fo:block font-family="MS P明朝" font-size="16pt" font-style="oblique">MS P明朝:こんにちは。abcdef!!</fo:block>
			<fo:block font-family="MS P明朝" font-size="16pt" font-style="italic">MS P明朝:こんにちは。abcdef!!</fo:block>
			<fo:block font-family="MS P明朝" font-size="16pt" font-weight="bold">MS P明朝:こんにちは。abcdef!!</fo:block>
			<fo:block font-family="MS P明朝" font-size="16pt" font-weight="bold" font-style="italic">MS P明朝:こんばんは。abcdef!!</fo:block>

			<fo:block font-family="メイリオ" font-size="16pt">メイリオ:おはようございます。abcdef!!</fo:block>
			<fo:block font-family="メイリオ" font-size="16pt" font-style="oblique">メイリオ:こんにちは。abcdef!!</fo:block>
			<fo:block font-family="メイリオ" font-size="16pt" font-style="italic">メイリオ:こんにちは。abcdef!!</fo:block>
			<fo:block font-family="メイリオ" font-size="16pt" font-weight="bold">メイリオ:こんにちは。abcdef!!</fo:block>
			<fo:block font-family="メイリオ" font-size="16pt" font-weight="bold" font-style="italic">メイリオ:こんばんは。abcdef!!</fo:block>
		</fo:flow>
	</fo:page-sequence>
</fo:root>

*1:boldとitalicを持っているメイリオを除く。ただしメイリオも斜体は一部のみ。"italic"、"oblique"を指定しても英字とか記号が斜体になるだけ。

XEP Personal Edition、フォントの設定

※ 本記事のXEPは"xep-4.18-20101125-personal.zip"をインストールしたもの。 ※

RenderX XEPのフォント設定。
XEPはデフォルトでは日本語フォントの設定はなされていない。
設定ファイル"xep.xml"中の"Sample configuration for Windows TrueType fonts."と書いてあるそばに、Windows用のフォント設定サンプルがある。
コメントアウトされているので、それを有効にしてやる。
("Arial"、"Times New Roman"、"Courier New"、"Tahoma"、"Verdana"、"Palatino"の定義がある)
そして、下のように"MS ゴシック"などの日本語フォントの設定を追加する*1。元からあるWindows用フォント設定は、単体のTrueTypeフォントファイル(*.ttf)の設定なので、以下はTrueType Collection(*.ttc)での設定例にもなるかと思う。
なお、"xep.xml"は「UTF-8。BOMなし」で保存する。BOMありで保存すると、最初のBOMを読み飛ばさず、おかしな文字があると考えるのか、エラーにしてくれる*2

      <!-- MSゴシック -->
      <font-family name="MS ゴシック">
        <font><font-data ttc="msgothic.ttc" subfont="1"/></font>
        <font style="oblique"><font-data ttc="msgothic.ttc" subfont="1"/></font>
        <font weight="bold"><font-data ttc="msgothic.ttc" subfont="1"/></font>
        <font weight="bold" style="oblique"><font-data ttc="msgothic.ttc" subfont="1"/></font>
      </font-family>
      <font-family name="MS Pゴシック">
        <font><font-data ttc="msgothic.ttc" subfont="2"/></font>
        <font style="oblique"><font-data ttc="msgothic.ttc" subfont="2"/></font>
        <font weight="bold"><font-data ttc="msgothic.ttc" subfont="2"/></font>
        <font weight="bold" style="oblique"><font-data ttc="msgothic.ttc" subfont="2"/></font>
      </font-family>
      <font-family name="MS UI Gothic">
        <font><font-data ttc="msgothic.ttc" subfont="3"/></font>
        <font style="oblique"><font-data ttc="msgothic.ttc" subfont="3"/></font>
        <font weight="bold"><font-data ttc="msgothic.ttc" subfont="3"/></font>
        <font weight="bold" style="oblique"><font-data ttc="msgothic.ttc" subfont="3"/></font>
      </font-family>

      <!-- MS明朝 -->
      <font-family name="MS 明朝">
        <font><font-data ttc="msmincho.ttc" subfont="1"/></font>
        <font style="oblique"><font-data ttc="msmincho.ttc" subfont="1"/></font>
        <font weight="bold"><font-data ttc="msmincho.ttc" subfont="1"/></font>
        <font weight="bold" style="oblique"><font-data ttc="msmincho.ttc" subfont="1"/></font>
      </font-family>
      <font-family name="MS P明朝">
        <font><font-data ttc="msmincho.ttc" subfont="2"/></font>
        <font style="oblique"><font-data ttc="msmincho.ttc" subfont="2"/></font>
        <font weight="bold"><font-data ttc="msmincho.ttc" subfont="2"/></font>
        <font weight="bold" style="oblique"><font-data ttc="msmincho.ttc" subfont="2"/></font>
      </font-family>

      <!-- メイリオ -->
      <font-family name="メイリオ">
        <font><font-data ttc="meiryo.ttc" subfont="1"/></font>
        <font style="oblique"><font-data ttc="meiryo.ttc" subfont="2"/></font>
        <font weight="bold"><font-data ttc="meiryob.ttc" subfont="1"/></font>
        <font weight="bold" style="oblique"><font-data ttc="meiryob.ttc" subfont="2"/></font>
      </font-family>

Windows TrueTypeフォント用のフォントグループ全体だと下のような定義になるかな。

    <font-group xml:base="file:/C:/Windows/Fonts/" label="Windows TrueType" embed="true" subset="true"> 
      <font-family name="Arial">
        <font><font-data ttf="arial.ttf"/></font>
        <font style="oblique"><font-data ttf="ariali.ttf"/></font>
        <font weight="bold"><font-data ttf="arialbd.ttf"/></font>
        <font weight="bold" style="oblique"><font-data ttf="arialbi.ttf"/></font>
      </font-family>

      <font-family name="Times New Roman" ligatures="&#xFB01; &#xFB02;">
        <font><font-data ttf="times.ttf"/></font>
        <font style="italic"><font-data ttf="timesi.ttf"/></font>
        <font weight="bold"><font-data ttf="timesbd.ttf"/></font>
        <font weight="bold" style="italic"><font-data ttf="timesbi.ttf"/></font>
      </font-family>

      <font-family name="Courier New">
        <font><font-data ttf="cour.ttf"/></font>
        <font style="oblique"><font-data ttf="couri.ttf"/></font>
        <font weight="bold"><font-data ttf="courbd.ttf"/></font>
        <font weight="bold" style="oblique"><font-data ttf="courbi.ttf"/></font>
      </font-family>

      <font-family name="Tahoma" embed="true">
        <font><font-data ttf="tahoma.ttf"/></font>
        <font weight="bold"><font-data ttf="tahomabd.ttf"/></font>
      </font-family>

      <font-family name="Verdana" embed="true">
        <font><font-data ttf="verdana.ttf"/></font>
        <font style="oblique"><font-data ttf="verdanai.ttf"/></font>
        <font weight="bold"><font-data ttf="verdanab.ttf"/></font>
        <font weight="bold" style="oblique"><font-data ttf="verdanaz.ttf"/></font>
      </font-family>

      <font-family name="Palatino" embed="true" ligatures="&#xFB00; &#xFB01; &#xFB02; &#xFB03; &#xFB04;">
        <font><font-data ttf="pala.ttf"/></font>
        <font style="italic"><font-data ttf="palai.ttf"/></font>
        <font weight="bold"><font-data ttf="palab.ttf"/></font>
        <font weight="bold" style="italic"><font-data ttf="palabi.ttf"/></font>
      </font-family>

      <!-- MSゴシック -->
      <font-family name="MS ゴシック">
        <font><font-data ttc="msgothic.ttc" subfont="1"/></font>
        <font style="oblique"><font-data ttc="msgothic.ttc" subfont="1"/></font>
        <font weight="bold"><font-data ttc="msgothic.ttc" subfont="1"/></font>
        <font weight="bold" style="oblique"><font-data ttc="msgothic.ttc" subfont="1"/></font>
      </font-family>
      <font-family name="MS Pゴシック">
        <font><font-data ttc="msgothic.ttc" subfont="2"/></font>
        <font style="oblique"><font-data ttc="msgothic.ttc" subfont="2"/></font>
        <font weight="bold"><font-data ttc="msgothic.ttc" subfont="2"/></font>
        <font weight="bold" style="oblique"><font-data ttc="msgothic.ttc" subfont="2"/></font>
      </font-family>
      <font-family name="MS UI Gothic">
        <font><font-data ttc="msgothic.ttc" subfont="3"/></font>
        <font style="oblique"><font-data ttc="msgothic.ttc" subfont="3"/></font>
        <font weight="bold"><font-data ttc="msgothic.ttc" subfont="3"/></font>
        <font weight="bold" style="oblique"><font-data ttc="msgothic.ttc" subfont="3"/></font>
      </font-family>

      <!-- MS明朝 -->
      <font-family name="MS 明朝">
        <font><font-data ttc="msmincho.ttc" subfont="1"/></font>
        <font style="oblique"><font-data ttc="msmincho.ttc" subfont="1"/></font>
        <font weight="bold"><font-data ttc="msmincho.ttc" subfont="1"/></font>
        <font weight="bold" style="oblique"><font-data ttc="msmincho.ttc" subfont="1"/></font>
      </font-family>
      <font-family name="MS P明朝">
        <font><font-data ttc="msmincho.ttc" subfont="2"/></font>
        <font style="oblique"><font-data ttc="msmincho.ttc" subfont="2"/></font>
        <font weight="bold"><font-data ttc="msmincho.ttc" subfont="2"/></font>
        <font weight="bold" style="oblique"><font-data ttc="msmincho.ttc" subfont="2"/></font>
      </font-family>

      <!-- メイリオ -->
      <font-family name="メイリオ">
        <font><font-data ttc="meiryo.ttc" subfont="1"/></font>
        <font style="oblique"><font-data ttc="meiryo.ttc" subfont="2"/></font>
        <font weight="bold"><font-data ttc="meiryob.ttc" subfont="1"/></font>
        <font weight="bold" style="oblique"><font-data ttc="meiryob.ttc" subfont="2"/></font>
      </font-family>
    </font-group>

"x4u"を起動すると設定したものを、目視で確認することができる。フォント設定の中に"MS ゴシック"とかが見えて、ファイル名とか間違ってなければ設定できていると思ってよいと思う。
なお、"x4u"でフォント設定とかいじって保存できるけど、そのさいに、たとえば"Palatino"に設定されている、ligatures="&#xFB00; &#xFB01; &#xFB02; &#xFB03; &#xFB04;"の実体参照なんかが、まんまUnicode文字に置き換えられて保存される。
それはデータとしては問題ないのだろうとは思うけど、表示できない文字もあって文字化けみたいに見えるから、それが嫌なら(俺は嫌)"x4u"に"xep.xml"をいじらせないようにしたほうがいいかも。

*1:"font-family"要素の"name"属性のところは自分の好みで変えてください。または好みの"name"属性をもった"font-family"要素を追加するか。

*2:UTF-8の場合、バイトオーダーは環境に依存しないから、BOM付ける必要がないけど、できたら読み飛ばしてほしいなあ……。