Matterhorn 09-002 · PDF/UA-1 UA1:7.2-1

A table inside a heading: tags nested without sense

Human decisionCheckpoint 09: Appropriate TagsWCAG 1.3.1 (A)

Nesting that is syntactically legal but semantically nonsense — a Table inside an H2, a paragraph containing a section.

The condition, as the protocol states it. “Structure elements are nested in a semantically inappropriate manner. (e.g., a table inside a heading).”

Matterhorn Protocol 1.1, checkpoint 09, index 09-002, section UA1:7.2-1. The protocol marks this as requiring human judgement.

What a screen reader actually does

Structural navigation breaks: jumping by heading lands inside a table, jumping by table lands inside a heading.

What the condition covers

A structure tree says what contains what. A section contains its heading and paragraphs; a list item contains a label and a body; a table contains rows, and rows contain cells. Condition 09-002 is a tree that says something contains another thing it cannot meaningfully contain.

The protocol’s example is a table inside a heading:

/Document
├── /H2                         ← the heading "contains" a table
│   └── /Table
│       ├── /TR  /TD "Region"  /TD "Q1"
│       └── /TR  /TD "North"   /TD "4,120"
└── /P  "Revenue rose over the year."

Others in the same family: a Sect inside a P, so a paragraph contains a whole section; a chapter’s worth of paragraphs inside a Link; body text inside a Caption; a Figure holding the paragraphs that follow it. Each is valid PDF. None is a document anybody wrote.

The grammar ISO 32000-1 does define — tables, lists, tables of contents, ruby, warichu — is checked separately, as 09-004 to 09-008. A TR outside a Table is one of those. A Table inside an H2 breaks no grammar at all, which is why it needs a person.

What the user hears

Navigation that lands in the wrong place, with the wrong thing attached. A reader that names a heading by its contents names this one by the table inside it, so the heading list has an entry made of cell values. Jumping to the heading lands at a table; jumping to the table lands inside a heading. A paragraph that contains a section tells the reader that the section, heading and all, is part of one paragraph.

The text is all still there. What the nesting has destroyed is the outline — which part of the document belongs to which.

Where it comes from

Tags panel accidents. Adobe’s Content and Tags panel documentation says a line appears at viable locations as you drag a tag; a drop in the wrong place can make the moved element a child of its neighbour instead of a sibling. Paste Child, which places a cut tag inside the selected one, does the same deliberately, and sits next to Paste in the menu.

Auto-tagging by layout. A tagger that wraps everything inside a visual box in one container can wrap a heading’s container around the table drawn under it.

Merged trees. Combining documents can graft one document’s tree inside an element of another’s, rather than beside it.

How to check it free

This is a review of the tree’s shape, and Acrobat Pro shows it directly.

  1. Open the Tags panel. Adobe’s documentation gives Ctrl-click (Windows) or Option-click (macOS) on the plus sign or triangle beside the Tags root to expand the whole tree at once.
  2. Turn on Highlight Content from the Options menu.
  3. Read the tree for containers under elements that normally hold text. Headings, P, Span, Link and Lbl rarely need to contain anything bigger than a span; a block container (Sect, Div, Table, L) underneath one of them is worth a look. Table cells are different — they can legitimately hold lists, paragraphs and even tables.
  4. For each, ask the question the condition asks: does the outer element really contain the inner one?

Acrobat’s Accessibility Checker checks list and table structure (List items, Lbl and LBody, Rows, TH and TD) and heading nesting (Appropriate nesting), as listed on Adobe’s accessibility checker page. A table inside a heading passes all of those.

How to fix it free, in Acrobat Pro

Move the inner element out. From Adobe’s documentation of the Tags panel:

  • Drag the tag to where it belongs. A line appears at viable locations; watch where it lands before you let go.
  • Or select it, choose Cut from the Options menu, select the tag above where it should go, and choose Paste, which places it at the same level. Paste Child places it inside the selected tag — use that only when the selected tag really is its container.

For the table-in-a-heading: cut the Table, select the H2, and Paste — the table moves to the same level as the heading instead of inside it. If the heading should then head a section, create one with New Tag (type Sect) and move the heading and its content into it; 14-006 explains when that matters.

Work with Highlight Content on, save a copy first, and check the reading order afterwards: moving an element changes where it is read as well as what contains it.

What Taggart does

Taggart has no check for 09-002. It raises no 09-002 finding, so the condition does not appear in the review queue or in the conformance statement’s count of undecided judgements.

It does check the part of nesting that ISO 32000-1 defines: table structure (09-004), list structure (09-005), tables of contents (09-006), ruby and warichu. Those are machine-checkable failures with the offending parent and child named. A Table inside an H2 with well-formed rows passes all of them.

For the review, the reading-order editor shows the tree indented by depth, with each element’s role, so a block container under a heading is visible at a glance. It moves an element among its siblings — the reading order — but not into a different parent, which is what this condition usually needs; that move is done in Acrobat.

How Taggart handles it

No software can decide this one, and Taggart has no check for it, so it never appears among the findings or in the review queue. It is on the list of conditions Taggart asks you to confirm by hand before it writes the PDF/UA claim into the file — the claim waits until you have.

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

Doesn't ISO 32000-1 already say what may contain what?

For some types. Tables, lists, tables of contents, ruby and warichu have a defined grammar, and breaking it is a machine-checkable failure — conditions 09-004 to 09-008. Outside those, the standard is permissive: Adobe's own summary is that inline elements may be contained in or contain block-level ones. Legality is not the test here; meaning is.

Is a list inside a table cell a problem?

No. Adobe's documentation says table cells can contain lists, paragraphs, form fields or another table, and that is ordinary structure: the cell holds the list. The question to ask of any nesting is whether the outer element really contains the inner one, the way a section contains its heading and a cell contains its content.

What about headings nested inside sections?

That is correct, and in the strong-structure model it is how heading levels work. Adobe's documentation puts it as a heading appearing as the first child of a higher-level division. The failure is the other way round: a heading that contains the section.

How does it usually happen?

By accident, mostly. A drag in the Tags panel that drops a tag onto another instead of between two, or a Paste Child where Paste was meant, puts an element inside its neighbour. Auto-tagging that groups by layout boxes does it too.

Where this sits in the standards

Standards this condition maps to
StandardReference
Matterhorn Protocol 1.1Checkpoint 09 (Appropriate Tags), index 09-002
PDF/UA-1 (ISO 14289-1)Clause 7.2-1
WCAG 2.11.3.1 Info and Relationships — Level A
EN 301 549 / Section 508 / ADA Title IIAll 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 09

Checkpoint 09 covers appropriate tags. 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 — 75 of the 87 Matterhorn conditions software can decide, with the other 12 listed for you to confirm; no watermark, no expiry, and no account needed up to 60 pages.

Check a PDF free

This condition needs a person’s judgement, so there was nothing for a tool to check. Written from ISO 14289-1 and the Matterhorn Protocol on . The Acrobat steps follow Adobe’s documentation and were not walked through by hand. Last updated .