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

Table of contents tags: what TOC and TOCI may hold

BlockerCheckpoint 09: Appropriate TagsWCAG 1.3.1 (A)

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:

  1. Entries outside the list: create a TOC where the first entry is and drag every TOCI into it, in order.
  2. A P or Link directly in the TOC: create a TOCI for each and drag the element into it.
  3. A Link directly in a TOCI: create a Reference (or P) inside the entry and drag the Link into it.
  4. A TOCI inside a TOCI: create a TOC inside 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 Link directly in a TOC is given an entry on the first run, which leaves TOCI → Link. A second run puts the link in a P.
  • A TOCI directly inside a TOCI is treated as loose content and wrapped in a P. That still fails — the report then says <TOCI> appears inside <P> — and the nested TOC has 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

Standards this condition maps to
StandardReference
Matterhorn Protocol 1.1Checkpoint 09 (Appropriate Tags), index 09-006
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

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 .