{ "$schema": "../_schema.json", "format": "docx", "element": "abstractNum", "parent": "numbering", "addParent": "/numbering", "operations": { "add": true, "set": true, "get": true, "query": true, "remove": true }, "paths": { "stable": ["/numbering/abstractNum[@id=N]"], "positional": ["/numbering/abstractNum[N]"] }, "note": "Numbering template (). Defines what a list LOOKS like — 9 levels, each with its own number format, marker text, indent, start value, and marker run properties. Reusable: many instances can share one abstractNum. To apply the list to paragraphs, create a pointing at this abstractNumId (--type num --prop abstractNumId=N), then reference that numId on the paragraph or style (--prop numId=N --prop ilvl=L). Top-level format/text/start/indent are shorthand for level0.*; per-level customization uses level.* (N = 0..8). If a top-level format is set, every level inherits it instead of cycling through decimal/lowerLetter/lowerRoman.", "properties": { "id": { "type": "int", "description": "abstractNumId (w:abstractNumId, unique within /numbering). Omit for auto-assignment. Renaming after Add would orphan every referencing it; not supported.", "add": true, "set": false, "get": true, "examples": ["--prop id=5"], "readback": "integer abstractNumId", "enforcement": "strict" }, "type": { "type": "enum", "values": ["hybridMultilevel", "multilevel", "singleLevel"], "aliases": { "hybridMultilevel": ["hybrid"], "multilevel": ["multi"], "singleLevel": ["single"] }, "description": "multiLevelType (w:multiLevelType). Default: hybridMultilevel. Hybrid is what Word writes for ad-hoc lists; singleLevel locks bullets/numbers to level 0.", "add": true, "set": true, "get": true, "examples": ["--prop type=hybridMultilevel"], "readback": "hybridMultilevel | multilevel | singleLevel", "enforcement": "report" }, "name": { "type": "string", "description": "human-readable name (w:name). Optional; Word shows this in the Numbering dialog.", "add": true, "set": true, "get": true, "examples": ["--prop name=\"Chapter outline\""], "readback": "AbstractNumDefinitionName.Val", "enforcement": "report" }, "styleLink": { "type": "string", "description": "back-reference to a numbering style (w:styleLink). Optional.", "add": true, "set": true, "get": true, "examples": ["--prop styleLink=MyListStyle"], "readback": "StyleLink.Val", "enforcement": "report" }, "numStyleLink": { "type": "string", "description": "link to another abstractNum via numbering style (w:numStyleLink). Optional.", "add": true, "set": true, "get": true, "examples": ["--prop numStyleLink=OutlineList"], "readback": "NumberingStyleLink.Val", "enforcement": "report" }, "format": { "type": "string", "description": "numFmt for level 0 (and propagated to all 9 levels if no per-level override). Common values: decimal, decimalZero, upperRoman, lowerRoman, upperLetter, lowerLetter, ordinal, cardinalText, ordinalText, bullet, chineseCounting, chineseLegalSimplified, japaneseCounting, koreanCounting, hex. Script-localized formats: arabicAlpha (أ ب ت ث), arabicAbjad (أ ب ج د), hebrew1, hebrew2, hindiNumbers, hindiVowels, hindiCounting, hindiConsonants, thaiCounting, thaiNumbers, thaiLetters. Top-level bare 'format' is shorthand for level0.format; setting it also defaults every other level to the same format instead of the decimal/lowerLetter/lowerRoman cycle.", "aliases": ["fmt", "numFmt"], "add": true, "set": false, "get": false, "examples": [ "--prop format=decimal", "--prop format=bullet", "--prop format=chineseCounting", "--prop format=arabicAlpha" ], "readback": "n/a (surfaces on /numbering/abstractNum[@id=N]/level[L])", "enforcement": "report" }, "text": { "type": "string", "description": "lvlText for level 0. Use %N as placeholder for level N's running counter (e.g. '%1.', '%1.%2', '第%1章'). Bullet marker default: •. Top-level bare 'text' is shorthand for level0.text.", "aliases": ["lvlText"], "add": true, "set": false, "get": false, "examples": [ "--prop text=\"%1.\"", "--prop text=\"第%1章\"", "--prop lvlText=\"%1.%2\"" ], "readback": "n/a (surfaces on /numbering/abstractNum[@id=N]/level[L])", "enforcement": "report" }, "start": { "type": "int", "description": "starting number for level 0. Default 1. Shorthand for level0.start.", "add": true, "set": false, "get": false, "examples": ["--prop start=5"], "readback": "n/a (surfaces on /numbering/abstractNum[@id=N]/level[L])", "enforcement": "report" }, "indent": { "type": "int", "description": "left indent in twips for level 0. Default (level+1)*720. Shorthand for level0.indent.", "add": true, "set": false, "get": false, "examples": ["--prop indent=720"], "readback": "n/a (surfaces on /numbering/abstractNum[@id=N]/level[L])", "enforcement": "report" }, "level.format": { "type": "string", "description": "numFmt for level N (N = 0..8). Same vocabulary as bare 'format'. Per-level override; only set the levels you actually use, the rest fall back to decimal/lowerLetter/lowerRoman cycle (or whatever 'format' propagates).", "aliases": ["level.fmt", "level.numFmt"], "add": true, "set": false, "get": false, "examples": [ "--prop level0.format=upperRoman --prop level1.format=decimal" ], "readback": "n/a (surfaces on level[N])", "enforcement": "report" }, "level.text": { "type": "string", "description": "lvlText for level N. Same %N placeholder syntax.", "aliases": ["level.lvlText"], "add": true, "set": false, "get": false, "examples": [ "--prop level0.text=\"%1.\" --prop level1.text=\"%1.%2\"" ], "readback": "n/a (surfaces on level[N])", "enforcement": "report" }, "level.start": { "type": "int", "description": "starting number for level N.", "add": true, "set": false, "get": false, "examples": ["--prop level3.start=1"], "readback": "n/a (surfaces on level[N])", "enforcement": "report" }, "level.indent": { "type": "int", "description": "left indent in twips for level N.", "add": true, "set": false, "get": false, "examples": ["--prop level0.indent=720"], "readback": "n/a (surfaces on level[N])", "enforcement": "report" }, "level.hanging": { "type": "int", "description": "hanging indent in twips for level N. Default 360.", "add": true, "set": false, "get": false, "examples": ["--prop level0.hanging=360"], "readback": "n/a", "enforcement": "report" }, "level.justification": { "type": "enum", "values": ["left", "center", "right"], "aliases": ["level.jc"], "description": "lvlJc — marker alignment within the indent area. Default left.", "add": true, "set": false, "get": false, "examples": ["--prop level0.justification=left"], "readback": "n/a", "enforcement": "report" }, "level.suff": { "type": "enum", "values": ["tab", "space", "nothing"], "description": "what comes between the marker and the text content. Default tab.", "add": true, "set": false, "get": false, "examples": ["--prop level0.suff=space"], "readback": "n/a", "enforcement": "report" }, "level.font": { "type": "string", "description": "marker font (rPr/rFonts on the level). Useful for bullet glyphs that need Symbol or Wingdings.", "add": true, "set": false, "get": false, "examples": ["--prop level0.font=Symbol"], "readback": "n/a", "enforcement": "report" }, "level.size": { "type": "font-size", "description": "marker font size (rPr/sz on the level). Bare number = pt.", "add": true, "set": false, "get": false, "examples": ["--prop level0.size=14"], "readback": "n/a", "enforcement": "report" }, "level.color": { "type": "color", "description": "marker color (rPr/color on the level).", "add": true, "set": false, "get": false, "examples": ["--prop level0.color=#FF0000"], "readback": "n/a", "enforcement": "report" }, "level.bold": { "type": "bool", "description": "bold marker.", "add": true, "set": false, "get": false, "examples": ["--prop level0.bold=true"], "readback": "n/a", "enforcement": "report" }, "level.italic": { "type": "bool", "description": "italic marker.", "add": true, "set": false, "get": false, "examples": ["--prop level0.italic=true"], "readback": "n/a", "enforcement": "report" }, "abstractNumId": { "type": "int", "description": "readback alias for id (matches the w:abstractNumId attribute name).", "add": false, "set": false, "get": true, "readback": "integer", "enforcement": "report" } }, "children": [ { "element": "level", "pathSegment": "level", "cardinality": "0..9" } ] }