Microsoft WordとLibre OfficeのWriter

Libre Officeというソフトをご存知の方がいらっしゃるかもしれません?オープンソースのオフイスソフトで誰でも無料でダウンロードして使用できるものです.昨年から興味があって、時間を見ながらいろいろ調べていました.特に興味があるのはWriterというワードプロセッサのフォーマットです.今時ワードプロセッサというと、Microsoft Wordが当たり前かもしれません.でもLibre Officeの採用している保存フォーマットと、Wordの保存フォーマットは実は両方とも世界規格準拠のXMLフォーマットです.

  • Microsoft Wordは、Office Open XML (OpenXML、OOXML) ISO/IEC 29500
  • Libre Office Writer(またはOpen Office Writer)は、OpenDocument ISO/IEC 26300

私が記憶している限りでも、世界規格になる際にはいろいろ議論がありました.特にMicrosoftの作ったファイルフォーマットの仕様が世界標準になってしまうことについては、反対する意見も多くありました.一方Libre Officeのフォーマットは、OASIS(Organization for the Advancement of Structured Information Standards:構造化情報標準促進協会)という非営利の標準化団体が中心となって、様々な標準規格の上に構築されたもので、Wordのそれとは経緯がまったく異なります.

今ソフトウェア技術者から見ると、OpenXMLの方がお金の元になっているように思えます.「オープン」と言っても実際にそれを忠実に実装できるのはMicrosoftからライセンスされた有料のWordだけで、有料ということはすなわち商売の元があることを意味するからです.一方Writerの方は無料で手に入るソフトウェアなので、よほどの要求がない限り、そこに商売は成立しがたいのではないかと思います.

実は3年前にDITAからWordの.docxを生成するDITA Open Toolkitのプラグインを開発して「地獄」を見ました.何故地獄なのかというと、簡単に言えばXMLであるにもかかわらず、それはそのひとつ前のWordのバイナリーフォーマットの.docの仕様を忠実に再現したもので、極端に言えば90年代後半の構造から進歩していないものに変換しなければならなかったからです.

例えば非常に簡単な例ですが、番号付きリストを見てみるとわかります.番号付きリストはDITAならば

<ol>
    <li>りんご</li>
    <li>みかん</li>
    <li>バナナ</li>
</ol>

と表現できます.これをWriterでやってみると、次のような実に元の構造に沿ったXMLが書き込まれているのを確認できます.

<text:list xml:id="list2243974010" text:style-name="Numbering_20_123">
    <text:list-item>
        <text:p text:style-name="P1">りんご</text:p>
        </text:list-item>
        <text:list-item>
        <text:p text:style-name="P1">みかん</text:p>
        </text:list-item>
        <text:list-item>
        <text:p text:style-name="P1">バナナ</text:p>
    </text:list-item>
</text:list>

しかしこれをWordでやってみると、実に冗長なのです.この3行のリストだけでこうなります.(余計な属性は削ってあります)

<w:p>
    <w:pPr>
        <w:pStyle w:val="a3"/>
        <w:numPr>
            <w:ilvl w:val="0"/>
            <w:numId w:val="1"/>
        </w:numPr>
        <w:ind w:leftChars="0"/>
    </w:pPr>
    <w:r>
        <w:rPr>
            <w:rFonts w:hint="eastAsia"/>
        </w:rPr>
        <w:t>りんご</w:t>
    </w:r>
</w:p>
<w:p>
    <w:pPr>
        <w:pStyle w:val="a3"/>
        <w:numPr>
            <w:ilvl w:val="0"/>
            <w:numId w:val="1"/>
        </w:numPr>
        <w:ind w:leftChars="0"/>
    </w:pPr>
    <w:r>
        <w:rPr>
            <w:rFonts w:hint="eastAsia"/>
        </w:rPr>
        <w:t>みかん</w:t>
    </w:r>
</w:p>
<w:p>
    <w:pPr>
        <w:pStyle w:val="a3"/>
        <w:numPr>
            <w:ilvl w:val="0"/>
            <w:numId w:val="1"/>
        </w:numPr>
        <w:ind w:leftChars="0"/>
        <w:rPr>
            <w:rFonts w:hint="eastAsia"/>
        </w:rPr>
    </w:pPr>
    <w:r>
        <w:rPr>
            <w:rFonts w:hint="eastAsia"/>
        </w:rPr>
        <w:t>バナナ</w:t>
    </w:r>
</w:p>

何がどう違うのかといいますと、大まかに次の2点になります.

Wordはコンテンツとスタイルが分離していません.リストの各段落はコンテンツとスタイルの情報とがごちゃまぜです.これに対してWriterはコンテンツとスタイルがきれいに分離しています.
Wordでは番号付きリストは、段落の「変種」として表現されます.簡単に言えば<w:numPr>があればその変種にあたります.これに対して、Writerは、DITAやHTMLと同じようなリストの構造を素直に表現しています.

どちらが構造上優れているかといえば、明らかにWriterの方です.XMLの特徴がその本来の意味で発揮されています.これに対してWordはせっかくのXMLという構造を活かせていません.これは先にも書いたようにバイナリの.docフォーマットとの互換が一義とされたからではないかと考えられます.

もう少し入り込んだ議論になると、Wordでは、「りんご」「みかん」「バナナ」の各行は独立していて、一体のリストと「見做す」にはW:numPrの情報が必要です.実際w:numPrの行き着く先には、文書全体のリストを管理するテーブルがあって、そこを見て初めて同じリストのインスタンスと「認識」できます.ところがWriterでは初めから<text:list>という要素のくくりで、「りんご」「みかん」「バナナ」の各行は一体のものとしての「リストのインスタンス」として文書中に存在しています.

このためDITAから変換を実装しようとすれば、明らかにWriterの方が相性が良いのです.Wordは「DITAの構造的なXML」から、わざわざその構造をバラバラにして「平坦なXML」を生成し、かつ別途の場所に文書全体のリストを管理するテーブルを正確に作り出す必要があります.しかし、これは開発者にとっては「相手がWordだからやってやらねばならない悩ましい苦痛」の種となります.

Wordが本格的に.docxというフォーマットを提供しだしたのはWord 2007のバージョンからです.その前にはWord 2003で単体のXMLのフォーマットがありWordMLという呼び名で存在していました.しかしWriterのフォーマットは、それを更にさかのぼる2002年、当時のSun Micro SystemsのStar Officeから寄贈されたフォーマットとして今でも当時の仕様がベースになっています.これは以下のOpen OfficeのWebページからダウンロードできます.

OpenOffice.org XML File Format
https://www.openoffice.org/xml/general.html
https://www.openoffice.org/xml/xml_specification.pdf

今は時代ももはや2020年となりました.しかし仕様というものが20年近い年月を経ても持ちこたえることができ、かつ発展しているということは実に興味深いものがあるように思えます.OASISのWebページを見ると、OpenDocumentの仕様は、2015年6月にバージョン1.2がISO標準となり、2019年9月付でバージョン1.3がパブリックレビューの段階になっています.移り変わりの激しい今日にあって、よく練られた仕様というものはやはり価値があるものだし、勉強する意味があると思いました.