a:pPr (Paragraph Properties)
Specifies formatting properties for paragraphs, including alignment, indentation, spacing, tabs, and bullet properties.
Description
a:pPr (Paragraph Properties) is the paragraph-level formatting container in DrawingML. It is defined in ECMA-376 Part 1 §20.1.2.2.2 and controls all visual presentation of a complete paragraph within a text body.
Purpose and Scope
Paragraph properties specify formatting that applies to every line and run within the paragraph:
- Alignment — Left, center, right, justify, or distributed across shape width
- Indentation — Left margin, first-line indent (positive) or hanging indent (negative)
- Spacing — Line height, space before paragraph, space after paragraph
- Bullets and Numbering — Character, font, color, format, level
- Tab Stops — Custom tab positions for alignment within paragraph
- Text Direction — Left-to-right (LTR) or right-to-left (RTL) for Arabic, Hebrew, etc.
- Hierarchy Level — Outline level (0–8) for multi-level lists and nesting
Hierarchy and Precedence
Paragraph properties cascade as follows:
- Explicit paragraph properties (
a:pPrina:p) — Most specific - Master slide default properties — Theme or template
- Application defaults — Fallback
Run-level properties (a:rPr in a:r) override paragraph properties for specific formatting aspects (e.g., font size, color, bold).
Content Model
a:pPr (attributes + optional children)
├─ a:lnSpc (line spacing)
├─ a:spcBef (spacing before)
├─ a:spcAft (spacing after)
├─ a:buFont (bullet font)
├─ a:buChar (bullet character)
├─ a:buAutoNum (auto-numbered bullet)
├─ a:buClr (bullet color)
├─ a:buSzPct (bullet size)
├─ a:buBlipFill (bullet image)
├─ a:tabLst (tab stops)
├─ a:defRPr (default run properties for paragraph)
└─ ... (other formatting elements)
Attributes
| Attribute | Type | Range | Default | Description |
|---|---|---|---|---|
lvl |
Integer | 0–8 | 0 | Hierarchy/outline level. Controls indentation and bullet style in multi-level lists. |
algn |
Enum | l, ctr, r, just, dist |
Inherited | Text alignment: left, center, right, justified, distributed. |
marL |
Integer (EMU) | 0–9144000 | 0 | Left margin in EMUs (1 inch = 914400 EMU). |
indent |
Integer (EMU) | -9144000–9144000 | 0 | First-line indent (positive = indent, negative = hanging indent). |
defTabSz |
Integer (EMU) | 0–51865200 | 457200 | Default tab stop size in EMUs. |
rtl |
Boolean | 0, 1, true, false | false | Right-to-left text direction (for Arabic, Hebrew). |
eaLnBrk |
Boolean | 0, 1, true, false | true | East Asian line breaking behavior. |
latinLnBrk |
Boolean | 0, 1, true, false | false | Latin text line breaking. |
hangingPunct |
Boolean | 0, 1, true, false | false | Hanging punctuation (CJK); punctuation protrudes into margin. |
Child Elements for Bullets and Spacing
| Element | Occurrence | Purpose |
|---|---|---|
a:lnSpc |
0–1 | Line spacing (single, 1.5x, double, or custom). |
a:spcBef |
0–1 | Space before paragraph (in points, percentage, or EMU). |
a:spcAft |
0–1 | Space after paragraph (in points, percentage, or EMU). |
a:buChar |
0–1 | Bullet character (•, ◦, ■, ○, etc.). |
a:buAutoNum |
0–1 | Auto-numbered bullets (1, 2, 3 or a, b, c or i, ii, iii). |
a:buFont |
0–1 | Font family for bullet character. |
a:buClr |
0–1 | Color for bullet (solid fill, theme color, gradient). |
a:buSzPct |
0–1 | Bullet size as percentage of text size. |
a:tabLst |
0–1 | Tab stop positions for alignment. |
a:defRPr |
0–1 | Default run properties for paragraph (font, size, color baseline). |
Examples
Basic Left-Aligned Paragraph
<a:p>
<a:pPr lvl="0" algn="l"/>
<a:r>
<a:rPr lang="en-US" sz="2400">
<a:latin typeface="Calibri"/>
</a:rPr>
<a:t>Left-aligned body text with default spacing.</a:t>
</a:r>
</a:p>
var para = new Paragraph(
new ParagraphProperties
{
Level = 0,
Alignment = TextAlignmentTypeValues.Left
},
new Run(
new RunProperties { Language = "en-US", FontSize = 2400 }
.Append(new LatinFont { Typeface = "Calibri" }),
new Text("Left-aligned body text with default spacing.")));
Centered Paragraph with Custom Spacing
<a:p>
<a:pPr lvl="0" algn="ctr">
<a:spcBef>
<a:spcPts val="1200"/>
</a:spcBef>
<a:spcAft>
<a:spcPts val="1200"/>
</a:spcAft>
</a:pPr>
<a:r>
<a:rPr lang="en-US" sz="4400" b="1">
<a:latin typeface="Calibri"/>
</a:rPr>
<a:t>Centered Heading</a:t>
</a:r>
</a:p>
var pPr = new ParagraphProperties
{
Level = 0,
Alignment = TextAlignmentTypeValues.Center
};
pPr.Append(new SpaceBefore(new SpacePoints { Val = 1200 })); // 12pt before
pPr.Append(new SpaceAfter(new SpacePoints { Val = 1200 })); // 12pt after
var para = new Paragraph(pPr,
new Run(
new RunProperties { Language = "en-US", FontSize = 4400, Bold = true }
.Append(new LatinFont { Typeface = "Calibri" }),
new Text("Centered Heading")));
Bulleted Paragraph (Simple Bullet)
<a:p>
<a:pPr lvl="0">
<a:buChar char="•"/>
<a:buFont typeface="Arial"/>
</a:pPr>
<a:r>
<a:rPr lang="en-US" sz="2400">
<a:latin typeface="Calibri"/>
</a:rPr>
<a:t>First bullet point in the list.</a:t>
</a:r>
</a:p>
var pPr = new ParagraphProperties { Level = 0 };
pPr.Append(new BulletCharacter { Char = "•" });
pPr.Append(new BulletFont { Typeface = "Arial" });
var para = new Paragraph(pPr,
new Run(
new RunProperties { Language = "en-US", FontSize = 2400 }
.Append(new LatinFont { Typeface = "Calibri" }),
new Text("First bullet point in the list.")));
Multi-Level Hierarchy with Nested Bullets
<a:txBody>
<a:bodyPr/>
<a:lstStyle/>
<a:p>
<a:pPr lvl="0">
<a:buChar char="•"/>
<a:buFont typeface="Arial"/>
</a:pPr>
<a:r><a:t>Level 0: Main bullet</a:t></a:r>
</a:p>
<a:p>
<a:pPr lvl="1">
<a:buChar char="◦"/>
<a:buFont typeface="Arial"/>
</a:pPr>
<a:r><a:t>Level 1: Sub-bullet</a:t></a:r>
</a:p>
<a:p>
<a:pPr lvl="2">
<a:buChar char="■"/>
<a:buFont typeface="Arial"/>
</a:pPr>
<a:r><a:t>Level 2: Sub-sub-bullet</a:t></a:r>
</a:p>
<a:p>
<a:pPr lvl="0">
<a:buChar char="•"/>
<a:buFont typeface="Arial"/>
</a:pPr>
<a:r><a:t>Back to level 0</a:t></a:r>
</a:p>
</a:txBody>
var textBody = new TextBody();
textBody.Append(new BodyProperties());
textBody.Append(new ListStyle());
// Level 0
textBody.Append(new Paragraph(
new ParagraphProperties(
new BulletCharacter { Char = "•" },
new BulletFont { Typeface = "Arial" }
) { Level = 0 },
new Run(new Text("Level 0: Main bullet"))));
// Level 1
textBody.Append(new Paragraph(
new ParagraphProperties(
new BulletCharacter { Char = "◦" },
new BulletFont { Typeface = "Arial" }
) { Level = 1 },
new Run(new Text("Level 1: Sub-bullet"))));
// Level 2
textBody.Append(new Paragraph(
new ParagraphProperties(
new BulletCharacter { Char = "■" },
new BulletFont { Typeface = "Arial" }
) { Level = 2 },
new Run(new Text("Level 2: Sub-sub-bullet"))));
// Back to Level 0
textBody.Append(new Paragraph(
new ParagraphProperties(
new BulletCharacter { Char = "•" },
new BulletFont { Typeface = "Arial" }
) { Level = 0 },
new Run(new Text("Back to level 0"))));
Hanging Indent (List-Style Indentation)
<a:p>
<a:pPr lvl="0" marL="914400" indent="-457200">
<a:buChar char="•"/>
</a:pPr>
<a:r>
<a:rPr lang="en-US" sz="2400">
<a:latin typeface="Calibri"/>
</a:rPr>
<a:t>Bullet with hanging indent: main paragraph text continues on second and subsequent lines, indented from the bullet.</a:t>
</a:r>
</a:p>
var pPr = new ParagraphProperties
{
Level = 0,
MarginLeft = 914400, // 1 inch from left
FirstLineIndent = -457200 // -0.5 inch (bullet protrudes)
};
pPr.Append(new BulletCharacter { Char = "•" });
var para = new Paragraph(pPr,
new Run(
new RunProperties { Language = "en-US", FontSize = 2400 }
.Append(new LatinFont { Typeface = "Calibri" }),
new Text("Bullet with hanging indent: main paragraph text continues on second and subsequent lines, indented from the bullet.")));
Paragraph with Line Spacing (1.5 Line Height)
<a:p>
<a:pPr lvl="0">
<a:lnSpc>
<a:spcPct val="150000"/>
</a:lnSpc>
</a:pPr>
<a:r>
<a:rPr lang="en-US" sz="2400">
<a:latin typeface="Calibri"/>
</a:rPr>
<a:t>Text with 1.5 line spacing for improved readability. Multiple lines of text will be rendered with increased vertical space between each line.</a:t>
</a:r>
</a:p>
var pPr = new ParagraphProperties { Level = 0 };
var lnSpc = new LineSpacing();
var spcPct = new SpacingPercent { Val = 150000 }; // 150% = 1.5x
lnSpc.Append(spcPct);
pPr.Append(lnSpc);
var para = new Paragraph(pPr,
new Run(
new RunProperties { Language = "en-US", FontSize = 2400 }
.Append(new LatinFont { Typeface = "Calibri" }),
new Text("Text with 1.5 line spacing for improved readability. Multiple lines of text will be rendered with increased vertical space between each line.")));
Right-Aligned with Negative Margin (Odd Layout)
<a:p>
<a:pPr lvl="0" algn="r" marL="1371600"/>
<a:r>
<a:rPr lang="en-US" sz="2400">
<a:latin typeface="Calibri"/>
</a:rPr>
<a:t>Right-aligned text with left margin offset.</a:t>
</a:r>
</a:p>
var para = new Paragraph(
new ParagraphProperties
{
Level = 0,
Alignment = TextAlignmentTypeValues.Right,
MarginLeft = 1371600 // 1.5 inches from left
},
new Run(
new RunProperties { Language = "en-US", FontSize = 2400 }
.Append(new LatinFont { Typeface = "Calibri" }),
new Text("Right-aligned text with left margin offset.")));
Alignment Reference
| Value | Name | Effect | Use Case |
|---|---|---|---|
l |
Left | Flush to left edge | Default, body text, left-to-right documents |
ctr |
Center | Centered horizontally | Titles, centered headings, emphasis |
r |
Right | Flush to right edge | Right-aligned layouts, right-to-left document support |
just |
Justified | Stretched to fill width | Formal documents, newspaper-style columns |
dist |
Distributed | Stretched with uniform character spacing | Compact layouts, East Asian typography |
Hierarchy Levels and Indentation
| Level | Name | Purpose | Typical Bullet |
|---|---|---|---|
| 0 | Main | Primary/top-level bullets | • (solid circle) |
| 1 | First | First sub-level indent | ◦ (hollow circle) |
| 2 | Second | Second sub-level indent | ■ (solid square) |
| 3–8 | Deeper | Additional nesting | Varies by theme/template |
EMU to Inches/Points:
- 1 inch = 914400 EMU
- 1 point = 12700 EMU
- Typical level-to-level indent: 457200–914400 EMU (0.5–1.0 inch)
Spacing Units Reference
| Unit | Type | Example | Meaning |
|---|---|---|---|
| EMU | Direct | marL="914400" |
1 inch; used for margins/indents |
| Points | Via spcPts | <a:spcPts val="1200"/> |
1200/100 = 12pt |
| Percentage | Via spcPct | <a:spcPct val="120000"/> |
120% of line height |
| Percent of Font | Via spcPct | <a:spcPct val="100000"/> |
100% = 1x font size |
Common Bullet Character Reference
| Character | Code | Use Case |
|---|---|---|
| • | • (U+2022) |
Standard bullet (most common) |
| ◦ | ◦ (U+25E6) |
Hollow circle (secondary level) |
| ■ | ■ (U+25A0) |
Solid square (tertiary level) |
| ○ | ○ (U+25CB) |
Circle outline (alternative) |
| – | – (U+2013) |
En dash (numbered/dash lists) |
| ‣ | ‣ (U+2023) |
Triangular bullet |
| → | → (U+2192) |
Arrow (navigation/flow) |
Common Formatting Patterns
Professional Heading (Centered, Larger Font, Extra Spacing)
<a:pPr lvl="0" algn="ctr">
<a:spcBef><a:spcPts val="1800"/></a:spcBef>
<a:spcAft><a:spcPts val="600"/></a:spcAft>
</a:pPr>
Bullet List with First-Line Hanging Indent
<a:pPr lvl="0" marL="914400" indent="-457200">
<a:buChar char="•"/>
<a:buFont typeface="Arial"/>
</a:pPr>
Justified Body Text with 1.5 Line Spacing
<a:pPr lvl="0" algn="just">
<a:lnSpc><a:spcPct val="150000"/></a:lnSpc>
</a:pPr>
Multi-Level Outline (0, 1, 2 Hierarchy)
<!-- Level 0 -->
<a:pPr lvl="0"><a:buChar char="•"/></a:pPr>
<!-- Level 1 -->
<a:pPr lvl="1"><a:buChar char="◦"/></a:pPr>
```
Notes
Element Relationships
- Parent: Direct child of
a:p(paragraph). Must be the first child if present (0–1 occurrence). - Children (optional formatting elements):
- Spacing:
a:lnSpc(line spacing),a:spcBef(space before),a:spcAft(space after) - Bullets/Numbering:
a:buChar(bullet character),a:buAutoNum(auto-numbered),a:buFont(bullet font),a:buClr(bullet color) - Layout:
a:tabLst(tab stops),a:defRPr(default run properties for paragraph)
- Spacing:
General Notes
- Container for Formatting: Paragraph properties is the central element for controlling paragraph-wide layout and formatting in DrawingML.
- Optional Element:
a:pPris optional (0–1). If omitted, defaults to left-aligned, no bullets, with font/size inherited from the text body or theme. - EMU Conversion: 914400 EMU = 1 inch = 72 points. Common conversions: 457200 EMU = 0.5”, 228600 EMU = 0.25”.
- Hierarchy Levels: Levels 0–8 control indentation and bullet style; level 0 is top level, level 1 is first indent, etc. No explicit nesting is required; all paragraphs are siblings.
- Alignment Scope: Applies to entire paragraph; individual runs cannot have different alignment.
- Bullet Inheritance: If
a:buCharis not specified, the paragraph inherits bullet style from master/theme or is rendered without bullet. - Tab Stops: Define custom tab positions with
a:tabLstfor alignment at specific distances within the paragraph. - Right-to-Left: Set
rtl="1"for Arabic, Hebrew, or other RTL languages to control text direction and alignment. - Line Spacing Options: Single, proportional (%), fixed points, or automatic (default). Most common: 100% (single), 120% (1.2x), 150% (1.5x), 200% (double).
- Compatibility: DrawingML paragraph properties mirror WordML
w:pPrand PresentationMLp:pPrstructures, enabling consistent layout across Office formats.