Travail avec des listes numérotées dans Open XML WordprocessingML

Résumé :   Découvrez les listes dans Open XML. Les documents Word 2010 contiennent souvent des listes à puces et numérotées. Cet aspect de WordprocessingML est vraiment complexe. Les listes à puces et numérotées comportent de nombreuses fonctionnalités, chacune employée par des groupes d’utilisateurs différents.

Dernière modification : mardi 3 janvier 2012

S’applique à : Office 2010 | Open XML | Visual Studio Tools for Microsoft Office | Word 2007 | Word 2010

Dans cet article
Vue d’ensemble
Balisage pour les listes numérotées simples
Balisage pour les listes à puces simples
Balisage pour listes à plusieurs niveaux
Balisage pour une numérotation liée à des styles
Remplacement de formats de numérotation dans des listes à plusieurs niveaux par de nouveaux formats de numérotation
Remplacement de formats de numérotation dans des listes à plusieurs niveaux, création de formats de liste à plusieurs niveaux
Traitement de l’élément w:startOverride
Définition des styles de liste
Autres solutions pour les suffixes d’éléments de liste
Traitement de l’élément w:lvlRestart
Traitement de l’élément w:isLgl
Algorithme pour assembler le texte d’un élément de liste
Conclusion
Ressources supplémentaires

Publication :   mars 2010

Auteur :Eric White (éventuellement en anglais), Microsoft Corporation

Contenu

  • Vue d’ensemble

  • Balisage pour les listes numérotées simples

  • Balisage pour les listes à puces simples

  • Balisage pour listes à plusieurs niveaux

  • Balisage pour une numérotation liée à des styles

  • Remplacement de formats de numérotation dans des listes à plusieurs niveaux par de nouveaux formats de numérotation

  • Remplacement de formats de numérotation dans des listes à plusieurs niveaux, création de formats de liste à plusieurs niveaux

  • Traitement de l’élément w:startOverride

  • Définition des styles de liste

  • Autres solutions pour les suffixes d’éléments de liste

  • Traitement de l’élément w:lvlRestart

  • Traitement de l’élément w:isLgl

  • Algorithme pour assembler le texte d’un élément de liste

Vue d’ensemble

Lors de l’implémentation d’une conversion de documents de traitement de texte Open XML vers HTML, l’un des aspects les plus intéressants concerne la conversion précise de listes à puces et numérotées. Vous devez écrire un code spécifique pour les traiter, car elles affectent le texte que le document contient, mais ce texte n’est pas directement dans le balisage. Si vous extrayez avec précision le texte du document, vous devez traiter certains éléments et attributs pour assembler correctement le texte.

Notes

Cet article s’applique à Microsoft Word 2010 et à Microsoft Office Word 2007.

Les listes à puces et numérotées sont complexes et à juste titre. Il existe de nombreuses fonctionnalités de listes à puces et numérotées, chacune intéressant différents types d’utilisateurs. Ces fonctionnalités sont représentées par des éléments dans le balisage. Cependant, vous n’avez pas à vous préoccuper de tous les éléments. Certains aspects du balisage ne concernent que l’interface utilisateur et il n’est pas nécessaire de se préoccuper de ces éléments lors de la détermination de la représentation textuelle d’un élément à puce ou numéroté. Cet article se limite aux notions fondamentales que vous devez connaître pour travailler avec des listes à puces et numérotées.

L’approche la plus simple pour décrire le balisage du numérotation consiste à lier le balisage à l’interface utilisateur de Word. Vous n’êtes concerné que par les modifications que vous pouvez apporter aux documents avec ces trois boutons :

Figure 1. Boutons de la barre d’outils pour listes numérotées

Numérotation des boutons

Le balisage de la numérotation WordprocessingML comporte une part importante d’indirection. Cette indirection suit trois modèles dans le balisage :

  1. Numérotation directe pour les listes à puces ou numérotées simples

  2. Numérotation basée sur le style, c’est-à-dire que Heading1 est au premier niveau de retrait, Heading2 au deuxième niveau de retrait.

  3. Styles de numérotation nommés

Cet article examine chacun de ces modèles.

Balisage pour les listes numérotées simples

La figure suivante montre le balisage qui est généré lorsque vous créez une liste numérotée simple.

Figure 2. Création d’une liste numérotée simple

Créer une liste à puces simple

Pour décrire le balisage avec précision, nous devons différencier deux aspects des listes à puces ou numérotées. À chaque élément à puce ou numéroté correspond deux composants : l’élément de liste et le texte du paragraphe.

Figure 3. Éléments de liste à puces

Éléments de liste - Puces

Nous devons différencier ces éléments car l’élément de liste représente ce que nous devons assembler pour chaque paragraphe. En outre, l’élément de liste fait l’objet d’un balisage de formatage séparé. La même différence s’applique à une liste numérotée.

Figure 4. Éléments de liste numérotés

Éléments de liste - Texte

Le diagramme suivant montre l’indirection pour une liste à puces ou numérotée simple.

Figure 5. Indirection pour une liste à puces ou numérotée simple

Indirection de numérotation simple

Ensuite, examinez le balisage pour la liste numérotée simple suivante.

Figure 6. Liste numérotée simple

Liste numérotée simple

Le balisage dans la partie principale du document se présente comme suit.

<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>

L’élément w:numPr contient les éléments de numérotation qui nous intéressent. L’élément w:ilvl est un nombre basé sur zéro qui indique le niveau de retrait. Les éléments numérotés sont au niveau le moins mis en retrait, la valeur de w:ilvl est donc de zéro. L’élément w:numId est un index dans les éléments w:num, se trouvant dans la partie numérotation.

Important

Le w:numId peut contenir une valeur de zéro, qui est une valeur spéciale qui indique que la numérotation a été retirée à ce niveau de la hiérarchie de style. Pendant le traitement de ce balisage, si w:val='0', le paragraphe n’a pas d’élément de liste.

Le balisage de la partie numérotation se présente comme suit.

<?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>

L’index dans l’élément w:numPr dans la partie principale du document se réfère à l’élément w:num. Dans ce cas, cet élément contient un élément unique, w:abstractNumId, qui se réfère à l’élément w:abstractNum apparaissant avant lui. L’élément w:abstractNum contient les informations requises pour formater l’élément de liste. Notez que l’élément w:abstractNum ne contient pas d’informations de formatage pour le paragraphe (à l’exception des informations de mise en retrait, qui se rattachent à l’élément de liste et au paragraphe). Le formatage du paragraphe proprement dit est stocké dans la partie du document principal et des styles, comme d’habitude. Il y a trois éléments (l’élément w:nsid, l’élément w:multiLevelType et l’élément w:tmpl) qui affectent uniquement l’interface utilisateur dans l’application de traitement de texte, et vous pouvez les ignorer.

Notes

Le reste de cet article élimine ces éléments des listes de balisage.

Les éléments w:lvl et les éléments enfants w:lvl définissent le formatage de chaque niveau de retrait des éléments de liste. Il y a des éléments w:lvl supplémentaires (retirés de la liste) qui définissent le formatage des éléments de liste pour chaque niveau aux niveaux deux et supérieurs. L’attribut w:tplc et l’attribut w:tentative de l’élément w:lvl y sont présents uniquement pour l’interface utilisateur. Je vais les retirer des autres listes.

Conseil

L’indirection de l’élément w:num à l’élément w:abstractNum permet un balisage qui remplace le formatage de éléments de liste. Ce balisage est présenté plus loin dans l’article.

Les éléments qui nous intéressent vraiment sont les enfants de l’élément w:lvl : l’élément w:start, l’élément w:numFmt, l’élément w:lvlText et l’élément w:lvlJc, ainsi que l’élément complexe w:pPr.

L’élément w:start spécifie le numéro de départ du niveau de retrait. Commencez-vous à compter à 0, 1 ou un autre nombre ? Les nombres de départ négatifs ne sont pas autorisés (et ne sont pas très utiles).

Dans cet exemple, l’élément w:numFmt indique que le document utilise une décimal dans l’élément de liste pour le niveau de retrait 0, et que le document utilise une lettre minuscule pour le niveau de retrait 1. Il existe plusieurs options pour cet élément :

  • Puces

  • Décimale (1, 2, 3)

  • Décimale zéro (01, 02, 03)

  • Chiffres romains en majuscules (I, II, III)

  • Chiffres romains en minuscules (i, ii, iii)

  • Lettres majuscules (A, B, C)

  • Lettres minuscules (a, b, c)

  • Ordinal (1er, 2e, 3e)

  • Texte cardinal (Un, Deux, Trois)

  • Texte ordinal (Premier, Second, Troisième)

Notes

Il existe d’autres options pour d’autres langues qui ne sont pas incluses. Diverses langues asiatiques ont des systèmes de numérotation ne figurant pas dans cette liste.

Vous utilisez l’élément w:lvlText comme un modèle pour construire l’élément de liste. Pour le niveau 0, cet exemple utilise « %1. », qui indique que le texte w:numFmt qui a été déterminé pour l’élément le moins en retrait remplace le %1 dans la chaîne de format. Pour le niveau 1, cet exemple utilise « %2. », qui indique que le texte qui a été déterminé pour la première mise en retrait remplace le %2. Notez que pour les éléments w:lvl, vous spécifiez le niveau de retrait avec un index basé sur zéro, tandis que dans le modèle w:lvlText, vous spécifiez des jetons de remplacement en utilisant un index basé sur un. Tout cela est logique. Les éléments w:lvl sont utilisés uniquement par les développeurs, et les index basés sur zéro sont plus simples pour les développeurs, tandis que le modèle est utilisé et spécifié par des utilisateurs, il est donc logique d’utiliser un index basé sur un. Ces deux éléments sont très puissants, et vous permettent de créer des formats de listes hiérarchiques pour répondre à quasiment tous les besoins. D’autres exemples de ces deux éléments sont présentés plus loin dans cet article.

Important

Pour les listes à puces, même si l’élément w:lvltext contient des jetons de remplacement (tels que %1 et %2), ces derniers ne sont pas remplacés par le numéro de niveau. Cela n’affecte pas notre code, car l’élément w:lvlText ne contient pas de jetons de remplacement.

L’élément w:lvlJc contrôle si les éléments de liste sont justifiés à droite ou à gauche, ainsi que d’autres options. La liste suivante montre la différence entre la justification à gauche et la justification à droite pour les éléments numérotés utilisant du texte. Cela est facile à voir dans cet exemple, mais est plus difficile à noter lorsque vous utilisez des listes à puces ou des listes numérotées qui emploient des chiffres.

Figure 6. Éléments de liste justifiés

Justification des éléments de liste

Enfin, certaines propriétés de paragraphe s’appliquent à l’élément de liste, spécifiant par exemple le retrait et le retrait négatif.

L’élément w:lvl peut également contenir des propriétés d’exécution qui s’appliquent à l’élément de liste. Si vous changez la police de l’élément de liste à Courier, il se présente comme suit.

Figure 7. Éléments de liste formatés avec la police Courier

Élément de liste avec jeu de polices

Voici un exemple de l’élément w:lvl qui contient les propriétés d’exécution qui définissent la police pour l’élément de liste.

<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>

Comme d’habitude, le paragraphe dans la partie principale du document contient une référence à un style.

<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>

Nous pouvons trouver ce style dans la partie styles, qui spécifie le formatage pour le texte du paragraphe.

<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>

C’est un modèle classique pour le balisage des paragraphes avec style.

Balisage pour les listes à puces simples

Cette section décrit le balisage qui est généré si vous créez une liste à puces simple telle qu’illustrée dans la figure suivante.

Figure 8. Création d’une liste à puces simple

Liste à puces

Le modèle d’indirection de balisage pour une liste à puces simple est identique au modèle pour une liste numérotée simple.

Pour la liste à puces simple, la partie principale du document (document.xml) contient des paragraphes qui sont identiques à la liste numérotée simple.

<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>

Voici un exemple de la partie de numérotation.

<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>

L’attribut w:val de l’élément w:lvlText est ici enregistré comme un caractère 0xB7, qui est le symbole puce pour ce niveau (de la police Symbol). Cet exemple illustre principalement que vous pouvez écrire une méthode généralisée pour assembler le texte de l’élément de liste, et cette méthode fonctionne aussi bien pour les listes numérotées que pour les listes à puces.

L’élément w:start n’affecte pas l’élément de liste car l’élément de modèle w:lvlText ne contient pas de jeton de remplacement (tel que %1 et %2), mais même s’il en contenait, nous ne remplacerions pas le jeton.

Balisage pour listes à plusieurs niveaux

Vous pouvez voir que ce cadre permet de facilement mettre en œuvre des listes à plusieurs niveaux. Vous pouvez changer le document source pour qu’il se présente comme dans la figure suivante.

Figure 9. Liste à plusieurs niveaux simples

Liste avec hiérarchie

Les paragraphes dans la partie principale du document se présentent comme suit. L’élément w:ilvl pour le deuxième paragraphe est réglé à « 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>

Les parties de numérotation et de styles ne sont pas modifiées dans cet exemple.

Balisage pour une numérotation liée à des styles

Une fonctionnalité de numérotation est très pratique et permet aux utilisateurs d’impliquer le balisage un peu plus. Vous pouvez lier un style à un type et un niveau de numérotation, par la suite tous les paragraphes de ce style sont représentés avec un élément de liste. L’exemple canonique lie le style Heading1 au premier niveau de retrait, le style Heading2 au second niveau. Un document qui utilise cette approche ressemble à celui présenté dans la figure suivante.

Figure 10. Numérotation qui est liée à des styles

Styles avec numérotation

Le modèle d’indirection du balisage pour une numérotation qui est liée à des styles se présente comme suit.

Figure 11. Indirection pour une numérotation qui est liée à des styles

Indirection de numérotation stylisée

Dans ce cas, la partie principale du document ne contient pas de balisage lié à la numérotation.

<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>

Le balisage dans cette partie de style pour le style Heading1 contient une référence à l’élément w:num dans la partie de numérotation.

<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>

La partie numérotation se présente comme suit :

<?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>

L’élément w:pStyle est lié au style dans la partie des styles. Vous déterminez le niveau de retrait en recherchant l’élément w:pStyle qui correspond au style du paragraphe. L’élément complexe w:lvl parent définit le niveau de retrait. Comme d’habitude, vous assemblez le texte de l’élément de liste à partir des autres éléments enfants de l’élément w:lvl.

Remplacement de formats de numérotation dans des listes à plusieurs niveaux par de nouveaux formats de numérotation

Vous pouvez remplacer le format de numérotation pour tout niveau dans une liste à plusieurs niveaux en utilisant un nouveau format de numérotation. Cela affecte le balisage. Pour créer ce balisage, créez d’abord une liste à plusieurs niveaux :

Figure 12. Créer une liste à plusieurs niveaux

Style de liste hiérarchique

Sélectionnez ensuite un paragraphe, et définissez un format de numérotation :

Figure 13. Remplacer le format de numérotation

Définir un nouveau format numérique

Dans la boîte de dialogue Définir un nouveau format de numérotation, changez l’aspect. Dans cet exemple, nous avons changé Heading2 de telle sorte que l’élément de liste est le nombre cardinal suivi d’une parenthèse  : « Un) ».

Figure 14. Boîte de dialogue Définir un nouveau format de numérotation

Format numérique ordinal

Le balisage pour la partie principale du document se présente maintenant comme suit.

<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>

Le balisage dans la partie de numérotation a maintenant deux éléments w:num, chacun pointant vers son propre format de numérotation abstraite :

<w:num w:numId="1">
  <w:abstractNumId w:val="1"/>
</w:num>
<w:num w:numId="2">
  <w:abstractNumId w:val="0"/>
</w:num>

Le balisage de numérotation abstraite peut être traité comme d’habitude. Le point essentiel ici est que lorsque vous formatez une numérotation à l’aide de styles, le balisage suit l’indirection présentée dans cette section. Si un paragraphe de ce style contient un élément w:numPr, celui-ci remplace le lien du format de numérotation abstraite au style.

Remplacement de formats de numérotation dans des listes à plusieurs niveaux, création de formats de liste à plusieurs niveaux

L’utilisateur peut remplacer le format de numérotation pour tout niveau dans une liste à plusieurs niveaux, créant ainsi un format de liste à plusieurs niveaux, et ceci affecte le balisage. Pour créer ce balisage, créez d’abord une liste à plusieurs niveaux.

Figure 15. Créer une liste à plusieurs niveaux

Liste actuelle

Sélectionnez ensuite un paragraphe, et définissez une nouvelle liste à plusieurs niveaux.

Figure 16. Définir une nouvelle liste à plusieurs niveaux

Définir une nouvelle boîte de dialogue de liste multiniveau

Dans la boîte de dialogue Définir une nouvelle liste à plusieurs niveaux, changez l’aspect du niveau de liste. Mon exemple change le format de telle sorte que les éléments de liste au deuxième niveau de mise en retrait utilisent des lettres majuscules pour le marqueur d’élément.

Figure 17. Boîte de dialogue Définir une nouvelle liste à plusieurs niveaux

Définir une nouvelle boîte de dialogue de liste multiniveau 2

Le balisage pour la partie principale du document contient un élément w:numPr qui remplace le lien du format de numérotation abstraite au style, exactement comme lorsque vous créez un format de numérotation.

<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>

L’élément w:numPr dans les propriétés du paragraphe remplace le lien entre le format de numérotation abstraite et le style Heading2. La partie de numérotation contient maintenant un nouvel élément w:num qui définit les éléments w:lvlOverride.

<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>
  . . .

Deux des éléments w:num se réfèrent maintenant au même format de numérotation abstraite. Cependant, le deuxième élément remplace maintenant le formatage de l’élément de liste. Vous pouvez voir que le remplacement de niveau pour le niveau 1 spécifie maintenant que la valeur de l’élément w:numFmt est « upperLetter ».

Traitement de l’élément w:startOverride

L’élément w:lvlOverride peut contenir un élément w:startOverride enfant.

  <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>

L’élément w:startOverride règle le numéro de départ du niveau de retrait à la valeur spécifiée. Cela est parfois utilisé lorsque l’utilisateur définit spécifiquement cette valeur dans l’interface utilisateur pour forcer le comptage à partir d’un numéro spécifique. C’est une manière pour le balisage de prévoir dans un document le saut d’un numéro dans une liste numérotée :

Figure 18. Liste numérotée qui ignore un numéro

Numéro 4 ignoré

Le balisage peut également spécifier un numéro de départ d’une autre manière. Ce balisage est présenté brièvement.

Définition des styles de liste

Word vous permet également de définir un nouveau style de liste nommé, puis d’utiliser ce style ailleurs dans le document. C’est un moyen simple et rapide d’implémenter votre nouveau format de numérotation personnalisé. Pour cela, sélectionnez le texte à numéroter, puis sélectionnez Définir un nouveau style de liste dans la liste à plusieurs niveaux.

Figure 19. Définir un nouveau style de liste

Définir un nouveau style de liste

La boîte de dialogue Définir un nouveau style de liste s’ouvre.

Figure 20. Boîte de dialogue Définir un nouveau style de liste

Définir un nouveau style de liste 2

Après l’utilisation de cette boîte de dialogue, les paragraphes sélectionnés ont le format de numérotation que vous spécifiez. Vous pouvez alors également appliquer ce même style à d’autres endroits dans le document. Cette fonctionnalité affecte le balisage. Voici l’indirection lorsque vous utilisez ce modèle.

Figure 21. Indirection pour styles de liste

Indirection de style de liste

La partie document a le même aspect que lorsque vous appliquez d’autres formes de numérotation.

<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>

Vous pouvez trouver l’élément w:num référencé dans la partie de numérotation.

<w:num w:numId="2">
  <w:abstractNumId w:val="0"/>
</w:num>

Mais si nous examinons les éléments de numérotation abstraite, il semble très différent. Il ne contient pas d’éléments w:lvl enfants, et utilise l’élément w:numStyleLink pour se référer au style précédemment défini.

<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>

Dans la partie styles, vous pouvez trouver le style nouvellement défini, qui se réfère à un élément w:num dans la partie numérotation.

<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>

L’élément w:num dans la partie numérotation a l’aspect suivant.

<w:num w:numId="1">
  <w:abstractNumId w:val="1"/>
</w:num>

Ceci se réfère à un élément w:abstractNum, qui contient les formats de niveau, comme d’habitude.

<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>
  . . .

Autres solutions pour les suffixes d’éléments de liste

Le suffixe de liste est le contenu d’espace blanc entre l’élément de liste et le paragraphe. Il existe deux valeurs possibles : tabulation et espace. Nous pouvons modifier une définition de liste pour prévoir l’utilisation d’un espace pour le suffixe d’élément de liste à la place d’une tabulation.

Figure 22. Liste avec espace comme suffixe à la place de tabulations

Un deux trois

Le balisage utilise l’élément w:suff pour le spécifier.

<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>

Traitement de l’élément w:lvlRestart

L’élément w:lvlRestart permet au balisage de contrôler à quel moment un niveau particulier redémarre le comptage. Dans l’exemple suivant, l’élément de liste de niveau quatre redémarre le comptage en présence d’un élément de niveau un intermédiaire :

Figure 23. Contrôle du redémarrage de niveau

Redémarrage de la numérotation

Le balisage dans l’exemple précédent pour l’élément w:lvl où l’attribut w:ilvl est égal à « 3 » se présente comme suit.

  <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>

Traitement de l’élément w:isLgl

L’élément w:isLgl change la représentation textuelle d’un élément de liste afin qu’il utilise des chiffres pour tous les niveaux à la place du format de numérotation spécifié pour ce niveau, mais seulement lors du formatage du texte pour un niveau de retrait donné. Examinez le document suivant, où les éléments au troisième niveau de retrait utilisent la numérotation légale.

Figure 24. Une liste qui utilise la numérotation légale pour le niveau trois

Numérotation autorisée

Si cette liste n’utilise pas la numérotation légale pour le troisième niveau de retrait, elle apparaît comme suit.

Figure 25. Une liste qui n’utilise pas la numérotation légale

Numérotation non autorisée

Le balisage pour l’élément w:isLgl se présente comme suit.

<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>

Algorithme pour assembler le texte d’un élément de liste

Pour assembler le texte d’un élément de liste, vous devez déterminer :

  1. Le formatage w:lvl pour le paragraphe.

  2. Le niveau de retrait du paragraphe.

  3. Le numéro pour chaque niveau parent de retrait pour le paragraphe. Par exemple, si un paragraphe est au quatrième niveau de retrait, vous devez déterminer les numéros de niveau des premier, deuxième, troisième et quatrième niveaux associés à ce paragraphe.

Une fois que vous avez ces trois éléments, l’assemblage du texte d’élément de liste n’est qu’un simple exercice de formatage de texte.

Un paragraphe peut contenir des propriétés de numérotation qui contiennent les éléments w:ilvl et 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>

Dans ce cas, vous utilisez l’élément w:ilvl spécifié pour le niveau de retrait. Vous allez à la partie de numérotation, et recherchez l’élément w:num. En présence d’un élément w:lvlOverride qui contient un élément w:lvl, l’élément w:lvl s’applique. S’il n’y a pas d’élément w:lvlOverride, ou si l’élément w:lvlOverride ne contient pas un élément w:lvl pour le niveau de retrait, recherchez l’élément w:abstractNum associé, puis utilisez le formatage w:lvl spécifié dans l’élément w:abstractNum. Si l’élément w:num contient un élément w:lvlOverride, vous utilisez l’élément w:lvl spécifié pour le niveau de retrait dans le remplacement.

Si le paragraphe ne contient pas un élément w:numPr complexe, et si le style du paragraphe contient un élément w:numPr, un élément de numérotation abstraite se réfère au style. Vous utilisez l’élément w:lvl qui se réfère au style. Cela vous donne également le niveau de retrait.

Après que vous avez déterminé l’élément de formatage w:lvl, et le niveau de retrait, vous pouvez déterminer le numéro de liste pour chaque niveau. Vous devez compter le paragraphe au même niveau avant le paragraphe actuel, en accordant une attention particulière à l’élément w:lvlRestart et à l’élément w:start. C’est là où la programmation fonctionnelle est optimale. Vous pouvez construire une expression sans état pour calculer le numéro d’élément pour chaque niveau de retrait. Cela n’est pas nécessairement la manière la plus efficace de procéder. Cette méthode utilise plus de traitement UC qu’une autre approche, mais elle est plus simple à déboguer et probablement suffisamment rapide pour la plupart des scénarios. Dans des tests informels sur mon ordinateur le plus lent, elle reste toujours quasiment instantanée.

Une fois que vous avez l’élément w:lvl approprié et la liste de numéros d’éléments pour chaque niveau de retrait, la création du texte d’élément de liste revient à un simple processus d’assemblage de texte.

Conclusion

La numérotation dans Open XML WordprocessingML est évidemment complexe. La compréhension de la numérotation est importante lorsqu’il s’agit d’extraire avec précision le texte d’un document. En outre, la génération de documents qui utilisent un balisage de numérotation constitue une approche puissante dans les solutions d’assemblage de documents.

Ressources supplémentaires

Pour démarrer avec Open XML, voir Centre de développement Open XML sur MSDN (éventuellement en anglais). Vous y trouverez beaucoup de contenu, notamment des articles, des vidéos explicatives et des liens vers de nombreux articles de blog. En particulier, les liens suivants fournissent des informations importantes pour commencer à travailler avec le Kit de développement Open XML SDK 2.0: