Skip to main content
Logo image

Section 12 Table Calisthenics

That was a Sage cell just now, which has nothing to do with tables. But we needed someplace to test placement right after a division heading. Carry on.
A very minimal table, hence with left-justified cells, no borders. We do wrap the tabular element in a table element to get centering, numbering and a caption. Footnotes inside cells are tested here.
Table 12.1. Some Colors
Red Green
 1 
Green can be a very sick looking color.
Yellow
Blue White Pink
Note that tables may be constructed using the Complex Table Editor
 2 
www.latex-tables.com
tool online at latex-tables.comand then exported in PreTeXt syntax.
Tables can be used and abused many ways. We describe long division of polynomials by using vertical and horizontal borders on individual entries of a <tabular>. The division lines are slightly thicker than the subtraction lines. This is a good example of the typical abuse of tables for horizontal and vertical layout. At least we have called it a “Figure,” not a “Table”.
\(x\) \(-\) \(5\)
\(x\) \(+\) \(2\) \(x^2\) \(-\) \(3x\) \(-\) \(8\)
\(x^2\) \(+\) \(2x\)
\(-5x\) \(-\) \(8\)
\(-5x\) \(-\) \(10\)
\(2\)
Figure 12.2. Polynomial Long Division
An example of aligning table cells’ contents horizontally. See the source for comments.
Table 12.3. Horizontal Alignment Example
1234567890 1234567890 1234567890 1234567890
[First Second Third Fourth
A B C D
1 2 3 4
Example from above, but now with horizontal rules, plus an extra row to test the bottom border. See the source for comments.
Table 12.4. Horizontal Rules Example
1234567890 1234567890 1234567890 1234567890
First Second Third Fourth
A B C D
1 2 3 4
1 2 3 4
For a table without a caption, create a <tabular> and place it directly within the current division. This will allow control over the horizontal placment, but without a caption, there is no number, and the tabular cannot be cross-referenced.
One
Same example as before, but now with vertical rules. See the source for comments.
Table 12.5. Vertical Rules Example
1234567890 1234567890 1234567890 1234567890
First Second Third Fourth
A B C D
1 2 3 4
1 2 3 4
Table 12.6. Progressively Thicker Rules Example
1111 2222 3333
aaaa bbbb cccc
AAAA BBBB CCCC
Table 12.7. Column Span Example
1111, 2222 3333
aaaa bbbb,cccc
AAAA BBBB CCCC
A list whose first item is a table. In output a \leavevmode is necessary to keep this organized (item number, then table as content).
  1. Table 12.8. Table Alignment Example
    1111, 2222 3333
    aaaa bbbb,cccc
    AAAA BBBB CCCC

Example 12.9. Example Environment with Leading Table.

Table 12.10. Column Spans, No col Elements, Nine Columns
1 2+3 4 5+6+7 8+9
1 2 3 4 5 6 7+8 9
1 2 3 4 5 6 7 8 9
This example tests several things. In output, figures, tables, listings and side-by-sides are “floats” whose placement can migrate, but we have tries to supress this behavior. However, a float that is the first item of an “environment” (like a theorem or an example) can still float to a position before its title. If that does not happen here, then our additional defenses are working.
This example also checks that the total number of columns is correctly computed from the first row, which features several colspan attributes.
A bare minimum table (one row with one cell) to test edge cases:
Table 12.11. One entry table
One
Table cells with a fixed width where text wraps are known as “paragraph cells”. A cell will be created as a paragraph cell if and only if it has <p> children. And such cells should only have <p> children. The width of a paragraph cell is determined by a width attribute on the corresponding <col> (as a percentage). If the column has a non-paragraph cell with contents that are wider than the paragraph cells, results will be undesirable. There is presently no implementation for a paragraph cell that has a colspan greater than \(1\text{,}\) although cells with colspan greater than \(1\) that are above or below a paragraph cell will behave. Setting width on a <col> that has no paragraph cells may produce unexpected results. A valign for the parent <row> (or the ambient <tabular>) can control vertical alignment (top, middle, or bottom). A paragraph cell’s halign attribute (left, center, right, or justify) controls how the text is justfied. Cells inherit halign from <row>, <col>, and <tabular> in that order of preference. In a non-paragraph cell where halign='justify', the horizontal alignment will match the behavior of halign='left'.
Table 12.12. Time Units
Unit Stands For Definition Roughly
s second
the duration of 9192631770 periods of the radiation corresponding to the transition between the two hyperfine levels of the ground state of the cesium-133 atom
an extraneous paragraph just to demonstrate the inter-paragraph formatting.
the time it takes you to say the phrase “differential calculus”
min minute
exactly \(60\) seconds
how long it takes to microwave a full dinner plate from the refrigerator
h hour
exactly \(3600\) seconds; exaclty \(60\) minutes
the length of one episode of a premium cable television show
Table cells can have multiline content using <line> elements. This is not the same thing as a paragraph cell—line breaking will happen precisely where the author tells it to. A <line> will not break, even on a narrow screen. If a cell uses a <line>, it must only use a sequence of <line>s and no other content. As with paragraph cells, you can use a valign attribute for the row.
Table 12.13. Dr. Seuss lines
One Fish
Two Fish
Red Fish
Blue Fish
I am the Lorax.
I speak for the trees.
Self-referential: Table 12.13
Look at me!
Look at me!
Look at me NOW!
It is fun to have fun.
But you have
to know how.
This is a table torture test with many combinations of halign, valign, colspan, <p> children, and <line> children.
Table 12.14. Table Torture Test
Cell too wide
Lf md
Lef mid par cel
Rt md
Rig mid par cel
Cn md
Cen mid par cel
Js md
Jus mid par cel jus mid par cel





Colspan=2
lef mid
with lines
Colspan=3 rig mid Lines
Between
Par
Lines
Between
No Par
Par in row with lines





L t
Lef top par cel
R t
Rig top par cel
C t
Cen top par cel
J t
Jus top par cel jus top par cel





L b
Lef bot par cel
R b
Rig bot par cel
C b
Cen bot par cel
J b
Jus bot par cel jus bot par cel





Colspan=3 lef bot Colspan=2
rig bot
with lines
Lines
Under
Par
Lines
Under
No Par
Par in row with lines





And now a <sidebyside> with a <table> and a <tabular> to check that width is scaled appropriately. See Section 25 to learn about <sidebyside>s.
A1.S1
All legislative Powers herein granted shall be vested in a Congress of the United States, which shall consist of a Senate and House of Representatives.
Should be 50% of 45% except perhaps on small screens.
A1.S2.C1
The House of Representatives shall be composed of Members chosen every second Year by the People of the several States, and the Electors in each State shall have the Qualifications requisite for Electors of the most numerous Branch of the State Legislature.
Should be 50% of 55% except perhaps on small screens.
Figure 12.15. Some text from the US Constitution
Tables are formed in output with copious use of the \multicolumn macro to override more global alignment settings, and to spread the content of one cell across several columns. However, sometimes ’s special characters have behaved badly in this situation. So the table below, two items per row, is just designed for testing. But of course, it should still render fine in other formats. The three test cases are from 8.8, but without 50 alphabetic characters and 8 digits, which should not be problems in this context. In order to test the use of a percent sign (%) in a URL, we follow it by two hex digits, specifically, 58, which is a way to represent the character X in a URL. The first column’s entries are forced to be wrapped in a \multicolumn by specifying their horizontal alignment. The second column’s entries will not be wrapped in a \multicolumn. So the two columns will look identical, other than the first having a left alignment, and the second has the default center alignment. (This table is known to render poorly in a Jupyter notebook. The cause is four dollar signs present in rows 1 and 3, and is explained in Subsection 8.12.)
Table 12.16. Problematic Table Cells for
1 09az%-._~:/?#[]@!$&'()*+,;= 09az%-._~:/?#[]@!$&'()*+,;=
2 e.com/09az%58-._~:/?#[]@!$&’()*+,;=
 3 
example.com/09az%58-._~:/?#[]@!$&'()*+,;=
e.com/09az%58-._~:/?#[]@!$&’()*+,;=
 4 
example.com/09az%58-._~:/?#[]@!$&'()*+,;=
3 example.com/09az%58-._~:/?#[]@!$&'()*+,;= example.com/09az%58-._~:/?#[]@!$&'()*+,;=
Now, the same table repeatedly, but with different headers. No care has been taken with alignment or rules, which could improve how these look.
Table 12.17. No Headers
State Population Area (sq. mi.) Statehood (Year)
Washington 7,614,893 71,362 1889
Oregon 4,217,737 98,381 1859
California 39,512,223 163,696 1850
Table 12.18. One Row Header
State Population Area (sq. mi.) Statehood (Year)
Washington 7,614,893 71,362 1889
Oregon 4,217,737 98,381 1859
California 39,512,223 163,696 1850
Table 12.19. One Row Header, Multiline
State Population Area
(sq. mi.)
Statehood
(Year)
Washington 7,614,893 71,362 1889
Oregon 4,217,737 98,381 1859
California 39,512,223 163,696 1850
Table 12.20. Two Row Headers
State Population Area Statehood
(sq. mi.) (Year)
Washington 7,614,893 71,362 1889
Oregon 4,217,737 98,381 1859
California 39,512,223 163,696 1850
Table 12.21. One Vertical Row Header
State Population Area (sq. mi.) Statehood (Year)
Washington 7,614,893 71,362 1889
Oregon 4,217,737 98,381 1859
California 39,512,223 163,696 1850
Table 12.22. One Vertical Row Header, Multiline
State Population Area
(sq. mi.)
Statehood
(Year)
Washington 7,614,893 71,362 1889
Oregon 4,217,737 98,381 1859
California 39,512,223 163,696 1850
Table 12.23. Two Vertical Row Headers
State Population Area Statehood
(sq. mi.) (Year)
Washington 7,614,893 71,362 1889
Oregon 4,217,737 98,381 1859
California 39,512,223 163,696 1850
Table 12.24. One Row Header, with Rules
State Population Area (sq. mi.) Statehood (Year)
Washington 7,614,893 71,362 1889
Oregon 4,217,737 98,381 1859
California 39,512,223 163,696 1850
Table 12.25. One Row Header, Multiline, with Rules
State Population Area
(sq. mi.)
Statehood
(Year)
Washington 7,614,893 71,362 1889
Oregon 4,217,737 98,381 1859
California 39,512,223 163,696 1850
The next table has a progression of thicker rules in the header, plus a progression of thicker rules across the columns. For testing, not for aesthetics.
Table 12.26. Two Row Header, Many Rules
State Population Area Statehood
(sq. mi.) (Year)
Washington 7,614,893 71,362 1889
Oregon 4,217,737 98,381 1859
California 39,512,223 163,696 1850
We now finish this section with some long tables. Ones that will not fit on a single printed page. So this is only of interest when producing this sample article as a PDF. First a “naked” tabular, which should force a new page to start, and then still overrun the end of the page.
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Now the same <tabular>, but within a <table>. Behavior should be similar, a new page and then it overruns the bottom of the page.
Table 12.27. A Lot of Colors
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
When you wish to allow a <tabular> to split itself at a page break, you can add the attribute @break with the value yes. Certainly this will control a <table> or <tabular> which is longer than a page, but will also allow a shorter one to break. This might useful in a draft stage before undertaking page-fitting.
Here is the long <tabular> again, but with the @break attribute set to yes.
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Here is the long <table> again, but with the @break attribute set to yes on the @tabular.
Table 12.28. A Lot of Colors, Breaking
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
Red Green Yellow
Blue White Pink
This device is not ideal, as some features of tables are not behaving as expected. More precisely, we switch from the standard tabular environment to the longtable environment from the package of the same name when table-breaking is requested. So there may be some undesirable interaction with other packages. For one, full-width horizontal rules seem to become as wide as the page (rather than as wide as the tabular). The following table is Table 12.4 repeated but as a breakable <tabular>. The longtable package documentation suggests it accomodates the array package, but it also seems to make a variety of redefinitions. Furthermore, a panel of a side-by-side cannot be a breakable tabular, or a compilation error occurs.
Table 12.29. Horizontal Rules Example
1234567890 1234567890 1234567890 1234567890
First Second Third Fourth
A B C D
1 2 3 4
1 2 3 4
Here is a consecutive pair of “bare” <tabular> to test vertical space between them.
\(t\) \(2/3\) \(2/303\) \(2/30003\) \(2/3000003\)
\(g(t)\) \(-1\) \(-1\) \(-1\) \(-1\)
\(t\) \(2/5\) \(2/505\) \(2/50005\) \(2/5000005\)
\(g(t)\) \(1\) \(1\) \(1\) \(1\)
The longtable package allows for headers and footers indicating continued tables. A possible enhancement is to support this feature in the case of a long table.