The default table style provided by LaTeX is not good-looking and professional. In this post, I would like to talk about how to create professional table with the help of booktabs package. We will create the table shown in the title image.

For how to create a normal table without booktabs, see this tutorial. To use booktabs, we need first to import it since it is not loaded by LaTeX by default:

\usepackage{booktabs}

To create multi-row cells in a table, we need also to include the multirow package:

\usepackage{multirow}

Professional tables often appear as a three-line table, i.e., top line, middle line and bottom line. The three lines are usually thicker than other lines that appear in the table. Booktabs package provides the \toprule, \midrule and \bottomrule command to represent the three lines. To draw a line which only spans a few columns, you can use \cmidrule command.

I show an example to create a table using the booktabs below:

\begin{table}[h]
\centering
\begin{tabular}{lllll}
\toprule
\multirow{2}{*}{Models} & \multicolumn{3}{c}{Metric 1} & Metric 2\\
\cmidrule{2-4} \cmidrule{5-5} \\
{} & precision & recall & F-score  & R@10 \\
\midrule
model 1 & 0.67  & 0.8 & 0.729  & 0.75 \\
model 2 & 0.8 & 0.9 & 0.847 & 0.85 \\
\bottomrule
\end{tabular}
\end{table}

The produced table is like:

There are several issues with the table:

• The text in the multi-row cell is not properly aligned.
• Row 1 and row 2 are not in the same height.
• The two \cmidrule are connected to each other in one end.

To align the text in multi-row cell vertically, an easy way is to provide a vertical space parameter before the cell text:

\multirow{column_num}{cell_width}[vspace]{Text}

We can use the vspace parameter to adjust the vertical position of Text. A positive value will move the text up while a negative value will move the text down.

The two \cmidrule line are too close to the text in the first row. We can manually add some space using the \addlinespace[] command from the booktabs package. This command can be put after the table line separator \\ to add extra space.

To prevent the two cmidrule from connecting each other in one end, we need to provide the trim parameter to \cmidurle command. The trim parameter is provide in () after the command, for example, \cmidrule(lr){2-4}, which means to trim in both left and right side of the rule.

Combining these improvements together, we have the following code:

\begin{table}[h]
\centering
\begin{tabular}{lllll}
\toprule
\multirow{2}{*}[-1em]{Models} & \multicolumn{3}{c}{Metric 1} & Metric 2\\
\cmidrule(lr){2-4} \cmidrule(lr){5-5} \\
{} & precision & recall & F-score  & R@10 \\
\midrule
model 1 & 0.67  & 0.8 & 0.729  & 0.75 \\
model 2 & 0.8 & 0.9 & 0.847 & 0.85 \\
\bottomrule
\end{tabular}
\end{table}

One last issue is that the edge of table is not tight enough: there are apparent space in the left and right side of the table. You can add @{} in the tabular column setup to trim the extra space like the following:

\begin{tabular}{@{}lllll@{}}