第3章 WordprocessingML

numbering

numbering(番号付け)パーツは、WordprocessingMLの段落番号や箇条書きなどの段落の番号付けに関する情報を格納したパーツです。Wordで文書上に箇条書きや段落番号を付加したとき、ファイルはメイン文書と同じwordフォルダにnumbering.xmlとして存在します。

メイン文書において段落番号を付けた段落は、pPr要素の子供にnumPr要素が追加され番号属性が定義されます。

numPr要素の例(document.xml)
<w:document ...>
  ...
  <w:p
  <w:pPr ...>
    <w:numPr>
      <w:ilvl w:val="0"/>
      <w:numId w:val="1"/>
    </w:numPr>
  </w:pPr>
  ...
  </w:p>
  ...
</w:docment>

ilvl要素のval属性値はリストレベルを表し、numId要素のval属性値は参照する番号付け定義の参照IDの値を表します。

番号付き段落の場合、段落番号の種類=番号定義テーブルの書式と、リストレベルの種類を使って書式を表します。

例えば、次のように3つの段落からなる文章に番号付けを指定します。

このとき、3つのp要素のすべてのpPr要素(段落プロパティ)に同じnumPr要素が追加されています。

3つの段落からなる文章に番号付け(document.xml)
...
<w:numPr>
  <w:ilvl w:val="0"/>
  <w:numId w:val="1"/>
</w:numPr>
...

この情報からnumbering.xmlの番号定義の設定を参照し、段落への番号付けがされます。文書に書かれている「1. 2. 3.」などの番号はメイン文書にはまったく現れません。行頭文字を付けた番号無しリスト(箇条書き)の場合も同じです。リスト番号および行頭文字はアプリケーション(Word)によって追加されて表示されていますが、番号の文字そのものはテキストデータとして扱われないということです。

numbering.xmlにはリスト形式となる段落のスタイル情報が格納されています。

ルート要素はnumberingで、次の4つの子要素を持っています。

要素名 説明
numPicBullet 画像を使った行頭文字
abstractNum Abstract Numbering Definitions(抽象番号付け定義)。ここで定義される内容は大きく分けて、「共通の番号付け書式」「番号付けのレベル」の2つです。
num Numbering Definition Instances(番号付け定義インスタンス)。抽象番号付け定義への参照と、オプションとして番号付けレベルの上書き指定を行います。
numIdMacAtCleanup Last Reviewed Abstract Numbering Definition。番号付けパーツ上で定義された抽象番号付け定義は、文書上で参照されていない場合もあります。アプリケーションが最後に文書を開いたときに、文書上で参照がない抽象番号付け定義をWordprocessingML文書上から削除する際に利用されます。

主となる情報はabstructNum要素とnum要素です。abstructNum要素には種々の番号付けに必要な多くの情報があり、番号付けのスタイルの数だけ存在します。num要素はメイン文書(document.xml)から参照されるIdと、そこからどのabstructNumを参照すべきかのIDを持ちます。メイン文書の番号付けされた段落と番号定義のパーツの関連付けは少々複雑です。ここでは一般的なnum要素とabstructNum要素を使った参照方法を示します。

先ほどのサンプルのリスト番号を指定した段落の場合、numPr要素の中から、numId(番号ID)が1、ilvl(リストレベル)が0となっています。このとき、numbering.xmlには次のようになっています。

numbering要素
<w:numbering ...>
  <w:abstructNum w:abstructNumId="0">
  </w:abstructNumId>
  <w:num w:numId="1">
    <w:abstructNumId w:val="0" />
  </w:num>
</w:numbering>

番号参照の方法として、まず番号IDを使って番号付けスタイルの種類が選択され、次にリストレベルによって具体的な番号が決定されます。

最初に参照されるのは、num要素です。ここでnumId属性の値が一致するnum要素がメイン文書本文の番号付き段落の情報です。

次に、num要素の子供には参照すべきabstructNum要素のIDがval属性で示されています。上の例の場合、値は0です。

abstructNum要素はabstructNumId属性で自身のIDを示しており、num要素で取得したabstructNumIdの値が一致する箇所がその番号付き段落のスタイル情報となります。

次にリストレベルを使ってabstructNum要素の中を参照します。

abstructNum要素の中は次のようになっています。

abstructNum(numbering.xml)
<w:abstractNum w:abstractNumId="0">
    <w:lvl w:ilvl="0" w:tplc="0409000F">
      <w:start w:val="1"/>
      <w:numFmt w:val="decimal"/>
      <w:lvlText w:val="%1."/>
      <w:lvlJc w:val="left"/>
      <w:pPr>
        <w:ind w:left="420" w:hanging="420"/>
      </w:pPr>
    </w:lvl>
    <w:lvl w:ilvl="1" w:tplc="04090017" w:tentative="1">
      <w:start w:val="1"/>
      <w:numFmt w:val="aiueoFullWidth"/>
      <w:lvlText w:val="(%2)"/>
      <w:lvlJc w:val="left"/>
      <w:pPr>
        <w:ind w:left="840" w:hanging="420"/>
      </w:pPr>
    </w:lvl>
    <w:lvl w:ilvl="2" w:tplc="04090011" w:tentative="1">
      <w:start w:val="1"/>
      <w:numFmt w:val="decimalEnclosedCircle"/>
      <w:lvlText w:val="%3"/>
      <w:lvlJc w:val="left"/>
      <w:pPr>
        <w:ind w:left="1260" w:hanging="420"/>
      </w:pPr>
    </w:lvl>
      <w:lvl w:ilvl="3" w:tplc="0409000F" w:tentative="1">
      <w:start w:val="1"/>
      <w:numFmt w:val="decimal"/>
      <w:lvlText w:val="%4."/>
      <w:lvlJc w:val="left"/>
      <w:pPr>
        <w:ind w:left="1680" w:hanging="420"/>
      </w:pPr>
    </w:lvl>
  </w:abstractNum>
  ...
</w:numbering>

lvl要素がリストレベルの数だけ存在しています。lvl要素のilvl属性がリストレベルの番号です。上の例では文書本体のリストレベルが0なので、ilvl属性値が0のlvl要素を参照します。

lvl要素
<w:lvl w:ilvl="0" w:tplc="0409000F">
  <w:start w:val="1"/>
  <w:numFmt w:val="decimal"/>
  <w:lvlText w:val="%1."/>
  <w:lvlJc w:val="left"/>
  <w:pPr>
    <w:ind w:left="420" w:hanging="420"/>
  </w:pPr>
</w:lvl>
要素名 説明
start 開始番号
numFmt 番号書式。通常val属性にdecimal(アラビア数字10進数)やlowerRoman(ローマ数字小文字)などを指定します。特殊な書式についてはformat属性で指定します。
lvlText テキスト書式。たとえば「%1.」は「番号書式の数字+.」となります。
lvlJc 文字揃え
pPr 段落プロパティ

段落プロパティ以外は、それぞれval属性でそのプロパティを指定します。

先の例では段落属性に左インデントとぶら下がりの値が指定されています。

ここから、開始番号(start要素)は1、番号付け書式は(numFmt要素)は10進数値、書式テキスト(lvlText)は「%1.」で番号付けがされることがわかります。

箇条書き

番号ではなく記号で箇条書きを表す場合、通常の箇条書きではnumFmt要素のval="bullet"として、記号はlvlTxtのval属性の文字が使用されます。箇条書き用に設定されたフォントのこの文字が箇条書きの記号として利用されるため、この情報を基にWordと同じ描画を行うためには、Wordと同じフォントが利用できる必要があります。

箇条書き記号には、文字の代わりに、独自にDrawingMLオブジェクトを利用することもできます。番号付けパーツでnumPicBullet要素で定義した内容を、抽象番号付け定義でlvlPicBulletId要素によって参照します。

numPicBullet (numbering.xml)
<w:numbering ...>
  ...
  <w:numPicBullet w:numPicBulletId="1">
    <w:drawing>
      ...
    </w:drawing>
  </w:numPicBullet>
   ...
  <w:abstractNum w:abstractNumId="7">
    ...
    <w:lvl w:ilvl="0" w:tplc="B7663E56">
    <w:start w:val="1" />
    <w:numFmt w:val="bullet" />
    <w:lvlText w:val=" " />
    <w:lvlPicBulletId w:val="1" />
    </w:lvl>
  </w:abstractNum>
...
</w:numbering>

箇条書き記号の優先順位

numPicBulletId要素が記述されているとき、lvlText要素の文字との優先順序について、ISO/IEC 29500-1:2016には記載がありません。ECMA 376にはlvlText要素の内容を置き換えるとあります。