Paragraph styles
The ParagraphStyle element and its key attributes — identity, the BasedOn parent, font and size defaults, alignment, indents, and spacing — plus the RootParagraphStyleGroup that holds them.
A paragraph style is the most attribute-rich style in IDML, carrying both paragraph geometry and the character defaults a paragraph's text starts from.
In short: A <ParagraphStyle> defines how a whole paragraph is formatted —
its alignment, indents, and spacing — and the font, size, and fill its text
falls back on when no character style sets them. Every paragraph style lives in
<RootParagraphStyleGroup> inside Resources/Styles.xml, is keyed by its Self
id regardless of any group nesting, and inherits from a parent through BasedOn
down to the uneditable [No paragraph style] root. This page is the attribute
reference for the fields our parser reads; for how those fields combine with
parents and local overrides, see the cascade.
A <ParagraphStyle> is the most attribute-rich style in IDML. It carries both
paragraph geometry (alignment, indents, spacing) and the character defaults a
paragraph's text starts from (font, size, fill), so a run that applies no
character style still has a complete set of values to fall back on. This page is
the attribute reference for the fields our parser reads; for how they combine with
parents and local overrides, see the cascade.
Where they live
Every <ParagraphStyle> sits inside <RootParagraphStyleGroup> in
Resources/Styles.xml. InDesign may nest user styles inside intermediate
<ParagraphStyleGroup> elements for organisation; the parser flattens these — it
keys every style by its Self id regardless of grouping, so a group's nesting
does not affect resolution. Two default styles are always present: the editable
"Normal Paragraph Style" and the uneditable root, ParagraphStyle/$ID/[No paragraph style], which is the bottom of every cascade.
<RootParagraphStyleGroup>
<ParagraphStyle Self="ParagraphStyle/$ID/[No paragraph style]"
Name="$ID/[No paragraph style]"
AppliedFont="Open Sans" PointSize="12" FillColor="Color/Black"/>
<ParagraphStyle Self="ParagraphStyle/Body" Name="Body"
BasedOn="ParagraphStyle/$ID/[No paragraph style]"
PointSize="14" SpaceAfter="6"/>
</RootParagraphStyleGroup>Identity and inheritance
| Attribute · ParagraphStyle | Type / values | Support | Notes |
|---|---|---|---|
| Self | string id | Supported | The style id, e.g. "ParagraphStyle/Body". What a paragraph references via AppliedParagraphStyle. A colon in the name encodes as %3a inside Self. |
| Name | string | Parsed, not yet rendered | Human-readable name; the [No paragraph style] root uses the $ID/ form. Informational — resolution keys on Self, not Name. |
| BasedOn | string id | Supported | The parent style id, or the root sentinel. May also appear as a <BasedOn> child inside <Properties>; both forms are read. Drives the cascade. |
Character defaults
These carry the font, size, and colour a paragraph's text starts from. They are
the same attributes a character style can
override, and a run can override again locally. AppliedFont may appear as an
attribute or as an <AppliedFont> child inside <Properties>.
| Attribute · ParagraphStyle | Type / values | Support | Notes |
|---|---|---|---|
| AppliedFont | string (font family) | Supported | Font family name. Attribute or <AppliedFont> Properties child. The renderer resolves it against the fonts supplied to it. |
| FontStyle | string (e.g. "Regular", "Bold") | Supported | Named face within the family. |
| PointSize | double (pt) | Supported | Type size in points. |
| FillColor | string (Color/Swatch id) | Supported | Glyph fill; a reference into Resources/Graphic.xml. |
| FillTint | double (0–100%) | Supported | Fill tint percentage; absent means use the swatch at full strength. |
| StrokeColor | string (Color/Swatch id) | Supported | Glyph outline paint. "Swatch/None" normalises to unset so the cascade can fall through. |
| StrokeWeight | double (pt) | Supported | Outline weight when StrokeColor resolves. |
| Tracking | double (1/1000 em) | Supported | Inter-glyph spacing added to every advance; divide by 1000 for the em fraction. |
| Capitalization | Normal | SmallCaps | AllCaps | CapToSmallCap | Supported | AllCaps uppercases before shaping; SmallCaps approximated until OpenType smcp lands. |
| Position | Normal | Superscript | Subscript | OTSuperscript | OTSubscript | Parsed, not yet rendered | Baseline position; captured but scaling/shift not yet applied. |
| Underline | boolean | Supported | Underline decoration. |
| StrikeThru | boolean | Supported | Strike-through decoration. |
Paragraph geometry
Justification is parsed into a typed enum; an unrecognised value falls through to
the cascade (effectively left-aligned). The binding-aware values
ToBindingSide / AwayFromBindingSide are accepted and treated as
LeftAlign / RightAlign because binding side is not yet plumbed through.
| Attribute · ParagraphStyle | Type / values | Support | Notes |
|---|---|---|---|
| Justification | LeftAlign | CenterAlign | RightAlign | LeftJustified | CenterJustified | RightJustified | FullyJustified | ToBindingSide | AwayFromBindingSide | Supported | Horizontal alignment. FullyJustified currently composes like LeftJustified; binding-aware values fall back to Left/Right. |
| FirstLineIndent | double (pt) | Supported | Extra indent on the first line of the paragraph. |
| SpaceBefore | double (pt) | Supported | Vertical space added above the paragraph. |
| SpaceAfter | double (pt) | Supported | Vertical space added below the paragraph. |
| Hyphenation | boolean | Supported | IDML default is true; an explicit false disables the hyphenator for the paragraph. |
| AppliedLanguage | string (e.g. "$ID/English: USA") | Supported | Picks the hyphenation dictionary; unknown values fall back to English-US. |
| MinimumWordSpacing / DesiredWordSpacing / MaximumWordSpacing | double (% of normal) | Supported | Justification word-spacing range; drives the composer's shrink/stretch ratios. |
| DropCapCharacters / DropCapLines | short | Supported | Number of leading characters that drop, and how many lines they span. |
The parser reads a number of further families off <ParagraphStyle> — a
<TabList> of <TabStop> children, bullets-and-numbering attributes
(BulletsAndNumberingListType, NumberingExpression, NumberingFormat, …),
letter/glyph-spacing knobs, paragraph shading / rules / borders, and CJK kinsoku /
mojikumi references. Those belong to the typography and
lists chapters; this page covers the core formatting an
ordinary paragraph applies.
One attribute is read and deliberately not acted on: NextStyle. It only affects
which style InDesign applies to the next paragraph as you type, so it has no
bearing on rendering an existing document. Parsed, not yet renderedNextStyle (authoring-only)
Frequently asked questions
What is the difference between a paragraph style and a character style? A paragraph style formats a whole paragraph — its alignment, indents, and spacing — and also carries the character defaults (font, size, fill) its text starts from. A character style formats only a run inside a paragraph and usually sets just the few attributes that differ from the surrounding text.
Where do paragraph styles live in an IDML package?
Every <ParagraphStyle> sits inside <RootParagraphStyleGroup> in
Resources/Styles.xml. InDesign may nest user styles inside intermediate
<ParagraphStyleGroup> elements, but the parser flattens these and keys every
style by its Self id, so grouping does not affect resolution.
What does a paragraph reference to get its formatting?
A paragraph names its paragraph style through AppliedParagraphStyle, whose value
is the style's Self id. The parser then resolves that style down its
BasedOn chain to a full set of values.
Are there paragraph-style attributes the parser reads but does not render?
Yes. NextStyle is authoring-only — it only affects which style InDesign applies
to the next paragraph as you type — and Position is captured but not yet
scaled or shifted. Both are flagged as parsed-not-rendered in the tables above.
The cascade
BasedOn links a style to a parent; the parser folds that chain into one resolved set of values, bounds cycles with a depth cap, and lets a local override on a range still win.
Character styles
The CharacterStyle element and its attributes — identity, BasedOn, font and size, fill, tracking — the RootCharacterStyleGroup, and how a range that applies a character style can still override one of its attributes locally.