Matterhorn 14-006 · PDF/UA-1 UA1:7.4.4-1

Two headings under one node, in strong structure

Blocker Checkpoint 14: Headings WCAG 1.3.1 (A)

In the strong-structure model, an unnumbered H derives its level from nesting depth, so a single structural node may contain at most one H.

The condition, as the protocol states it. “A node contains more than one <H> tag.”

Matterhorn Protocol 1.1, checkpoint 14, index 14-006, section UA1:7.4.4-1. Software can decide this one on its own.

What a screen reader actually does

Two headings at the same node cannot both be levelled; readers report inconsistent levels.

The model this belongs to

PDF has two ways to express heading level and a document has to pick one. Condition 14-007 is about mixing them; this one is about getting the less common of the two wrong.

Weak structure puts the level in the tag: H1 through H6. The tree is flat and the level is read straight off the element type.

Strong structure puts it in the shape. The tag is always H, and its level is how deeply the Sect elements around it are nested:

/Document
└── /Sect                    ← depth 1
    ├── /H   "Annual report"         = level 1
    └── /Sect                ← depth 2
        ├── /H  "Results"            = level 2
        └── /P  "Revenue rose…"

It is the more principled design — the level is a fact about the document’s shape rather than a number somebody typed — and it depends entirely on there being exactly one H per node. That is what this condition enforces.

What breaks with two

/Sect
├── /H   "Annual report"
├── /H   "Third quarter results"     ← both at depth 1
└── /P   "Revenue rose…"

Both headings are at the same nesting depth, so both are level 1, so this section has two level-one headings and no subsection. The document’s shape says the two titles are peers covering the same content, which is almost never what the author meant — they meant a heading and a subheading, and the subheading needed a nested Sect to live in.

A reader building a heading list gets two entries at the same level with the second one’s content belonging to neither. A reader computing outline depth has nothing to compute: the structure does not distinguish a section with a title and a subtitle from two sections where the second forgot to open.

What the user hears

A heading list that does not match the document. Both strings announced at the same level, with the material under them attached to whichever the reader decided was in force.

It is quieter than most heading failures — nothing disappears and nothing is announced with the wrong role — which is why it survives review. What it costs is the thing headings exist for: a user jumping heading to heading cannot tell the shape of the document from the shape of the list.

Where it comes from

Hand editing in Acrobat. The Tags panel’s New Tag dialog offers Heading alongside Heading Level 1 through 6. Choosing Heading inserts a bare H. Do it twice in one section and this is the result — and in a document that otherwise uses numbered headings it produces 14-007 at the same time, which is the louder of the two and usually what gets reported.

A generator with a strong-structure model and a flat emitter. It writes H for every heading correctly and never opens a nested Sect, so the whole document is one node with every heading in it.

Merged documents where two Sect subtrees were concatenated into one.

How to check it free

Acrobat Pro’s Tags panel. Expand the tree and read the element types. Two elements showing Heading — not Heading 1, just Heading — under the same parent is the condition, and it is visible without any tool.

veraPDF reports it against clause 7.4.4.

PAC groups it under Logical Structure → Headings.

How to fix it free, in Acrobat Pro

Decide what the second heading is, because the two repairs are different documents.

If it is a subheading of the first, give it a section to be in:

  1. Tags panel → Options → New TagSection (Sect), placed after the first H.
  2. Drag the second H into it, along with the content that belongs under it.

Its level is now 2 because its depth is 2, and nothing else changes.

If it begins a new section at the same level, close the first one:

  1. Create a second Sect as a sibling of the first.
  2. Move the second H and its content into it.

If the document is really a numbered-heading document with one stray H — check this first, it is the likeliest case — convert the bare H to the numbered level it should have and this condition and 14-007 both go away. Right-click → PropertiesTag tab → Type.

Where Taggart differs

Taggart reports which model the document is predominantly in before reporting the violation, because that is what decides the repair:

2 H elements under one node. This document uses the numbered model for 41 of its 43 headings; the 2 untyped H elements are at page 7 and page 12.

Forty-one numbered headings and two bare ones is not a strong-structure document with a nesting bug. It is a numbered-heading document with two elements somebody added by hand, and the repair is two type changes rather than a restructuring — which is also why this is reported alongside 14-007 rather than on its own.

heading-levels will make the type change, and the level it infers for each H comes from the outline around it — the nearest preceding numbered heading, plus one where the element is nested inside it — shown before it is applied. In a genuinely strong-structure document it proposes the Sect nesting instead and does not apply it, because moving content between sections is a change to what the document says its shape is, and that is not a decision a batch should make.

How Taggart handles it

Taggart detects this condition automatically. It is reported as a blocker, with the page, the structure path and the object id of every occurrence.

The fix is Repair heading levels. It is mechanical, so “Fix All Safe” applies it in bulk with a diff and a single undo.

Whatever Taggart changes, the page still looks identical. Fixes edit the PDF object model, not the content streams, and every remediation is re-rendered and compared against the original at structural similarity ≥ 0.999 before you get the file back. A tool that quietly reflows your document is worse than no tool.

Frequently asked questions

Why is one heading per node a rule?

Because in strong structure the heading's level *is* its nesting depth, and a node has one depth. Two H elements under the same Sect are both at that depth, so both claim to be the heading of the same section, and nothing in the file says which — or whether the second one begins a section that was never opened.

What if a section genuinely has a title and a subtitle?

Then they are one heading and one paragraph, or two nested sections. A subtitle is not a second heading of the same section; it is either part of the title or the start of something. The tree has to commit to one reading, because that is what a reader navigates by.

Does this apply to H1–H6 documents?

No. This is the strong-structure model only, where a bare H takes its level from Sect nesting. In the numbered model the level is in the tag, so two H2 elements under one node are unremarkable — they are two level-two headings. Mixing the two models at all is a separate condition, 14-007.

How would I even have this?

By using the strong-structure model, which is rare, or by editing a tree by hand and reaching for Acrobat's plain "Heading" tag instead of a numbered one. The second is much more common and usually produces 14-007 as well.

Where this sits in the standards

Standards this condition maps to
StandardReference
Matterhorn Protocol 1.1 Checkpoint 14 (Headings), index 14-006
PDF/UA-1 (ISO 14289-1) Clause 7.4.4-1
WCAG 2.1 1.3.1 Info and Relationships — Level A
EN 301 549 / Section 508 / ADA Title II All three point at WCAG 2.1 Level AA for non-web documents, so a Level A or AA criterion here is in scope for each of them.

Other conditions in checkpoint 14

Checkpoint 14 covers headings. These are its other failure conditions; the ones without a link are in the rule set but do not have a written page yet.

Check your own file. Taggart’s validator is free and unlimited — every machine-checkable Matterhorn condition, no page cap, no watermark, no account needed.

Check a PDF free

Verified against a real document on . Last updated .