12

In a basic tabular environment it seems that the optional parameter to \\ sometime has no effect. For instance, why is there no additional vertical spacing following the highlighted lines even though each line ends with a \\[2.0ex]?

enter image description here

Notes:

  • I am aware of solutions that apply to all lines in the table:

    • \renewcommand{\arraystretch}{1.5}
    • \extrarowheight=3pt\relax (With the array package)

but am specifically looking for a solution where I can control the spacing on a line by line basis as per the MWE.

References

Code:

\documentclass{article}
%% --------------------- These two for \rowcolor (to reproduce image)
%\usepackage{colortbl}
%\usepackage{xcolor}

\usepackage{array}%  For \extrarowheight

\newcommand{\ShortText}{Short text.}% Fits on one line
\newcommand{\LongText}{Long text that takes up more than one line.}%

\begin{document}
\noindent
%\renewcommand{\arraystretch}{1.5}% This works, but applies to ALL rows
%\extrarowheight=3pt\relax% This works with the array package, but applies to ALL rows
\begin{tabular}{l p{0.35\linewidth} p{0.45\linewidth}}
    Num & Column 1   & Column 2   \\[2.0ex]
     1  & \ShortText & \ShortText \\[2.0ex]
     2  & \ShortText & \LongText  \\[2.0ex]
     %\rowcolor{red!25}% <-- Needs "colortbl" and "xcolor"
     3  & \LongText  & \ShortText \\[2.0ex]% <--- Why this optional parameter ignored
     4  & \LongText  & \LongText  \\[2.0ex]
     5  & \ShortText & \ShortText \\[2.0ex]
\end{tabular}
\end{document}
  • Hmmm.. Looks like I had this issue before: Vertical Spacing in Tabular with bmatrix and I just need to increase the space as the optional parameter is the minimum height of the row, not the excess space to insert following the row. – Peter Grill Jun 22 '18 at 19:18
  • I get a different output - more sensible when thinking about \\[<len>] when I don't colour the tabular. – Werner Jun 22 '18 at 19:18
  • @Werner: Yeah, good point. Still has an issue on one row, which based on my above comment, I just need to increase the amount. – Peter Grill Jun 22 '18 at 19:20
  • You can use \noalign{\vspace{2.0ex}}. – Ulrike Fischer Jun 22 '18 at 19:27
  • 1
    @PeterGrill Heiko doesn't mention it below but the reason that booktabs can add a "natural" length and the reason the standard argument is implemented the way it is is due to vertical lines,. booktabs famously does not support (in fact actively discourages) the use of | and that simplifies things greatly. – David Carlisle Jun 22 '18 at 19:37
12

\\ inside a table is defined via \@tabularcr. If there is an optional argument with positive length, the macro takes the default depth of the line, adds the length and sets an invisible rule with the larger depth.

However, the problematic lines have already a much larger depth because of top-aligned two line cells. As a result, the optional argument remains ineffective unless its length is increased to become larger than the (unknown) depth of the two line cells.

Macro \addlinespace of package booktabs uses a different method by inserting the space after the row.

Example:

 \documentclass{article}
%% --------------------- These two for \rowcolor (to reproduce image)
\usepackage[table]{xcolor}

\usepackage{array}%  For \extrarowheight
\usepackage{booktabs}% For \addlinespace, \defauladdspace

\newcommand{\ShortText}{Short text.}% Fits on one line
\newcommand{\LongText}{Long text that takes up more than one line.}%

\begin{document}
\noindent
\setlength{\defaultaddspace}{2ex}%
\begin{tabular}{l p{0.35\linewidth} p{0.45\linewidth}}
    Num & Column 1   & Column 2   \\\addlinespace
     1  & \ShortText & \ShortText \\\addlinespace
     2  & \ShortText & \LongText  \\\addlinespace
     \rowcolor{red!25}% <-- Needs xcolor with option table
     3  & \LongText  & \ShortText \\\addlinespace
     4  & \LongText  & \LongText  \\\addlinespace
     5  & \ShortText & \ShortText \\
\end{tabular}
\end{document}

Result

The reason for the different implementation is that the method of LaTeX's \@tabularcr supports vertical rules. Macro \addlinespace on the other side comes from package booktabs for tables without vertical rules.

3

Adding a spacing with the optional parameter works fine for one-line rows. If there are more lines in a row cell, you have to change the value.

A better solution consists in using the \cellspacetop-bottomlimit lengths from package cellspace, which defines a minimal vertical spacing at the top and bottom of cells in columns with specifier prefixed with the letter S (or C if you load siunitx). By definition, this spacing is added only if necessary.

Unrelated : if you load xcolor with option [table], you don't have to load yourself colortbl.

\documentclass{article}

\usepackage{cellspace}
\setlength{\cellspacebottomlimit}{1ex}
\setlength{\cellspacetoplimit}{1ex}
\usepackage{array}% For \extrarowheight

\newcommand{\ShortText}{Short text.}% Fits on one line
\newcommand{\LongText}{Long text that takes up more than one line.}%

\begin{document}
\noindent
\begin{tabular}{l S{p{0.35\linewidth}} S{p{0.45\linewidth}}}
    Num & Column 1 & Column 2 \\
     1 & \ShortText & \ShortText \\
     2 & \ShortText & \LongText \\
     3 & \LongText & \ShortText \\ % <--- Why this optional parameter ignored
     4 & \LongText & \LongText \\
     5 & \ShortText & \ShortText
\end{tabular}
\vskip1cm
\begin{tabular}{l p{0.35\linewidth} p{0.45\linewidth}}
    Num & Column 1 & Column 2 \\[2.0ex]
     1 & \ShortText & \ShortText \\[2.0ex]
     2 & \ShortText & \LongText \\[4.5ex]
     3 & \LongText & \ShortText \\[4.5ex]% <--- Why this optional parameter ignored
     4 & \LongText & \LongText \\[2.0ex]
     5 & \ShortText & \ShortText \\[2.0ex]
\end{tabular}
\end{document} 

enter image description here

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.