# How might one create a nice looking table in Latex?

I am able to create a table that looks bland. I am wondering how to create tables like the one below:

\begin{table}[htbp]
\caption{Variable Descriptions}
\label{tab:2}
\begin{center}
\begin{tabular}{|c|c|}\hline
Variables & Descriptions\\\hline
\textit{ln(wage)} & log of wage\\
\textit{educ} & years of education\\
\textit{black} & 1 if black and 0 if not\\
\textit{hisp} & 1 if hispanic and 0 if not\\
\textit{exper} & years of experience\\
\textit{exper$^{2}$} & years of experience squared\\
\textit{married} & 1 if married and 0 if not\\
\textit{union} & 1 if belongs to a union and 0 if not\\\hline
\end{tabular}
\end{center}
\end{table}


The particular question is:

• How might one alternate row colours between grey and white? Is there a way to create a command rather than colouring them manually?
• In order to alternatingly color rows in a table, take a look at the \rowcolors command which is defined when using \usepackage[table]{xcolor} Aug 19, 2020 at 20:21
• Adding \usepackage[table,svgnames]{xcolor} to the preamble and using \rowcolors{2}{white}{lightgray}  right before \begin{tabular} should give you the desired result. Aug 19, 2020 at 20:25
• I recommend to check out booktabs package to enhance the quality of tables. Aug 19, 2020 at 20:33

Here are three versions of your table:

\documentclass{article}
\usepackage[table,svgnames]{xcolor} % provides the \rowcolors command
\usepackage{caption} % for improved spacing around the caption

\usepackage{array} % enables >{...} in the coumn specifier section, used in table 2 & 3
\usepackage{booktabs} % for improved spacing around horizontal lines, used in example 3, incompatible with vertical lines, be careful if you want to to combine it with color

\usepackage[column=0]{cellspace} % for adding a small amount of space above and below each cell, only used in table 2
\setlength{\cellspacetoplimit}{2pt}
\setlength{\cellspacebottomlimit}{\cellspacetoplimit}

\begin{document}
\begin{table}[htbp]
\caption{Variable Descriptions}
\label{tab:2}
\rowcolors{2}{white}{lightgray}
\begin{tabular}{|c|c|}\hline
Variables & Descriptions\\\hline
\textit{ln(wage)} & log of wage\\
\textit{educ} & years of education\\
\textit{black} & 1 if black and 0 if not\\
\textit{hisp} & 1 if hispanic and 0 if not\\
\textit{exper} & years of experience\\
\textit{exper$^{2}$} & years of experience squared\\
\textit{married} & 1 if married and 0 if not\\
\textit{union} & 1 if belongs to a union and 0 if not\\\hline
\end{tabular}
\end{table}

\begin{table}[htbp]
\caption{Variable Descriptions}
\label{tab:2}
\centering
\rowcolors{2}{white}{lightgray}
\begin{tabular}{>{\itshape}0l0l}\hline % used >{\itshape} in order to be able to remove the repeated occurences of \textit in the first column, used l type columns instead of c columns for a cleaner look, added small vertical space above and below the rows with the help of the cellspace package, removed all vertical lines
\textup{Variables}       & Descriptions\\\hline
ln(wage)                 & log of wage\\
educ                     & years of education\\
black                    & 1 if black and 0 if not\\
hisp                     & 1 if hispanic and 0 if not\\
exper                    & years of experience\\
exper\textsuperscript{2} & years of experience squared\\
married                  & 1 if married and 0 if not\\
union                    & 1 if belongs to a union and 0 if not\\\hline
\end{tabular}
\end{table}

\begin{table}[htbp]
\caption{Variable Descriptions}
\label{tab:2}
\centering
\begin{tabular}{>{\itshape}ll}
\toprule % replaced all \hline commands with rules from the booktabs package
\textup{Variables}       & Descriptions\\
\midrule
ln(wage)                 & log of wage\\
educ                     & years of education\\
black                    & 1 if black and 0 if not\\
hisp                     & 1 if hispanic and 0 if not\\
exper                    & years of experience\\
exper\textsuperscript{2} & years of experience squared\\
married                  & 1 if married and 0 if not\\
union                    & 1 if belongs to a union and 0 if not\\
\bottomrule
\end{tabular}
\end{table}
\end{document}


I will answer the core of your question: I am wondering how to create tables like this.

I work with tables all the time, from experiments results to monthly budgets. For tasks like sorting, formatting, checking, and simple data analysis, I do it in Excel (using 2013). The final table will eventually come out after many iterations and time.

In your example is clear that the data come out of a database, there will be vertical accumulated results of all patches and all fixes, cross checking for consistency, etc.

LaTeX is for publishing beautiful reports, but this happens a few times a year. Only in very simple tables can the data be written directly to LaTeX.

My Excel to LaTeX workflow has 3 steps:

1 Format the final table with the style you need, in Excel. Use colors, rulers, etc., as needed.

1. Export the table using CTAN's Excel2Latex add-in. It is easy to install and works as advertised.

https://ctan.org/tex-archive/support/excel2latex?lang=en

copy to clipboard and paste it into a basic LaTeX document.

You need to add some basic packages (see my example) and run the resulting code.

You will see that most of the features like multi-row, colors, and most importantly, the content was successfully passed to LaTeX. If you change your mind about a detail in the style, it's easy to edit the Excel sheet and regenerate the LaTeX code.

3 Apply the finishing touches: fonts, stretch, hyphens, symbols, etc. using LaTeX commands.

For your example, I included the caption package to match the original caption, added the superscripts in the first row, the undeline in the second, and the small caps as needed. I used arraystretch from 1.3 to expand the cell vertically.

In this particular case, I had to include a 7 point offset down in a double gray row, to prevent the bottom cell background from overwriting part of the cell content. This is a common occurrence when working with colored cells. Comment [7pt] and see what happens.

Of course everything will come out looking good if you use only one background color! But I found the alternate row color style to be very nice and a must with wide multi-column tables. Beamer presentations will be doomed if you use only black and white.

\documentclass[12pt,a4paper]{book}

\RequirePackage[table]{xcolor}
\RequirePackage{booktabs}
\RequirePackage{multirow}

\RequirePackage{caption}% typesetting of captions
\captionsetup{%
labelfont={bf}, %Table 1
textfont={bf}  %caption font
}%

\begin{document}

% Table generated by Excel2LaTeX from sheet 'Sheet1'
\begin{table}[htbp]
\renewcommand{\arraystretch}{1.3} % expand the rows vertically
\setlength\belowcaptionskip{8pt}
\centering
\caption{Test--suite based program repair tools for Java.}
\begin{tabular}{llrrr}
\toprule
\multicolumn{1}{c}{\multirow{2}[2]{*}{Repear tool}} & Benchmark used & \multicolumn{1}{r}{\multirow{2}[2]{*}{\# Bugs}} & \multirow{2}[2]{*}{\# Patched\textsuperscript{a}} & \multirow{2}[2]{*}{\# Fixed\textsuperscript{b}} \\
& in evaluation &       &       &  \\
\midrule
\multicolumn{5}{l}{\underline{\emph{Generate--and--validate}}} \\
\rowcolor[rgb]{ .906,  .902,  .902} ACS [4] & Defects4J & 224   & 23    & 17 \\
\multirow{2}[0]{*}{ARJA [50]} & Defects4J & 224   & 59    & 18 \\
& QuixBugs [48] & 40    & 4     & 2 \\
\rowcolor[rgb]{ .906,  .902,  .902} \multirow{2}[1]{*}{\textsc{CapGen} [42]}  & Defects4J & 224   & 25    & 22 \\[7pt] % shift needed for colored multirows
\rowcolor[rgb]{ .906,  .902,  .902}     & IntroClassJava & 297   & --    & 25 \\
\multirow{2}[0]{*}{Cardumen [28]} & Defects4J & 356   & 77    & -- \\
& QuixBugs [48] & 40    & 5     & 3 \\
\rowcolor[rgb]{ .906,  .902,  .902} DeepRepair [43] & Defects4J & 374   & 51    & -- \\
\multirow{2}[0]{*}{\textsc{Elixir} [37]} & Defects4J & 82    & 41    & 26 \\
& Bugs.jar & 127   & 39    & 22 \\
\rowcolor[rgb]{ .906,  .902,  .902} GenProg-A & Defects4J & 224   & 36    & -- \\
HDRepair [18] & Defects4J & 90    & --    & 23 \\
\rowcolor[rgb]{ .906,  .902,  .902}\textsc{Jaid} [2] & Defects4J & 138   & 31    & 25 \\
\multirow{3}[0]{*}{jGenProg [27]} & Defects4J & 224   & 29    & -- \\
& Defects4J [26] & 224   & 27    & 5 \\
& QuixBugs [48] & 40    & 2     & 0 \\
\ldots  & \ldots & \ldots    & \ldots    & \ldots \\ % more rows follows
\bottomrule
\multicolumn{5}{l}{\footnotesize \textsuperscript{a} As reported last week. \ \textsuperscript{b} Verified by QC. }\\
\end{tabular}%
\end{table}%

\end{document}


This is the final result. Total time 1-2 hour, mostly in data entry and formatting the sheet.

As a final exercise, try adding another column to the table asked by your boss just before the deadline: Still Missing with the data (calculated in the excel sheet) that is Bugs minus Patches minus Fixed and see how it all works (and how little time it takes!). A real world situation.

Remark: This answer needs the version 5.2 (2020-08-19) of nicematrix.

The image given by the OP shows rows alternately colored. But some rows are in fact the reunion of several rows. In this condition, it's difficult to use \rowcolors of xcolor. In the latest version of nicematrix (v. 5.2 of 2020-08-19), the built-in instruction \rowcolors (to be used in code-before) has an option respect-blocks to deal with that problem. The rows encompassing a block are considered as only one row.

\documentclass{article}
\usepackage{nicematrix}
\usepackage{multirow}
\usepackage{booktabs}
\usepackage{makecell}
\usepackage{enumitem}

\NiceMatrixOptions{notes = { para , style = \alph{#1} } }

\begin{document}

\begin{NiceTabular}{ll@{\space}lrrr}%
[ code-before = \rowcolors{3}{gray!20}{}[respect-blocks] ]
\toprule
Repair tool &
\multicolumn{2}{l}{\makecell[l]{Benchmark used\\ in evaluation}}
&
\# Bugs &
\# Patched\tabularnote{Note}&
\# Fixed\tabularnote{Note}\\
\midrule
\underline{\emph{Generate-and-validate}} \\
ACS [46] & Defects4J & & 224 & 23 & 17 \\
\Block{2-1}{}\multirow{2}{*}{ARJA [50]} & Defects4J&  & 224 & 59 & 18 \\
& QuixBugs& [38] & 40 & 4 & 2 \\
\Block{2-1}{}\multirow{2}{*}{\textsc{CapGen} [42]} & Defects4J& & 224 & 25 & 22 \\
& \rlap{IntroClassJava} & & 297 & -- & 25 \\
\Block{2-1}{}\multirow{2}{*}{Cardumen [28]} & Defects4J& & 356 & 77 & -- \\
& QuixBugs& [48] & 40 & 5 & 3 \\
DeepRepair [43] & Defects4J& & 374 & 51 & - \\
\Block{2-1}{}\multirow{2}{*}{\textsc{Elixir} [37]} & Defects4J& & 82 & 41 & 26 \\
& Bugs.jar & & 127 & 39 & 22 \\
GenProg-1 [50] & Defects4J& & 224 & 36 & -- \\
HDRepair [18] & Defects4J& & 90 & -- & 23 \\
\textsc{Jaid} [2] & Defects4J& & 138 & 31 & 25 \\
\Block{3-1}{}\multirow{3}{*}{jGenProg [27]} & Defects4J & & 224 & 29 & -- \\
& Defects4J & [26] & 224 & 27 & 5 \\
& QuixBugs& [48] & 40 & 2 & 0 \\
\Block{3-1}{}\multirow{3}{*}{jKali [27]} & Defects4J& & 224 & 22 & -- \\
& Defects4J& [26] & 224 & 22 & 1 \\
& QuixBugs& [48] & 40 & 2 & 1 \\
\Block{2-1}{}\multirow{2}{*}{jMutRepair [27]} & Defects4J& & 224 & 17 & -- \\
& QuixBugs& [48] & 40 & 3 & 1 \\
Kali-A [50] & Defects4J& & 224 & 33 & -- \\
LSRepair [23] & Defects4J& & 395 & 38 & 19 \\
PAR [17] & \rlap{PARDataset} & & 119 & 27 & -- \\
\Block{2-1}{}\multirow{2}{*}{PSRepair-A [50]} & Defects4J& & 224 & 44 & -- \\
& QuixBugs& [48] & 40 & 4 & 2 \\
SimFix [14] & Defects4J& & 357 & 56 & 34 \\
\textsc{SketchFix} [13] & Defects4J& & 357 & 26 & 19 \\
SOFix [24] & Defects4J& & 224 & -- & 23 \\
ssFix [45] & Defects4J& & 357 & 60 & 20 \\
xPar [18] & Defects4J& & 90 & -- & 4 \\
\bottomrule
\end{NiceTabular}

\end{document}


• Just a simple comment: in the 2nd column is it possible to align vertically the numbers [...]? Aug 20, 2020 at 11:44
• @Sebastiano: Done! I have added a column. Aug 20, 2020 at 12:08
• My eyes, before, went to the left :-)...Now it is surely better. Aug 20, 2020 at 12:09
• @F. Pantigny Please correct 3.2 by 5.2 in the remark. Aug 22, 2020 at 17:25
• @Simon Dispa: Oups... Yes : 5.2. I've corrected. Aug 22, 2020 at 17:38

How about this one? (using matrix of TikZ)

\documentclass[tikz,border=5mm]{standalone}
\usepackage{amsmath,amssymb,amsthm}
\usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
\matrix (m) [matrix of nodes,draw=teal,thick,inner sep=.5pt,
nodes in empty cells,
row sep=-\pgflinewidth,
column sep=-\pgflinewidth,
nodes={minimum height=9mm,anchor=center},
row 1/.style={nodes={font=\bfseries}},
column 1/.style={nodes={minimum width=2.5cm,text width=1.5cm,align=left,font=\itshape}},
column 2/.style={nodes={minimum width=7cm,text width=6cm,align=left}},
every even row/.style={nodes={fill=cyan!20}}
]{
Variables & Descriptions\\
ln(wage)                 & log of wage\\
educ                     & years of education\\
black                    & 1 if black and 0 if not\\
hisp                     & 1 if hispanic and 0 if not\\
exper                    & years of experience\\
exper\textsuperscript{2} & years of experience squared\\
married                  & 1 if married and 0 if not\\
union                    & 1 if belongs to a union and 0 if not\\
};
\end{tikzpicture}
\end{document}