« 2024年7月 | トップページ | 2024年9月 »

2024年8月の記事

2024年8月25日 (日)

Microsoft Wordの変更履歴の記録に使うXML要素

Microsoft Wordの.docxファイルというのは、実態はzipファイルで、中にいくつかのファイルが入っている。そのうち主要部分はdocument.xmlというXMLファイル。これはOffice Open XML (ECMA 376 / ISO/IEC 29500) という標準のうち、WordprocessingML というマークアップ言語 (というか、XMLスキーマ) に基づいている (*1)。ここまでは、割と良く知られていると思う。

それで、ちょっと事情があって、WordprocessingMLで、Wordの「変更履歴の記録」の機能がどういう風に表現されるのか調べた。そしたらこれが非常に複雑で、専門家と思われる人が書いた解説に矛盾があったりして (某氏のブログでは「以下に示す28種類の要素が」と書いた後の表が26項目しかない、など…) 全体を把握するのに苦労した。そこで、理解できたことの要点だけまとめておく。

(詳細を説明すると膨大な文章になってしまうので、要素の一覧と、仕様の該当箇所だけ。)

変更履歴の記録に使うXML要素

分類 要素 定義の場所 一言説明
cellDel 17.13.5.1 表のセルを削除
cellIns 17.13.5.2 表のセルを追加
cellMerge 17.13.5.3 表のセルを結合/解除
tcPrChange 17.13.5.36 表のセルの書式を変更
trPrChange 17.13.5.37 表の行の書式を変更
tblGridChange 17.13.5.33 表の列の書式を変更
tblPrChange 17.13.5.34 表の書式を変更
tblPrExChange 17.13.5.35 表の例外書式を変更
挿入削除 del 17.13.5.12~15 削除
ins 17.13.5.16~20 挿入
moveFrom 17.13.5.21~22 移動元 (移動の操作によって削除)
moveFromRangeStart 17.13.5.24 移動元の範囲の先頭の印
moveFromRangeEnd 17.13.5.23 移動元の範囲の末尾の印
moveTo 17.13.5.25~26 移動先 (移動の操作によって挿入)
moveToRangeStart 17.13.5.28 移動先の範囲の先頭の印
moveToRangeEnd 17.13.5.27 移動先の範囲の末尾の印
delInstrText 17.16.13 削除されたフィールドコード文字列
delText 17.3.3.7 削除された文字列
書式 rPrChange 17.13.5.30~31 文字書式の変更
pPrChange 17.13.5.29 段落書式の変更
sectPrChange 17.13.5.32 セクション書式の変更
NumberingChange (記載なし) 段落番号の変更

「定義の場所」は、ISO/IEC 29500-1の箇条番号。ここからPDFをダウンロードできる (「EN」というリンクをクリック。その下のElectronic Insertsでスキーマ定義のファイルなどもダウンロード可)。なお、この話の詳細を知るために29500を読む場合は、いきなり17.13.5.Xを読むのではなく、まず「8. Overview」を読み、次に「Annex L」の「L.1」(4,538ページから) を読むといいと思う。

NumberingChangeというのは、ECMA 376の初版に含まれていたが、その後削除された要素。このため、現在の29500には記載がないが、私が使う予定のOpenXML SDKはサポートしているし、今でもNumberingChangeを含んだdocxファイルは使われているらしいので、上の表に入れておいた。

他に、カスタムXMLマークアップの変更に使う要素が8種定義されている (17.13.5.4~11) が、興味ないし普通の人は使わない機能 (*2) だと思うので省略。


*1: 歴史的に正確に言うと、これは逆で、国際標準がWordの.docxファイル仕様に基づいている、というのが正しい。現在の.docxファイルというのは、もともとMicrosoft Office 2007のときにプロプラ仕様として作ったものを、Officeのバージョンアップのたびに少しずつ手直ししたものだ。他方ISO/IEC 29500というのは、このOffice 2007の.docxファイルを基にした国際標準として後から仕様化したものだが、このときに「いくらなんでも、これはダメでしょう」とか「国際標準としてここはマズいんじゃ」みたいな部分をちょっと変更したのでOffice 2007の.docxと少し違ってしまったのだ。

*2: カスタムXMLマークアップというのは、ワードの文章中にOffice OpenXMLとは別のXML要素を埋め込んでおいてユーザーアプリが自由に使うという機能。要は、XMLなんだから名前空間を分ければ何でも混ぜることができるわけなのだが、Word 2007にこの機能が追加されたときに、特許侵害と言われて裁判が起きた。莫大な損害賠償を請求された結果、マイクロソフトは (比較的少額の) 賠償金を支払い当該機能をOfficeから削除するということで和解した。この和解を履行するために、Word 2010以降のWordはカスタムXMLマークアップを新規に追加できないばかりか、Word 2007で作成されたカスタムXMLマークアップを含むdocxファイルを開いた際に強制的にカスタムXMLマークアップを全削除するという機能が追加された。

2024年8月13日 (火)

エクセルの「区切り位置」という機能

マイクロソフトのエクセルには「区切り位置」という機能がある。いわゆるCSVのように、項目をコンマとかタブとかで区切って並べたテキストファイルの各行がまとめて一つのセルに入ってしまっているものを、項目ごとにバラして複数の列に入れ直す機能だ。(この機能についてちゃんと知りたい人はネットで検索すれば、解説記事が大量に見つかる。) 

Text_to_columns-ja

これはかなり昔からある機能で、便利なので私もときどき使うのだが、「区切り位置」という名前が直観的でなくて覚えられず、使うたびにメニュー (リボン) のどれだったか分からなくて毎回苦労する。この機能を使うときには「区切り位置指定ウィザード」というダイアログが開いて、どうやって各項目を切り分けるのかを選ぶようになっている。おそらく、それが「区切り位置」という名前の理由なのだろうと思ってはいた。この命名センスはどうなのかともずっと思っていた。(そんなことを考えているのに「区切り位置」という名前が覚えられないのもちょっとアレだが。)

ところで、Google Spreadsheetにも同じ機能があるのだが、そちらは「テキストを列に分割」という名前になっている。こっちの方がずっと分かりやすいし、機能の存在を知らない人がたまたまメニューで見かけても、何をやる機能か予想がつくんじゃないかと思う。(「区切り位置」の機能は、名前か想像するのは難しいだろう。)

それで、私は「マイクロソフトの (またはエクセルの) 開発チームの命名センスは変わっているのだろうな」と思っていた。ずっと。でも、そうじゃなかった

今朝気づいたのだが、エクセルの英語版では、この機能は「Text to Columns」という名前だったのだ。つまり「テキストを列に」だ。分かりやすい。

Text_to_columns-en

つまり、命名センスがおかしいのは、エクセルの開発チームじゃなくて、エクセルのUIを日本語に訳した人だったのだ。ってゆーか。英語の「Text to Columns」という言葉を見て、それをそのまま翻訳したら、「区切り位置」にはならないよね。絶対に。だからこれは「単純に『テキストを列に』なんて訳しても、日本語圏の人には意味が分からないだろう。言葉を訳すんじゃなくて、内容が伝わるように分かりやすく言い直そう。」と考えた上での訳としか思えない。思えないのだが… これって分かりやすくなっているどころか、意味不明になってますよねえ。

いったいどうしてこういうことに…。

« 2024年7月 | トップページ | 2024年9月 »