Matterhorn 09-004 · PDF/UA-1 UA1:7.2-1
Broken table structure: TD outside TR, TR outside Table
The table grammar is broken: a TD outside a TR, a TR outside Table/THead/TBody/TFoot, a Table with no rows.
The condition, as the protocol states it. “A table-related structure element is used in a way that does not conform to the syntax defined in ISO 32000-1, Table 337.”
Matterhorn Protocol 1.1, checkpoint 09, index 09-004, section UA1:7.2-1. Software can decide this one on its own.
What a screen reader actually does
Table navigation collapses. The reader either refuses table mode or announces cells with no row/column context.
The grammar
ISO 32000-1, Table 337, in full:
Table
├── Caption optional
├── THead → TR → TH
├── TBody → TR → TH | TD
└── TFoot → TR → TH | TD
Plus: TR may appear directly under Table without a row group. That is the whole vocabulary. Anything else at those positions is condition 09-004.
The failures that actually occur:
A TD directly under Table. Auto-taggers produce this when they detect cells but not rows.
A TR under a Div or Sect. Usually the result of somebody dragging tags around in Acrobat to fix reading order and dropping a row outside its table.
A Table with no rows. The container exists and is empty, or contains only P elements.
A P between two TR elements. A caption or a note that landed inside the table body.
Why it matters more than it looks
A screen reader builds a grid model from the structure. It needs to know how many rows and columns there are before it can offer table navigation at all — the Ctrl + Alt + arrow keys that move cell to cell and announce headers.
Given a broken grammar it cannot build that model. The behaviour then depends on the reader: some refuse table mode and read the cells as a run of paragraphs, losing every row and column relationship; others announce a table with the wrong dimensions, which is worse because the user believes the structure.
Either way, the header associations you carefully set with /Scope never get used, because nothing ever enters table mode to use them.
How to find it free
The Acrobat tell: right-click the <Table> in the Tags panel. If Table Editor is greyed out, the grammar is broken. This is the fastest diagnostic there is.
veraPDF: verapdf --flavour ua1 file.pdf reports it under clause 7.2.
The Tags panel: expand the table and read the nesting. Table → TR → TD is right. Anything else is not.
How to fix it free, in Acrobat Pro
There is no repair command; it is structural editing in the Tags panel.
- Open the Tags panel and expand the
<Table>. - For a
TDsitting directly under theTable: create a<TR>(right-click theTable→ New Tag → type TR), then drag the loose cells into it. - For a
TRoutside its table: drag it back inside. - For a stray
<P>between rows: decide what it is. A caption belongs in a<Caption>as the first child of theTable; a note belongs outside the table entirely. - Right-click the
Table→ Table Editor. If it opens, the grammar is now valid.
Upstream is dramatically better here. A real table made in Word or InDesign — not a grid of tab stops, an actual table object — exports with correct grammar every time. If the source has a real table and the PDF does not, the export settings are wrong; check Create Tagged PDF in InDesign or Document structure tags for accessibility in Word.
Where Taggart differs
Taggart validates the grammar as a grammar rather than reporting a generic “table problem”. Each finding names the parent, the child and what was permitted:
<Table>contains a<TD>child, which the table structure grammar (ISO 32000-1, Table 337) does not permit (allowed:<Caption>,<TBody>,<TFoot>,<THead>,<TR>).
and separately:
<TR>appears inside<Div>but the table structure grammar requires it to be inside<TBody>,<TFoot>,<THead>,<Table>.
The mechanical part of the repair — wrapping loose cells in a <TR> — is applied automatically and reported line by line. Anything requiring a judgement about what a stray element actually is stays with you, because the answer depends on what the document means rather than on what the grammar allows.
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 table structure. 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 Acrobat's Table Editor greyed out on my table?
Almost always because the grammar is broken. The Table Editor needs a well-formed Table containing TR elements containing TH or TD cells. If a TD is sitting directly under the Table, or a TR under a Div, the editor cannot build its grid and refuses to open. Fixing the grammar is what un-greys it.
What is the actual rule?
Table contains TR, THead, TBody, TFoot or Caption. THead, TBody and TFoot contain TR. TR contains TH or TD. Nothing else is permitted at those positions. That is ISO 32000-1 Table 337 in full.
Is a table inside a table allowed?
Yes, nested inside a cell, and it is legal but hostile to read. If you can restructure it into two tables, do. If not, every cell in both tables needs explicit Headers references, because Scope cannot cross the nesting boundary.
What if my Table has no rows at all?
Then it is not a table. Taggart reports it as a separate case — a Table element whose children contain no TR and no row group — because it usually means an auto-tagger created the container and never populated it.
Where this sits in the standards
| Standard | Reference |
|---|---|
| Matterhorn Protocol 1.1 | Checkpoint 09 (Appropriate Tags), index 09-004 |
| 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
- 15-003 A TH cell does not contain a Scope attribute Header cells must declare whether they head a row, a column, or both, unless the table instead uses explicit /Headers ID references on every data cell.
- 15-005 A given cell's header cannot be unambiguously determined In a complex table — merged cells, stacked header rows, split spans — Scope alone cannot express the associations, so explicit /Headers references are required.
- 09-005 A list-related structure element does not conform to ISO 32000-1, Table 336 The list grammar is broken: an LI outside an L, an Lbl or LBody outside an LI, a list item with no LBody.
- 15-004 Content is tagged as a table for information not organized in rows and columns A table used purely to position content on the page — a two-column layout, a form arrangement — has been tagged as a real table.
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 order The 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 manner Nesting 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 mapping Once role mapping has been resolved, the effective type still does not describe the content.
- 09-005 A list-related structure element does not conform to ISO 32000-1, Table 336 The list grammar is broken: an LI outside an L, an Lbl or LBody outside an LI, a list item with no LBody.
- 09-006 A TOC-related structure element does not conform to ISO 32000-1, Table 333 TOCI appears outside a TOC, or a TOC contains children other than TOC and TOCI.
- 09-007 A Ruby-related structure element does not conform to ISO 32000-1, Table 338 RB, 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 338 WT 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 — every machine-checkable Matterhorn condition, no watermark, no expiry, and no account needed up to 60 pages.
Verified against a real document on . Last updated .