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
Le balisage de la numérotation WordprocessingML comporte une part importante d’indirection. Cette indirection suit trois modèles dans le balisage :
Numérotation directe pour les listes à puces ou numérotées simples
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.
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
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
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
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
Ensuite, examinez le balisage pour la liste numérotée simple suivante.
Figure 6. 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
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
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
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
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
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
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
Sélectionnez ensuite un paragraphe, et définissez un format de numérotation :
Figure 13. Remplacer le format de numérotation
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
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
Sélectionnez ensuite un paragraphe, et définissez une nouvelle liste à plusieurs niveaux.
Figure 16. Définir une nouvelle liste à plusieurs niveaux
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
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
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
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
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
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
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
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
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
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 :
Le formatage w:lvl pour le paragraphe.
Le niveau de retrait du paragraphe.
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: