Skip to content
§9.5.1

Blank and Spacer Rows

An empty row—meaningful structure or just spacing?

⚖️ Equivalent formsTwo renderings conform. A document uses one of them throughout.📄 Page ruleCan be applied from the page alone.Read §9.5.1 in the RFC ↗

The requirement

A genuinely printed blank row inside a table MAY be rendered as an empty row or left out; both forms conform, and a document MUST use one of them throughout. A blank row that is the only thing separating two groups of rows SHOULD be rendered as an empty row.

When it applies

Sketch of the printed page — layout, not output
| ROU assets total   | 10,234 |
|                    |        |   ← printed blank row: on this page it is the
| Lease liabilities: |        |     only section boundary — rendered as an empty row

Reading the examples. Each one pairs a source page with the output the rule expects. ✅ Sample: the rule applies. ❌ Counter-sample: it looks like it applies and does not, or a rendering got it wrong. A non-conforming output, in red, is shown only for contrast. … marks content left out of an excerpt.

When the blank row is load-bearing

On a page with no rules, no bands and no repeated headers, the whitespace is the structure. Dropping a blank row there merges two sections the page deliberately kept apart — as in a lease note where a single blank line is all that separates the right-of-use totals from "Lease liabilities:".

  • A blank row whose removal would change how a reader groups the rows around it SHOULD be rendered as a row of empty cells, in its printed position.
  • A purely decorative blank line — even spacing between every row, padding at the foot of a block — carries no such meaning and MAY be left out.
  • An empty row MUST NOT be rendered where the page prints none: the row is kept because it is printed, never added to make groups easier to read.
01

✅ SampleThe rule applies

A genuinely printed blank row separates the 00xx class codes from the 01xx codesert

A genuinely printed blank row separates the 00xx class codes from the 01xx codes, in every block; it is kept as a row of empty cells. The four side-by-side CLASS CODE | ELR | D RATIO blocks continue one class-code series, so each block is its own table (see Column Continuation (§9.2.2)); the first is shown.

Source page
Blank and Spacer Rows — A genuinely printed blank row separates the 00xx class codes from the 01xx codes. Source page.
Expected output · table 1 of 4
CLASS CODE ELR D RATIO
0010 0.912 0.42
0015 0.955 0.41
0025 0.972 0.38
0040 1.164 0.40
0100 0.888 0.39
0115 1.010 0.41
0130 0.842 0.37
0145 1.075 0.42
Blank and Spacer Rows · Source page

A genuinely printed blank row separates the 00xx class codes from the 01xx codes

Blank and Spacer Rows — A genuinely printed blank row separates the 00xx class codes from the 01xx codes. Source page.
02

✅ SampleThe rule applies

In the long-cruise timetablelakecruise

In the long-cruise timetable, a fully empty row is printed between the outbound run ending at Seeblick ○ and the return run starting at Seeblick; it is the only boundary between the two direction segments and is kept. Stop rows printed in heavier type are bold cell by cell. The header symbol under each service number is ⊛.

Source page
Blank and Spacer Rows — In the long-cruise timetable. Source page.
Expected output · table 1 of 2, excerpt around the blank row
Täglich
Daily
Kurs / Service 101/102 103/104 105/106 107/108 109/110 113/114 117/118
⊛ ⊛ ⊛ ⊛ ⊛ ⊛ ⊛
Lindenhafen 09.20 10.20 11.20 12.20 13.20 15.20 17.20 Lindenhafen
Aurenbach 09.47 ↓ ↓ 12.47 13.47 ↓ ↓ Aurenbach
…
Ufeninsel 11.19 12.19 13.19 14.19 15.19 17.19 19.29 Ufeninsel
Seeblick ○ 11.30 12.30 13.30 14.30 15.30 17.30 19.40 ○ Seeblick
Seeblick 11.40 12.40 13.40 14.40 15.40 17.40 19.45 Seeblick
Ufeninsel 11.53 12.51 13.51 14.53 15.53 17.51 19.56 Ufeninsel
…
Blank and Spacer Rows · Source page

In the long-cruise timetable

Blank and Spacer Rows — In the long-cruise timetable. Source page.
03

✅ SampleThe rule applies

A thin printed empty row sits between the 12:05–35 block and the 13:00 block2012_tushin_nittei

A thin printed empty row sits between the 12:05–35 block and the 13:00 block, the only thing separating the morning heats from the afternoon semi-finals; it is kept.

Source page
Blank and Spacer Rows — A thin printed empty row sits between the 12:05–35 block and the 13:00 block. Source page.
Expected output · excerpt around the blank row
時 刻 ト ラ ッ ク 跳躍(高さ) 跳躍(距離) 投 擲
9:30 女共4×100m予5組1着+3
50 男共4×100m予6組0着+8
10:20 男 3000m 決2組タイムレース 女砲丸投
55 男 800m予3組2着+2 女走高跳B
11:10 女 1500m 決2組タイムレース
35 女 100mH予4組3着+4
50 男2年 100m予5組3着+1
12:05 女2年 100m予6組2着+4
20 男1年 100m予6組2着+4 男三段跳
35 女1年 100m予5組3着+1
13:00 女 100mH準2組4着
…
Blank and Spacer Rows · Source page

A thin printed empty row sits between the 12:05–35 block and the 13:00 block

Blank and Spacer Rows — A thin printed empty row sits between the 12:05–35 block and the 13:00 block. Source page.
04

❌ Counter-sampleLooks like it applies and does not — or a rendering got it wrong

Blank rows are the only separation between the Experience Periode22

Blank rows are the only separation between the Experience Period, Annual … Trend and Projected groups; they are kept. A rendering that drops them runs the three groups together; it still conforms, but draws a warning. The red ($8.75) already carries its sign in the parentheses, so the colour is decoration and is not rendered.

Source page
Blank and Spacer Rows — Blank rows are the only separation between the Experience Period. Source page.
Expected output · excerpt around the first two blank rows
Rx Claim Information Generic Brand Specialty Total
Experience Period Scripts / 1000 9,882 1,094 89 11,065
…
Experience Period Paid PMPM $9.36 $17.90 $29.51 $56.77
Experience Period Rx Rebates PMPM ($8.75)
Annual Util Trend 1.031 1.003 1.070 1.028
Annual Unit Cost Trend 0.986 1.138 1.077 1.088
Annual Allowed Trend 1.016 1.141 1.152 1.119
Annual Deductible Trend 1.013 1.013 1.013 1.035
Annual Paid Trend 1.003 1.164 1.154 1.134
Annual Paid Trend Net of Rebates n/a n/a n/a 1.127
Months of Trend 24 24 24 24
Projected Scripts / 1000 10,502 1,099 102 11,704
…
Blank and Spacer Rows · Source page

Blank rows are the only separation between the Experience Period

Blank and Spacer Rows — Blank rows are the only separation between the Experience Period. Source page.
05

❌ Counter-sampleLooks like it applies and does not — or a rendering got it wrong

Printed blank lines separate the cohort blocks and set off the Average Issue Age line3samehead

The bold cohort bands already separate the blocks, so these spacers MAY be dropped; they are kept here. The rendering below drops them, and it also records 10.9% for the 2004+ share of premium where the page prints 32031.9%, and splits the Issue Year band into a label cell and empty cells although the page prints one full-width band. Each ruled Total row is a total, so its label cell is a <th> and the stub carries levels (all 0: nothing is indented).

Source page
Blank and Spacer Rows — Printed blank lines separate the cohort blocks and set off the Average Issue Age line. Source page.
Expected output · excerpt
Count % of Count Premium % of Premium
Issue Year
1999 80 3.5% 217,072 3.2%
2000 316 13.7% 964,763 14.2%
2001 374 16.2% 1,091,387 16.0%
2002 733 31.8% 2,110,680 31.0%
2003 570 24.7% 1,695,230 24.9%
2004+ 234 10.1% 738,975 32031.9%
Total 2,307 100.0% 6,818,108 100.0%
Issue Age
<30 4 0.2% 4,451 0.1%
…
80+ 3 0.1% 8,175 0.1%
Total 2,307 100.0% 6,818,108 100.0%
Average Issue Age 60.6
Attained Age
…
Non-conforming output

What the rule rules out.

Count % of Count Premium % of Premium
Issue Year
1999 80 3.5% 217,072 3.2%
2000 316 13.7% 964,763 14.2%
2001 374 16.2% 1,091,387 16.0%
2002 733 31.8% 2,110,680 31.0%
2003 570 24.7% 1,695,230 24.9%
2004+ 234 10.1% 738,975 10.9%
…
Blank and Spacer Rows · Source page

Printed blank lines separate the cohort blocks and set off the Average Issue Age line

Blank and Spacer Rows — Printed blank lines separate the cohort blocks and set off the Average Issue Age line. Source page.
06

❌ Counter-sampleLooks like it applies and does not — or a rendering got it wrong

Printed gaps sit under the BUILDINGS / OCCUPIED BY OWNER band, around the BUS3cell

PERS. PROP. band and between Group 5 and Group 6; the last is the only thing splitting the rate groups in two, so it is kept, and the others are kept with it. The BUS. PERS. PROP. band prints its label in its own ruled cell with one empty cell across the rest of the row, so it is not a full-width span. The trailing gap under Group 10 is padding and is not shown.

Source page
Blank and Spacer Rows — Printed gaps sit under the BUILDINGS / OCCUPIED BY OWNER band, around the BUS. Source page.
Expected output · table 1 of 2, excerpt
CLASSIFICATION FRAME JOISTED MASONRY LT. NON-COMBUSTIBLE FIRE RESISTIVE 500K /
GL LIMIT
1-6 7-8 9-10 1-6 7-8 9-10 1-6 7-8 9-10 1-6 7-8 9-10
BUILDINGS
OCCUPIED BY OWNER
Store Pac 13.33 16.57 19.37 9.59 11.86 13.83 7.51 9.29 10.84 4.89 5.82 6.68 N/A
BUS. PERS. PROP.
Rate Group 1 35.37 37.63 39.27 33.30 35.47 36.98 32.69 34.76 36.28 29.21 31.10 32.42 .94
Group 2 37.91 40.33 42.09 35.73 38.00 39.65 35.03 37.28 38.90 31.31 33.29 34.74 .97
Group 3 39.73 42.25 44.08 37.40 39.81 41.52 36.71 39.06 40.73 32.79 34.87 36.40 1.51
Group 4 41.22 43.84 45.74 38.81 41.28 43.10 38.06 40.50 42.25 34.03 36.18 37.75 1.62
Group 5 41.86 44.52 46.44 39.41 41.92 43.76 38.65 41.12 42.93 34.51 36.72 38.32 1.51
Group 6 43.23 45.98 47.99 40.72 43.31 45.19 39.93 42.49 44.32 35.67 37.96 39.61 1.52
…
Blank and Spacer Rows · Source page

Printed gaps sit under the BUILDINGS / OCCUPIED BY OWNER band, around the BUS

Blank and Spacer Rows — Printed gaps sit under the BUILDINGS / OCCUPIED BY OWNER band, around the BUS. Source page.

Encoding an empty region

The encoding of an empty region is free. Its existence is not.

  • An empty region inside a table body MAY be encoded as individual empty <td> cells or as one blank cell spanning it (colspan / rowspan): three leading empty <td>s per row and one colspan="3" rowspan="8" blank block render identically, and both conform. Where the page draws no separation inside the empty region, neither encoding is preferred.
  • Carve-out: in a loss triangle or similar matrix, every empty position MUST be its own empty cell, never part of a span — each is a distinct, meaningful absence. See Triangles and Matrix Tables (§9.8.2).
  • The half that is not free: the cells and columns MUST exist. A column proven only by its header still exists (Barely-Existing Columns and Headers (§9.3.1)), and every value in it MUST stay reachable. Encoding is a choice; deletion is an error.
  • Blank space beside a header label is not free: it MUST be rendered as separate empty cells, not as an extended span, unless the page prints a genuinely merged cell. See Barely-Existing Columns and Headers (§9.3.1).

More

Rule id tables-blank-and-spacer-rows · tables either rows disputed