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

Broken table structure: TD outside TR, TR outside Table

Blocker Checkpoint 09: Appropriate Tags WCAG 1.3.1 (A)

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.

  1. Open the Tags panel and expand the <Table>.
  2. For a TD sitting directly under the Table: create a <TR> (right-click the TableNew Tag → type TR), then drag the loose cells into it.
  3. For a TR outside its table: drag it back inside.
  4. For a stray <P> between rows: decide what it is. A caption belongs in a <Caption> as the first child of the Table; a note belongs outside the table entirely.
  5. Right-click the TableTable 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

Standards this condition maps to
StandardReference
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.

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 — every machine-checkable Matterhorn condition, no watermark, no expiry, and no account needed up to 60 pages.

Check a PDF free

Verified against a real document on . Last updated .