Matterhorn 09-006 · PDF/UA-1 UA1:7.2-1
Table of contents tags: what TOC and TOCI may hold
TOCI appears outside a TOC, or a TOC contains children other than TOC and TOCI.
The condition, as the protocol states it. “A TOC-related structure element is used in a way that does not conform to Table 333 in ISO 32000-1.”
Matterhorn Protocol 1.1, checkpoint 09, index 09-006, section UA1:7.2-1. Software can decide this one on its own.
What a screen reader actually does
The table of contents is not announced as a navigable structure.
The grammar
A table of contents in a tagged PDF is two structure types, and they work much like the list grammar of 09-005. TOC is the list; TOCI is one entry in it. ISO 32000-1, Table 333, says what each may hold:
/TOC
├── /Caption optional — "Contents"
├── /TOCI
│ ├── /Lbl "1"
│ ├── /Reference the title and page number…
│ │ └── /Link …usually as a link to the heading
│ └── /NonStruct wrapper for the leader dots (an artifact)
└── /TOCI
├── /P "2 Method"
└── /TOC sub-entries go in a nested TOC
└── /TOCI
└── /P "2.1 Sample"
A TOC holds TOCI entries and nested TOC lists. Table 333 itself does not mention Caption; veraPDF and Taggart both accept one. A TOCI may hold Lbl, Reference, NonStruct, P and TOC — nothing else. Condition 09-006 is any element that breaks those two rules, or a TOCI standing outside a TOC.
The four shapes that fail
Entries outside the list. TOCI elements sitting directly in a Document or Sect, with no TOC around them. It comes from dragging entries during a reading-order repair, or from a converter that creates the entries and not the container.
Something other than an entry in the list. A P or a Link directly inside the TOC: entries that never got their TOCI.
A link straight inside an entry. TOCI → Link. It looks reasonable and it is not in Table 333. The link should sit inside a Reference or a P — and, wherever it sits, still needs its object reference to the annotation (28-011).
A sub-entry straight inside an entry. TOCI → TOCI, with no nested TOC between them. The hierarchy is right in spirit and wrong in the tree.
What the reader loses
A table of contents is navigation, and the grammar is what tells software that this block is the navigation. Entries outside a TOC are no longer part of any list; they are free-standing items with nothing to say where the contents begin, where they end, or how many entries there are. Nested entries without their TOC lose the level they were at.
The TOCI → Link shape is quieter. The link usually still works and its text is still read, so a screen-reader user may notice nothing. It fails because a validator, a reflow or an export to another format reads the grammar, and the grammar says this entry contains something it may not.
How to check it free
Acrobat Pro’s Tags panel. Adobe documents it under View → Show/Hide → Side Panels → Tags (the hamburger menu on Windows). Expand the <TOC> and read each <TOCI>’s children against the list above. Turn on Highlight Content from the panel’s Options menu so each tag outlines what it covers on the page. (Adobe: Edit document structure with the Content and Tags panels)
Acrobat’s Accessibility Checker will not help here. Adobe’s list of its rules has checks for lists, tables and headings, and none for tables of contents. (Adobe: Create and verify PDF accessibility)
veraPDF. Its PDF/UA-1 profile has three rules for this: 7.2-26 (a TOCI must be inside a TOC), 7.2-27 (a TOC may contain only TOC, TOCI and Caption) and 7.2-28 (a Caption only as the first child). It does not test what a TOCI contains. (veraPDF PDF/UA-1 rules)
How to fix it free, in Acrobat Pro
Every repair is the same two moves: create the missing container, then drag the right elements into it. From Adobe’s Tags panel documentation:
- To create a container inside an element, select the parent, choose New Tag from the Options menu, pick the type from the Type menu — or type it, which the dialog allows — and click OK.
- To move an element, drag it; a line shows where it will land. Or Cut, select the target, and Paste Child.
- To change an element’s type, select it, choose Properties from the Options menu, and pick a new type from the Type menu.
Shape by shape:
- Entries outside the list: create a
TOCwhere the first entry is and drag everyTOCIinto it, in order. - A
PorLinkdirectly in theTOC: create aTOCIfor each and drag the element into it. - A
Linkdirectly in aTOCI: create aReference(orP) inside the entry and drag theLinkinto it. - A
TOCIinside aTOCI: create aTOCinside the parent entry and drag the sub-entries into it.
If the contents page came from the authoring tool’s own contents feature, fixing the export is cheaper than any of this, and it stays fixed for the next revision. A contents page typed by hand — dots and page numbers included — gives the exporter nothing to say it is a contents page, so expect paragraphs: not this condition, but no table of contents either.
Where Taggart differs
Taggart checks both directions — what a TOC and a TOCI may hold, and where a TOCI may stand — and names the element and the rule it broke:
<TOCI>contains a<Link>child, which the TOC structure grammar (ISO 32000-1, Table 333) does not permit (allowed:<Lbl>,<NonStruct>,<P>,<Reference>,<TOC>).
So it catches the TOCI → Link shape that veraPDF’s PDF/UA-1 profile passes. It does not check where a Caption sits in the TOC, which veraPDF’s 7.2-28 does.
The repair, toc-structure, runs with the safe fixes. It changes no meaning, only containers: content standing loose in an entry goes into a P; an element standing directly in a TOC gets a TOCI of its own; entries standing outside any TOC are gathered, with the entries beside them, into one. Children keep their order and their content.
It has two limits, and the re-check that follows every repair reports what is left:
- A
Linkdirectly in aTOCis given an entry on the first run, which leavesTOCI → Link. A second run puts the link in aP. - A
TOCIdirectly inside aTOCIis treated as loose content and wrapped in aP. That still fails — the report then says<TOCI>appears inside<P>— and the nestedTOChas to be added by hand, as in step 4 above.
How Taggart handles it
Taggart checks for this condition automatically and reports it as a blocker, with where in the file it found it.
The fix is Give table-of-contents entries the structure the standard requires. It is mechanical, so “Fix All Safe” applies it along with the others in one pass and lists what it changed. Your original file is never modified.
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
Can a TOCI hold a Link directly?
Not under ISO 32000-1. Table 333 lists what an entry's children may be — Lbl, Reference, NonStruct, P and TOC — and Link is not among them. Put the Link inside a Reference or a P. veraPDF's PDF/UA-1 rules do not test what a TOCI holds, so a file can pass veraPDF and still fail this condition.
How do I nest sub-entries?
Inside a TOC of their own, placed in the parent entry: TOCI → TOC → TOCI. A TOCI placed straight inside another TOCI is the shape to look for in a hierarchical contents page, and it is the one shape Taggart's repair does not clear.
My contents page is tagged as ordinary paragraphs. Does that fail 09-006?
No. This condition only applies once TOC or TOCI is used. Whether a contents page tagged as P is acceptable is a different question — whether P is the most appropriate type for it — and that is a judgement, not a grammar check.
Does a list of figures count?
ISO 32000-1 says lists of figures, lists of tables and bibliographies can be treated as tables of contents for tagging purposes. If you tag them that way, the same grammar applies.
Where this sits in the standards
| Standard | Reference |
|---|---|
| Matterhorn Protocol 1.1 | Checkpoint 09 (Appropriate Tags), index 09-006 |
| PDF/UA-1 (ISO 14289-1) | Clause 7.2-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. |
Related conditions
- 09-005 A list-related structure element does not conform to ISO 32000-1, Table 336The list grammar is broken: an LI outside an L, an Lbl or LBody outside an LI, a list item with no LBody.
- 28-011 A link annotation is not nested within a Link tagA link annotation must be a child of a Link structure element containing the link's text, joined by an object reference (/OBJR).
- 19-002 References are not tagged as ReferenceThe in-text citation marker is not tagged as a Reference pointing at the note.
- 09-002 Structure elements are nested in a semantically inappropriate mannerNesting that is syntactically legal but semantically nonsense — a Table inside an H2, a paragraph containing a section.
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.
- 09-001 Tags are not in logical reading orderThe order of elements in the structure tree does not match the order a human would read the page. This is the single most common substantive defect in tagged PDFs and the one Acrobat's own tooling handles worst.
- 09-002 Structure elements are nested in a semantically inappropriate mannerNesting that is syntactically legal but semantically nonsense — a Table inside an H2, a paragraph containing a section.
- 09-003 Structure type is not semantically appropriate after role mappingOnce role mapping has been resolved, the effective type still does not describe the content.
- 09-004 A table-related structure element does not conform to ISO 32000-1, Table 337The table grammar is broken: a TD outside a TR, a TR outside Table/THead/TBody/TFoot, a Table with no rows, or rows that span different numbers of columns.
- 09-005 A list-related structure element does not conform to ISO 32000-1, Table 336The list grammar is broken: an LI outside an L, an Lbl or LBody outside an LI, a list item with no LBody.
- 09-007 A Ruby-related structure element does not conform to ISO 32000-1, Table 338RB, RT or RP appears outside a Ruby element, or Ruby has an illegal child sequence.
- 09-008 A Warichu-related structure element does not conform to ISO 32000-1, Table 338WT or WP appears outside a Warichu element, or Warichu has an illegal child sequence.
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.
Checked with Taggart on a generated file that fails this condition on . The Acrobat steps follow Adobe’s documentation and were not walked through by hand. Last updated .