Open XML WordprocessingML の段落番号を操作する
概要: Open XML におけるリストについて学習します。Word 2010 文書では、段落番号と箇条書きがよく使用されます。WordprocessingML のこの分野が複雑なのは当然です。段落番号と箇条書きには多くの機能があり、それぞれ異なる用途で使用されます。
適用対象: Office 2010 | Open XML | Visual Studio Tools for Microsoft Office | Word 2007 | Word 2010
この記事の内容
概要
単純な段落番号のマークアップ
単純な箇条書きのマークアップ
アウトラインのマークアップ
スタイルに対応付けられている番号付けのマークアップ
アウトラインの番号書式を新しい番号書式でオーバーライドする
アウトラインの番号書式をオーバーライドして、アウトライン書式を作成する
w:startOverride 要素の処理
リスト スタイルの定義
リスト アイテムのサフィックスの変更
w:lvlRestart 要素の処理
w:isLgl 要素の処理
リスト アイテムのテキストを作成するアルゴリズム
まとめ
その他の技術情報
公開: 2010 年 3 月
提供元:Eric White (英語)、Microsoft Corporation
目次
概要
単純な段落番号のマークアップ
単純な箇条書きのマークアップ
アウトラインのマークアップ
スタイルに対応付けられている番号付けのマークアップ
アウトラインの番号書式を新しい番号書式でオーバーライドする
アウトラインの番号書式をオーバーライドして、アウトライン書式を作成する
w:startOverride 要素の処理
リスト スタイルの定義
リスト アイテムのサフィックスの変更
w:lvlRestart 要素の処理
w:isLgl 要素の処理
リスト アイテムのテキストを作成するアルゴリズム
概要
Open XML ワープロ ドキュメントから HTML への変換を実装する上で興味深い問題の 1 つは、段落番号と箇条書きを正しく変換することです。これらは、ドキュメントには含まれていても、マークアップに直接含まれるわけではないテキストに関係するため、特定のコードを作成して処理する必要があります。ドキュメントのテキストを正確に抽出している場合は、いくつかの要素と属性を処理して正しいテキストを作成する必要があります。
注意
この記事は、Microsoft Word 2010 と Microsoft Office Word 2007 の両方に適用されます。
段落番号と箇条書きは複雑ですが、それは当然です。段落番号と箇条書きには多くの機能があり、さまざまなユーザーがそれぞれの機能を使用しています。マークアップ内では、これらの機能が要素で表されます。ただし、すべての要素に注意を払う必要はありません。マークアップのいくつかの要素はユーザー インターフェイスにのみ影響するものであり、段落番号や箇条書きのテキスト表現を決定するときにそれらの要素に注意を払う必要はありません。この記事では、段落番号と箇条書きを操作するときに理解している必要がある基本についてのみ説明します。
番号付けマークアップについて説明する場合、マークアップを Word のユーザー インターフェイスに関連付けると最も分かりやすいでしょう。ここでは、次の 3 つのボタンを使用して行うことができるドキュメントの変更についてのみ説明します。
図 1. 箇条書き/段落番号のツールバー ボタン
WordprocessingML の番号付けマークアップでは、多くの間接指定が使用されています。マークアップ内のこの間接指定には、次の 3 つのパターンがあります。
単純な段落番号または箇条書きにおける直接的な番号付け。
スタイル ベースの番号付け。Heading1 が第 1 インデント レベルになり、Heading2 が 第 2 インデント レベルになります。
名前付きの番号付けスタイル。
この記事では、これらのパターンについてそれぞれ説明します。
単純な段落番号のマークアップ
次の図は、単純な段落番号を作成した場合に生成されるマークアップを示しています。
図 2. 単純な段落番号の作成
マークアップについて正しく理解するには、段落番号/箇条書きの 2 つの要素を区別しておく必要があります。段落番号/箇条書きの各項目は、リスト アイテムと段落テキストという 2 つのコンポーネントから成ります。
図 3. 箇条書き項目
これらの項目を区別する必要があるのは、段落ごとにリスト アイテムを作成する必要があるためです。さらに、リスト アイテムには個々の書式設定マークアップがあります。段落番号にも同じ違いが当てはまります。
図 4. 段落番号項目
次の図は、単純な段落番号または箇条書きの間接指定を示しています。
図 5. 単純な段落番号または箇条書きの間接指定
次の単純な段落番号のマークアップを見てみましょう。
図 6. 単純な段落番号
メイン ドキュメント パーツ内のマークアップは次のようになります。
<w:p>
<w:pPr>
<w:pStyle w:val="ListParagraph"/>
<w:numPr>
<w:ilvl w:val="0"/>
<w:numId w:val="1"/>
</w:numPr>
</w:pPr>
<w:r>
<w:t>Paragraph one.</w:t>
</w:r>
</w:p>
関係する番号付け要素は、w:numPr 要素に含まれています。w:ilvl 要素は 0 から始まる値で、インデント レベルを表します。番号付きの項目は最も低いインデント レベルなので、w:ilvl の値は 0 です。w:numId 要素は番号付けパーツ内にある w:num 要素のインデックスです。
重要
w:numId に 0 という特別値を指定すると、これは、スタイル階層のこのレベルから番号付けが取り消されることを表します。このマークアップを処理するときに w:val='0' の場合は、段落にリスト アイテムは含まれません。
番号付けパーツのマークアップは次のようになります。
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<w:numbering xmlns:w="https://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:abstractNum w:abstractNumId="0">
<!-- These affect the user interface. We can ignore them. -->
<w:nsid w:val="5FE17486"/>
<w:multiLevelType w:val="hybridMultilevel"/>
<w:tmpl w:val="1084E0BA"/>
<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="720"
w:hanging="360"/>
</w:pPr>
</w:lvl>
<w:lvl w:ilvl="1"
w:tplc="04090019"
w:tentative="1">
<w:start w:val="1"/>
<w:numFmt w:val="lowerLetter"/>
<w:lvlText w:val="%2."/>
<w:lvlJc w:val="left"/>
<w:pPr>
<w:ind w:left="1440"
w:hanging="360"/>
</w:pPr>
</w:lvl>
<!-- a number of other w:lvl elements elided -->
</w:abstractNum>
<w:num w:numId="1">
<w:abstractNumId w:val="0"/>
</w:num>
</w:numbering>
メイン ドキュメント パーツ内の w:numPr 要素内のインデックスは、w:num 要素を参照します。この例では、その要素に含まれるのは w:abstractNumId という 1 つの要素で、これはその前にある w:abstractNum 要素を参照します。w:abstractNum 要素には、リスト アイテムの書式設定に必要な情報が含まれています。段落の書式設定情報は w:abstractNum 要素に含まれないことに注意してください (インデント情報は除きます。この情報は、リスト アイテムと段落の両方に関係します)。段落自体の書式設定は、通常どおり、メイン ドキュメント パーツとスタイル パーツに格納されます。3 つの要素 (w:nsid 要素、w:multiLevelType 要素、および w:tmpl 要素) はワープロ アプリケーションのユーザー インターフェイスにのみ影響するものであり、無視できます。
注意
この記事では、これ以降、マークアップ リストからこれらの要素を除外します。
w:lvl 要素と w:lvl の子要素によって、リスト アイテムの各インデント レベルの書式が定義されます。さらに、レベル 2 以上の各レベルのリスト アイテムの書式を定義する w:lvl 要素もあります (リストからは除外されています)。w:lvl 要素の w:tplc 属性と w:tentative 属性は、ユーザー インターフェイスにのみ関係します。以降のリストではこれらを除外します。
ヒント
w:num 要素から w:abstractNum 要素への間接指定により、リスト アイテムの書式設定をオーバーライドするマークアップが作成されます。このマークアップについては、後述します。
本当に興味深い要素は、w:lvl 要素の子である w:start 要素、w:numFmt 要素、w:lvlText 要素、w:lvlJc 要素、および複合要素の w:pPr です。
w:start 要素は、インデント レベルの開始番号を指定します。0、1、またはそれ以外の値から開始できます。負の開始番号は使用できません (あまり実用的でもありません)。
この例の場合、w:numFmt 要素は、インデント レベル 0 のリスト アイテムで 10 進数を使用し、インデント レベル 1 では英小文字を使用することを指定します。この要素には、多くのオプションがあります。
行頭文字
10 進数 (1、2、3)
先頭が 0 表示の 10 進数 (01、02、03)
大文字ローマ数字 (I、II、III)
小文字ローマ数字 (i、ii、iii)
英大文字 (A、B、C)
英小文字 (a、b、c)
序数 (1st、2nd、3rd)
数字テキスト (One、Two、Three)
序数テキスト (First、Second、Third)
注意
ここでは説明しませんが、英語以外の言語にはこの他にもオプションがあります。各種のアジア言語には、このリスト以外の数体系があります。
リスト アイテムを作成するには、w:lvlText 要素をテンプレートとして使用します。レベル 0 に対してこの例では "%1." を使用します。これは、どのような w:numFmt テキストが指定されていても、最も低いインデント項目は書式設定文字列内で %1 を置き換えることを表します。レベル 1 に対しては "%2." を使用し、指定されているテキストにかかわらず、第 1 インデントでは %2 を置き換えます。ここで、w:lvl 要素に対しては、0 から始まるインデックスでインデント レベルを指定するのに対して、w:lvlText テンプレートでは、1 から始まるインデックスを使用して置換トークンを指定することに注意してください。これは理にかなっています。w:lvl 要素は開発者によってのみ使用されるものであり、開発者にとっては 0 から始まるインデックスの方が簡単です。これに対して、テンプレートはユーザーによって使用および指定されるため、1 から始まるインデックスの方が納得します。この 2 つの要素は非常に強力であり、ほとんどすべてのニーズを満たす階層的なリスト書式を作成できます。この 2 つの要素のその他の例を、後で示します。
重要
箇条書きの場合は、w:lvltext 要素に置換トークン (%1、%2 など) が含まれていても、置換トークンはレベル番号に置き換わりません。w:lvlText 要素に置換トークンは含まれていないので、これがコードに影響することはありません。
w:lvlJc 要素によって、リスト アイテムの右揃え、左揃え、またはその他のオプションが指定されます。次の図は、番号にテキストを使用した項目の左揃えと右揃えの違いを示しています。この例では違いが明白ですが、箇条書きや数字を使用する段落番号の場合、その違いははっきりしません。
図 6. リスト アイテムの配置
最後に、インデント、ぶら下げインデントの指定など、リスト アイテムに適用される段落プロパティがあります。
w:lvl 要素は、リスト アイテムに適用される実行プロパティを含むこともできます。リスト アイテムのフォントを Courier に変更すると、次のようになります。
図 7. Courier フォントで書式設定されたリスト アイテム
リスト アイテムのフォントを定義する実行プロパティを含む w:lvl 要素の例を、次に示します。
<w:lvl w:ilvl="0">
<w:start w:val="1"/>
<w:numFmt w:val="ordinalText"/>
<w:lvlText w:val="%1)"/>
<w:lvlJc w:val="left"/>
<w:pPr>
<w:ind w:left="720"
w:hanging="360"/>
</w:pPr>
<w:rPr>
<w:rFonts w:ascii="Courier New"
w:hAnsi="Courier New"
w:hint="default"/>
</w:rPr>
</w:lvl>
通常どおり、メイン ドキュメント パーツ内の段落にも、スタイルへの参照が含まれます。
<w:p>
<w:pPr>
<w:pStyle w:val="ListParagraph"/>
<w:numPr>
<w:ilvl w:val="0"/>
<w:numId w:val="1"/>
</w:numPr>
</w:pPr>
<w:r>
<w:t>One</w:t>
</w:r>
</w:p>
このスタイルはスタイル パーツにあり、段落テキストの書式を指定します。
<w:style w:type="paragraph"
w:styleId="ListParagraph">
<w:name w:val="List Paragraph"/>
<w:basedOn w:val="Normal"/>
<w:pPr>
<w:ind w:left="720"/>
<w:contextualSpacing/>
</w:pPr>
</w:style>
これは、スタイルが設定された段落の、典型的なマークアップのパターンです。
単純な箇条書きのマークアップ
このセクションでは、次の図に示すように単純な箇条書きを作成した場合に生成されるマークアップについて説明します。
図 8. 単純な箇条書きの作成
単純な箇条書きのマークアップ間接指定パターンは、単純な段落番号のパターンと同じです。
単純な箇条書きの場合、メイン ドキュメント パーツ (document.xml) に、単純な段落番号と同一の段落が格納されます。
<w:p>
<w:pPr>
<w:pStyle w:val="ListParagraph"/>
<w:numPr>
<w:ilvl w:val="0"/>
<w:numId w:val="1"/>
</w:numPr>
</w:pPr>
<w:r>
<w:t>One</w:t>
</w:r>
</w:p>
番号付けパーツの例を次に示します。
<w:abstractNum w:abstractNumId="0">
<w:lvl w:ilvl="0">
<w:start w:val="1"/>
<w:numFmt w:val="bullet"/>
<w:lvlText w:val="o"/>
<w:lvlJc w:val="left"/>
<w:pPr>
<w:ind w:left="720"
w:hanging="360"/>
</w:pPr>
<w:rPr>
<w:rFonts w:ascii="Symbol"
w:hAnsi="Symbol"
w:hint="default"/>
</w:rPr>
</w:lvl>
<!-- several w:lvl elements elided -->
<w:num w:numId="1">
<w:abstractNumId w:val="0"/>
</w:num>
</w:numbering>
w:lvlText 要素の w:val 属性は文字 0xB7 として保存され、これがこのレベルの行頭文字です (Symbol フォントから)。この例の主要なポイントは、リスト アイテムのテキストを作成する汎用的なメソッドを作成できることであり、このメソッドは段落番号と箇条書きの両方で動作します。
w:lvlText テンプレート要素には置換トークン (%1、%2 など) が含まれていないため、w:start 要素はリスト アイテムに影響しません。たとえ置換トークンが含まれていても、トークンは置換しません。
アウトラインのマークアップ
このフレームワークは、アウトラインに簡単に対応します。ソース ドキュメントを次の図のように変更します。
図 9. 単純なアウトライン
メイン ドキュメント パーツ内の段落は次のようになります。第 2 段落の w:ilvl 要素は、"1" に設定されます。
<w:p>
<w:pPr>
<w:pStyle w:val="ListParagraph"/>
<w:numPr>
<w:ilvl w:val="0"/>
<w:numId w:val="1"/>
</w:numPr>
</w:pPr>
<w:r>
<w:t>One</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:pStyle w:val="ListParagraph"/>
<w:numPr>
<w:ilvl w:val="1"/>
<w:numId w:val="1"/>
</w:numPr>
</w:pPr>
<w:r>
<w:t>Two</w:t>
</w:r>
</w:p>
この例では、番号付けパーツとスタイル パーツは変更されません。
スタイルに対応付けられている番号付けのマークアップ
ユーザーにとっては非常に便利ですが、マークアップが多少複雑になる番号付けの機能があります。番号の種類とレベルにスタイルを対応付けることができ、そのスタイルのすべての段落が、リスト アイテムと共に表示されます。標準の例では、Heading1 スタイルを第 1 レベルのインデントに対応付け、Heading2 スタイルを第 2 レベルに対応付けています。この方法を使用するドキュメントは、次の図のようになります。
図 10. スタイルに対応付けられている番号付け
スタイルに対応付けられている番号付けのマークアップ間接指定パターンは、次のようになります。
図 11. スタイルに対応付けられている番号付けの間接指定
この場合、メイン ドキュメント パーツに、番号付けに関連するマークアップは含まれていません。
<w:p>
<w:pPr>
<w:pStyle w:val="Heading1"/>
</w:pPr>
<w:r>
<w:t>Overview of Numbering</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:pStyle w:val="Heading2"/>
</w:pPr>
<w:r>
<w:t>Markup of a Simple Numbered List</w:t>
</w:r>
</w:p>
Heading1 スタイルのスタイル パーツ内のマークアップには、番号付けパーツ内の w:num 要素への参照が含まれています。
<w:style w:type="paragraph"
w:styleId="Heading1">
<w:name w:val="heading 1"/>
<w:basedOn w:val="Normal"/>
<w:pPr>
<w:numPr>
<w:numId w:val="1"/>
</w:numPr>
<w:spacing w:before="480"
w:after="0"/>
<w:outlineLvl w:val="0"/>
</w:pPr>
<w:rPr>
<w:rFonts w:asciiTheme="majorHAnsi"
w:eastAsiaTheme="majorEastAsia"
w:hAnsiTheme="majorHAnsi"
w:cstheme="majorBidi"/>
<w:b/>
<w:bCs/>
<w:color w:val="365F91"
w:themeColor="accent1"
w:themeShade="BF"/>
<w:sz w:val="28"/>
<w:szCs w:val="28"/>
</w:rPr>
</w:style>
番号付けパーツは次のようになります。
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<w:numbering xmlns:w="https://schemas.openxmlformats.org/wordprocessingml/2006/main">
<w:abstractNum w:abstractNumId="0">
<w:lvl w:ilvl="0">
<w:start w:val="1"/>
<w:numFmt w:val="decimal"/>
<w:pStyle w:val="Heading1"/>
<w:lvlText w:val="%1"/>
<w:lvlJc w:val="left"/>
<w:pPr>
<w:ind w:left="432"
w:hanging="432"/>
</w:pPr>
</w:lvl>
<w:lvl w:ilvl="1">
<w:start w:val="1"/>
<w:numFmt w:val="decimal"/>
<w:pStyle w:val="Heading2"/>
<w:lvlText w:val="%1.%2"/>
<w:lvlJc w:val="left"/>
<w:pPr>
<w:ind w:left="576"
w:hanging="576"/>
</w:pPr>
</w:lvl>
<!-- Remaining w:lvl elements elided -->
</w:abstractNum>
<w:num w:numId="1">
<w:abstractNumId w:val="0"/>
</w:num>
</w:numbering>
w:pStyle 要素は、スタイル パーツ内のスタイルにリンクしています。段落のスタイルに一致する w:pStyle 要素を見つけることによって、インデント レベルを決定します。親の w:lvl 複合要素が、インデント レベルを定義します。通常どおり、w:lvl 要素の他の子要素からリスト アイテムのテキストを作成します。
アウトラインの番号書式を新しい番号書式でオーバーライドする
アウトライン内の任意のレベルの番号書式を、新しい番号書式でオーバーライドできます。これはマークアップに影響します。このマークアップを作成するには、最初にアウトラインを作成します。
図 12. アウトラインの作成
次に、段落を選択し、新しい番号書式を定義します。
図 13. 番号書式のオーバーライド
[新しい番号書式の定義] ダイアログ ボックスで、ある要素を変更します。この例では、リスト アイテムが "One)" の形式になるように Heading2 を変更しました。
図 14. [新しい番号書式の定義] ダイアログ ボックス
メイン ドキュメント パーツのマークアップは次のようになります。
<w:p>
<w:pPr>
<w:pStyle w:val="Heading1"/>
</w:pPr>
<w:r>
<w:t>Paragraph One</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:pStyle w:val="Heading2"/>
<w:numPr>
<w:ilvl w:val="1"/>
<w:numId w:val="2"/>
</w:numPr>
</w:pPr>
<w:r>
<w:t>Paragraph Two</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:pStyle w:val="Heading3"/>
</w:pPr>
<w:r>
<w:t>Paragraph Three</w:t>
</w:r>
</w:p>
番号付けパーツ内のマークアップには 2 つの w:num 要素があり、独自の抽象番号書式をそれぞれ指しています。
<w:num w:numId="1">
<w:abstractNumId w:val="1"/>
</w:num>
<w:num w:numId="2">
<w:abstractNumId w:val="0"/>
</w:num>
抽象番号マークアップは、通常どおりに処理されます。ここでの主要なポイントは、スタイルを使用して番号の書式を設定する場合、マークアップはこのセクションに示されている間接指定に従うということです。そのスタイルの段落に w:numPr 要素が含まれる場合、これが、抽象番号書式からスタイルへの対応付けをオーバーライドします。
アウトラインの番号書式をオーバーライドして、アウトライン書式を作成する
アウトライン内の任意のレベルの番号書式をオーバーライドすることでアウトライン書式を作成できます。これはマークアップに影響します。このマークアップを作成するには、最初にアウトラインを作成します。
図 15. アウトラインの作成
次に、段落を選択し、新しいアウトラインを定義します。
図 16. 新しいアウトラインの定義
[新しいアウトラインの定義] ダイアログ ボックスで、リスト レベルの要素を変更します。この例では、第 2 レベルのインデントのリスト アイテムが、マーカーとして英大文字を使用するように書式を変更します。
図 17. [新しいアウトラインの定義] ダイアログ ボックス
メイン ドキュメント パーツのマークアップには、抽象番号書式からスタイルへの対応付けをオーバーライドする w:numPr 要素が含まれます。これは、番号書式を作成する場合とまったく同じです。
<w:p>
<w:pPr>
<w:pStyle w:val="Heading1"/>
</w:pPr>
<w:r>
<w:t>Paragraph One</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:pStyle w:val="Heading2"/>
<w:numPr>
<w:ilvl w:val="1"/>
<w:numId w:val="3"/>
</w:numPr>
</w:pPr>
<w:r>
<w:t>Paragraph Two</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:pStyle w:val="Heading3"/>
</w:pPr>
<w:r>
<w:t>Paragraph Three</w:t>
</w:r>
</w:p>
段落プロパティ内の w:numPr 要素は、抽象番号書式と Heading2 スタイルの間の対応付けをオーバーライドします。番号付けパーツには、w:lvlOverride 要素を定義する新しい w:num 要素が格納されます。
<w:num w:numId="1">
<w:abstractNumId w:val="0"/>
</w:num>
<w:num w:numId="2">
<w:abstractNumId w:val="1"/>
</w:num>
<w:num w:numId="3">
<w:abstractNumId w:val="0"/>
<w:lvlOverride w:ilvl="0">
<w:lvl w:ilvl="0">
<w:start w:val="1"/>
<w:numFmt w:val="decimal"/>
<w:pStyle w:val="Heading1"/>
<w:lvlText w:val="%1"/>
<w:lvlJc w:val="left"/>
<w:pPr>
<w:ind w:left="432"
w:hanging="432"/>
</w:pPr>
<w:rPr>
<w:rFonts w:hint="default"/>
</w:rPr>
</w:lvl>
</w:lvlOverride>
<w:lvlOverride w:ilvl="1">
<w:lvl w:ilvl="1">
<w:start w:val="1"/>
<w:numFmt w:val="upperLetter"/>
<w:pStyle w:val="Heading2"/>
<w:lvlText w:val="%1.%2"/>
<w:lvlJc w:val="left"/>
<w:pPr>
<w:ind w:left="576"
w:hanging="576"/>
</w:pPr>
<w:rPr>
<w:rFonts w:hint="default"/>
</w:rPr>
</w:lvl>
</w:lvlOverride>
. . .
2 つの w:num 要素は、同じ抽象番号書式を参照します。ただし、2 番目の要素は、リスト アイテムの書式設定をオーバーライドしています。レベルの 1 のレベル オーバーライドは、w:numFmt 要素の値が "upperLetter" であることを指定します。
w:startOverride 要素の処理
w:lvlOverride 要素は、子要素の w:startOverride を格納できます。
<w:num w:numId="2">
<w:abstractNumId w:val="2"/>
<w:lvlOverride w:ilvl="0">
<w:startOverride w:val="5"/>
</w:lvlOverride>
<w:lvlOverride w:ilvl="1">
<w:startOverride w:val="1"/>
</w:lvlOverride>
. . .
</w:num>
w:startOverride 要素を使用すると、インデント レベルの開始番号を指定の値に設定できます。これは、ユーザーがユーザー インターフェイスの中でこの値を特に指定して、特定の値からのカウントの開始を適用する場合に使用されます。これは、番号付きのリストの中で番号をスキップするドキュメントをマークアップで作成する場合の 1 つの方法です。
図 18. 番号をスキップする番号付きのリスト
マークアップでは、別の方法でも開始番号を指定できます。このマークアップについては、後述します。
リスト スタイルの定義
Word では、名前付きの新しいリスト スタイルを定義し、そのスタイルをドキュメント内の任意の場所で使用できます。これは、独自のユーザー設定の番号書式を実装できる簡単な方法です。これを行うには、番号付けするテキストを選択し、アウトラインの [新しいリスト スタイルの定義] を選択します。
図 19. 新しいリスト スタイルの定義
[新しいリスト スタイルの定義] ダイアログ ボックスが表示されます。
図 20. [新しいリスト スタイルの定義] ダイアログ ボックス
このダイアログ ボックスを完了すると、選択されている段落に、指定する番号書式が適用されます。この同じスタイルを、ドキュメント内の別の場所に適用することもできます。この機能はマークアップに影響します。このパターンを使用する場合の間接指定を次に示します。
図 21. リスト スタイルの間接指定
ドキュメント パーツは、他の番号書式を適用した場合と同じようになります。
<w:p>
<w:pPr>
<w:pStyle w:val="ListParagraph"/>
<w:numPr>
<w:ilvl w:val="0"/>
<w:numId w:val="2"/>
</w:numPr>
</w:pPr>
<w:r>
<w:t>1</w:t>
</w:r>
</w:p>
参照されている w:num 要素は番号付けパーツにあります。
<w:num w:numId="2">
<w:abstractNumId w:val="0"/>
</w:num>
しかし、抽象番号要素は、かなり異なります。子要素の w:lvl はなく、w:numStyleLink 要素を使用して、前に定義したスタイルを参照しています。
<w:abstractNum w:abstractNumId="0">
<w:nsid w:val="03916EF0"/>
<w:multiLevelType w:val="multilevel"/>
<w:tmpl w:val="0409001D"/>
<w:numStyleLink w:val="EricsListStyle"/>
</w:abstractNum>
スタイル パーツには新しく定義したスタイルがあり、これは番号付けパーツ内の w:num 要素を参照し直しています。
<w:style w:type="numbering"
w:customStyle="1"
w:styleId="EricsListStyle">
<w:name w:val="EricsListStyle"/>
<w:uiPriority w:val="99"/>
<w:rsid w:val="00B1427D"/>
<w:pPr>
<w:numPr>
<w:numId w:val="1"/>
</w:numPr>
</w:pPr>
</w:style>
番号付けパーツ内の w:num 要素は、次のようになります。
<w:num w:numId="1">
<w:abstractNumId w:val="1"/>
</w:num>
これは、通常どおり、レベルの書式を格納している w:abstractNum 要素を参照します。
<w:abstractNum w:abstractNumId="1">
<w:nsid w:val="2D235466"/>
<w:multiLevelType w:val="multilevel"/>
<w:tmpl w:val="0409001D"/>
<w:styleLink w:val="EricsListStyle"/>
<w:lvl w:ilvl="0">
<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="360"
w:hanging="360"/>
</w:pPr>
</w:lvl>
<w:lvl w:ilvl="1">
<w:start w:val="1"/>
<w:numFmt w:val="lowerLetter"/>
<w:lvlText w:val="%2)"/>
<w:lvlJc w:val="left"/>
<w:pPr>
<w:ind w:left="720"
w:hanging="360"/>
</w:pPr>
</w:lvl>
. . .
リスト アイテムのサフィックスの変更
リスト サフィックスとは、リスト アイテムと段落の間の空白部分です。これは、タブとスペースのどちらかのみです。リスト アイテム サフィックスとしてタブの代わりにスペースを使用するように、リスト定義を変更できます。
図 22. サフィックスとしてタブの代わりにスペースを使用したリスト
マークアップでは、w:suff 要素を使用してこれを指定します。
<w:abstractNum w:abstractNumId="0">
<w:nsid w:val="21E167DA"/>
<w:multiLevelType w:val="multilevel"/>
<w:tmpl w:val="5BE82C98"/>
<w:lvl w:ilvl="0">
<w:start w:val="1"/>
<w:numFmt w:val="decimal"/>
<w:pStyle w:val="Heading1"/>
<w:suff w:val="space"/>
<w:lvlText w:val="%1"/>
<w:lvlJc w:val="left"/>
<w:pPr>
<w:ind w:left="432"
w:hanging="432"/>
</w:pPr>
<w:rPr>
<w:rFonts w:hint="default"/>
</w:rPr>
</w:lvl>
w:lvlRestart 要素の処理
w:lvlRestart 要素を使用すると、特定のレベルがカウントを再開するタイミングを制御できます。次の例では、途中に レベル 1 のアイテムがあるときに、レベル 4 のリスト アイテムが再カウントを開始します。
図 23. レベルの再開の制御
前の例で、w:lvl 要素の w:ilvl 属性が "3" に等しい場合のマークアップは、次のようになります。
<w:abstractNum w:abstractNumId="0">
<w:nsid w:val="065A6A4E"/>
<w:multiLevelType w:val="multilevel"/>
<w:tmpl w:val="06A2CF44"/>
<!-- several w:lvl elements elided -->
<w:lvl w:ilvl="3">
<w:start w:val="1"/>
<w:numFmt w:val="decimal"/>
<w:lvlRestart w:val="1"/>
<w:lvlText w:val="%1.%2.%3.%4."/>
<w:lvlJc w:val="left"/>
<w:pPr>
<w:ind w:left="1728"
w:hanging="648"/>
</w:pPr>
<w:rPr>
<w:rFonts w:hint="default"/>
</w:rPr>
</w:lvl>
w:isLgl 要素の処理
w:isLgl 要素は、レベルに固有の番号書式ではなく、すべてのレベルで数値を使用するように、リスト アイテムのテキスト表現を変更します。ただし、指定のインデント レベルのテキストを書式設定する場合に限ります。第 3 インデント レベルのアイテムがアメリカ式リーガル書式の連番を使用する、次のドキュメントを考えてみましょう。
図 24. レベル 3 でアメリカ式リーガル書式の連番を使用するリスト
このリストの第 3 インデント レベルでアメリカ式リーガル書式の連番が使用されていない場合は、次のように表示されます。
図 25. アメリカ式リーガル書式を使用していないリスト
w:isLgl 要素のマークアップは、次のようになります。
<w:abstractNum w:abstractNumId="0">
. . .
<w:lvl w:ilvl="2">
<w:start w:val="1"/>
<w:numFmt w:val="decimal"/>
<w:pStyle w:val="Heading3"/>
<w:isLgl/>
<w:lvlText w:val="%1.%2.%3)"/>
<w:lvlJc w:val="left"/>
<w:pPr>
<w:ind w:left="720"
w:hanging="720"/>
</w:pPr>
<w:rPr>
<w:rFonts w:hint="default"/>
</w:rPr>
</w:lvl>
リスト アイテムのテキストを作成するアルゴリズム
リスト アイテムのテキストを作成するには、次のものを決定する必要があります。
段落の w:lvl 書式設定。
段落のインデント レベル。
段落に対応するインデントの各親レベルの数。たとえば、段落が第 4 インデント レベルにある場合は、その段落に関連する第 1、第 2、第 3、および第 4 レベルのレベル数を決定する必要があります。
この 3 項目を決定すれば、リスト アイテムのテキストの作成は、単純なテキストの書式設定作業にすぎません。
段落には、w:ilvl 要素と w:numId 要素を含む番号付けプロパティが含まれる可能性があります。
<w:p>
<w:pPr>
<w:pStyle w:val="ListParagraph"/>
<w:numPr>
<w:ilvl w:val="0"/>
<w:numId w:val="1"/>
</w:numPr>
</w:pPr>
<w:r>
<w:t>Paragraph one.</w:t>
</w:r>
</w:p>
この例では、インデント レベルに指定されている w:ilvl を使用します。番号付けパーツにアクセスし、w:num 要素を調べます。w:lvl 要素を含む w:lvlOverride 要素がある場合は、w:lvl 要素が適用されます。w:lvlOverride 要素がない場合、または、w:lvlOverride 要素に、インデント レベルの w:lvl 要素が含まれない場合は、関連する w:abstractNum 要素を検索して、w:abstractNum 内で指定されている w:lvl 書式設定を使用します。w:num 要素に w:lvlOverride 要素が含まれる場合は、オーバーライド内でインデント レベルに対して指定されている w:lvl 要素を使用します。
段落に w:numPr 複合要素が含まれず、段落のスタイルに w:numPr 要素が含まれている場合は、スタイルを参照する抽象番号要素が存在します。スタイルを参照する w:lvl を使用します。これによって、インデント レベルも提供されます。
w:lvl 書式設定要素とインデント レベルを決定したら、各レベルの段落番号を決定できます。現在の段落より前の段落を、w:lvlRestart 要素と w:start 要素に注意して、同じレベルでカウントする必要があります。これには関数型プログラミングが適しています。ステートレスな式を作成して、各インデント レベルのアイテム番号を計算できます。これは、最も効率的な方法とは限りません。他の方法より多くの CPU 処理を使用する可能性がありますが、ほとんどのシナリオでデバッグは簡単で、多くの場合、十分に高速です。私の低速なコンピューター上での非公式なテストでも、基本的に即座に動作します。
適切な w:lvl 要素と、各インデント レベルのアイテム番号のリストを決定したら、簡単なテキスト作成プロセスでリストアイテムのテキストを作成できます。
まとめ
Open XML WordprocessingML での番号付けは複雑ですが、それは当然です。ドキュメントのテキストを正確に抽出する上で、番号付けを理解することは重要です。これに加えて、番号付けマークアップを使用するドキュメントの生成は、ドキュメント作成ソリューションにおける強力な方法です。
その他の技術情報
Open XML の概要については、MSDN の「Open XML Developer Center (英語)」を参照してください。記事、ハウツー ビデオ、さまざまなブログ投稿へのリンクなど、多数のコンテンツが掲載されています。特に、次のリンクからは Open XML SDK 2.0 の使用に関する重要な情報にアクセスできます。