- name
- booktabs
- description
- LaTeX booktabs/tabularx/multirow/longtable packages for professional tables. Use when helping users create well-formatted tables, multi-page tables, or improve table appearance.
# booktabs + tabularx + multirow + longtable — Professional Tables
**CTAN:** https://ctan.org/pkg/booktabs | https://ctan.org/pkg/tabularx
**Manual:** `texdoc booktabs`
## Setup
```latex
\usepackage{booktabs} % professional horizontal rules
\usepackage{tabularx} % auto-width columns
\usepackage{multirow} % cells spanning rows
\usepackage{longtable} % multi-page tables
\usepackage{colortbl} % colored rows/cells (optional)
\usepackage{siunitx} % number alignment (optional)
```
## Ugly vs Professional — Before/After
### ❌ Bad Table
```latex
\begin{tabular}{|l|c|r|}
\hline
Name & Score & Grade \\ \hline
Alice & 95 & A \\ \hline
Bob & 82 & B \\ \hline
Carol & 78 & C \\ \hline
\end{tabular}
```
### ✅ Good Table
```latex
\begin{tabular}{lcc}
\toprule
Name & Score & Grade \\
\midrule
Alice & 95 & A \\
Bob & 82 & B \\
Carol & 78 & C \\
\bottomrule
\end{tabular}
```
**Rules:** Never use vertical lines. Never use `\hline`. Use `\toprule`, `\midrule`, `\bottomrule`.
## booktabs Rules
| Command | Use |
|---------|-----|
| `\toprule` | Top of table (thicker) |
| `\midrule` | Between header and body |
| `\bottomrule` | Bottom of table (thicker) |
| `\cmidrule(lr){2-4}` | Partial rule spanning columns 2–4 |
| `\addlinespace` | Extra vertical space (group separator) |
| `\addlinespace[5pt]` | Custom extra space |
### cmidrule Trimming
```latex
\cmidrule(l){1-2} % trim left
\cmidrule(r){3-4} % trim right
\cmidrule(lr){2-3} % trim both
\cmidrule{1-4} % no trim
```
### Grouped Rows Example
```latex
\begin{tabular}{llr}
\toprule
Category & Item & Price \\
\midrule
Fruit & Apple & 1.20 \\
& Banana & 0.80 \\
\addlinespace
Dairy & Milk & 2.50 \\
& Cheese & 4.00 \\
\bottomrule
\end{tabular}
```
## tabularx — Auto-Width Columns
```latex
% X columns expand to fill \textwidth
\begin{tabularx}{\textwidth}{lXr}
\toprule
ID & Description & Price \\
\midrule
1 & A very long description that will wrap automatically & \$10 \\
2 & Short & \$20 \\
\bottomrule
\end{tabularx}
```
| Column type | Behavior |
|-------------|----------|
| `l`, `c`, `r` | Fixed (natural width) |
| `X` | Expands to fill remaining space (left-aligned) |
| `>{\centering\arraybackslash}X` | Centered X column |
| `>{\raggedleft\arraybackslash}X` | Right-aligned X column |
| `p{3cm}` | Paragraph, fixed width |
## multirow
```latex
\usepackage{multirow}
\begin{tabular}{lcr}
\toprule
\multirow{2}{*}{Name} & \multicolumn{2}{c}{Scores} \\
\cmidrule(l){2-3}
& Math & English \\
\midrule
Alice & 95 & 88 \\
Bob & 72 & 91 \\
\bottomrule
\end{tabular}
```
Syntax: `\multirow{nrows}{width}{content}` — use `*` for auto width.
`\multicolumn{ncols}{alignment}{content}` — built into LaTeX.
### Complex Header Example
```latex
\begin{tabular}{lcccccc}
\toprule
& \multicolumn{3}{c}{Treatment A} & \multicolumn{3}{c}{Treatment B} \\
\cmidrule(lr){2-4} \cmidrule(lr){5-7}
Subject & Pre & Post & $\Delta$ & Pre & Post & $\Delta$ \\
\midrule
1 & 5.2 & 3.1 & $-2.1$ & 4.8 & 4.5 & $-0.3$ \\
2 & 6.1 & 2.8 & $-3.3$ & 5.5 & 5.2 & $-0.3$ \\
\bottomrule
\end{tabular}
```
## longtable — Multi-Page Tables
```latex
\usepackage{longtable}
\begin{longtable}{lcc}
% Header for first page
\toprule
Name & Value & Unit \\
\midrule
\endfirsthead
% Header for continuation pages
\multicolumn{3}{l}{\textit{Continued from previous page}} \\
\toprule
Name & Value & Unit \\
\midrule
\endhead
% Footer for all pages except last
\midrule
\multicolumn{3}{r}{\textit{Continued on next page}} \\
\endfoot
% Footer for last page
\bottomrule
\endlastfoot
% Data rows
Alpha & 1.0 & m \\
Beta & 2.5 & kg \\
% ... many more rows ...
Omega & 9.9 & s \\
\caption{Long experimental data.}
\label{tab:longdata}
\end{longtable}
```
**Note:** `longtable` replaces `tabular` entirely (not inside `table` environment). Caption and label go inside.
## colortbl — Row and Cell Coloring
```latex
\usepackage{colortbl}
\usepackage[table]{xcolor} % or load xcolor with table option
% Colored row
\rowcolor{blue!10}
Alice & 95 & A \\
% Colored cell
Alice & \cellcolor{green!20} 95 & A \\
% Alternating row colors (xcolor table option)
\rowcolors{2}{gray!10}{white} % start at row 2, alternate
\begin{tabular}{lcc}
\toprule
\rowcolor{white} % override for header
Name & Score & Grade \\
\midrule
Alice & 95 & A \\ % gray
Bob & 82 & B \\ % white
Carol & 78 & C \\ % gray
\bottomrule
\end{tabular}
```
## siunitx S Columns — Number Alignment
```latex
\usepackage{siunitx}
\begin{tabular}{l S[table-format=3.2] S[table-format=1.3]}
\toprule
{Material} & {Density} & {Error} \\
\midrule
Steel & 785.00 & 0.050 \\
Aluminum & 270.00 & 0.120 \\
Titanium & 450.00 & 0.008 \\
Gold & 1932.00 & 0.300 \\
\bottomrule
\end{tabular}
```
**S column:** Aligns numbers by decimal point. Wrap text headers in `{...}`.
| S option | Example | Meaning |
|----------|---------|---------|
| `table-format` | `3.2` | 3 digits . 2 decimals |
| `table-format` | `+2.1e3` | sign, digits, exponent |
| `round-mode` | `places` | Round to decimal places |
| `round-precision` | `2` | Number of decimal places |
## Full Example — Publication-Quality Table
```latex
\begin{table}[htbp]
\centering
\caption{Performance comparison of algorithms.}
\label{tab:comparison}
\begin{tabular}{l S[table-format=2.1] S[table-format=3.0] c}
\toprule
{Method} & {Accuracy (\%)} & {Time (ms)} & {Converged?} \\
\midrule
Baseline & 72.3 & 150 & Yes \\
Improved & 85.1 & 230 & Yes \\
Proposed & 91.7 & 98 & Yes \\
\addlinespace
Oracle & 99.2 & 45 & N/A \\
\bottomrule
\end{tabular}
\end{table}
```
## Common Pitfalls
| Problem | Cause | Fix |
|---------|-------|-----|
| Vertical lines | Using `|` in column spec | Remove them — use whitespace |
| `\hline` | Old habit | Use `\toprule/\midrule/\bottomrule` |
| Table too wide | Too many columns | Use `tabularx` with `X` columns, or `\resizebox` |
| `longtable` in `table` | Incompatible | `longtable` replaces `table` environment |
| `\multirow` misaligned | Row height differences | Add `\rule{0pt}{2.5ex}` or adjust manually |
| `S` column header error | Text in S column | Wrap header in `{...}` |
| Footnotes in table | `\footnote` fails in tabular | Use `\tablefootnote` (tablefootnote pkg) or threeparttable |
| `booktabs` + `colortbl` gaps | Rules have gaps with color | Add `\abovetopsep=0pt` or use `\arrayrulecolor` |
## Tips
- **Three rules only:** `\toprule`, `\midrule`, `\bottomrule` — almost never need more
- Use `\addlinespace` to group rows visually instead of extra rules
- Put `\caption` above the table (convention for tables, unlike figures)
- `\small` or `\footnotesize` before tabular to shrink wide tables
- `threeparttable` package for proper table footnotes
- `\arraystretch` to adjust row height: `\renewcommand{\arraystretch}{1.2}`
View on GitHub