6

I use tabu package to easily typeset tables. Now i need to typeset long table. So i used longtabu. The head of the table consists of much columns. Also there are lots of text in each cell and some cells should be spanned. As i think, the centered text (formatted as paragraph) would look better.

Minimal example

\documentclass[14pt,twoside]{extreport}
\usepackage{type1ec}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{multirow}
\usepackage{array}
\usepackage{longtable}
\usepackage{tabu}
\usepackage{xparse}
\usepackage[unicode=true]{hyperref}


\NewDocumentCommand{\rot}{O{90} O{1em} m}{\makebox[#2][l]{\rotatebox{#1}{#3}}}%


\begin{document}

\newlength{\firsttoprow}
\setlength{\firsttoprow}{3cm}
\begin{longtabu} to \linewidth%
  {|X[25,C]%
    |X[15,C]|X[15,C]|X[15,C]%
    |X[25,C]%
    |X[25,C]|}
  \caption{First table caption%
  \label{tab:first}}\\\hline
  \multirow{2}*{\parbox{\linewidth}{\centering Column A (first page head)}}%
  & \rot{\parbox{\firsttoprow}{\centering Column B}}%
  & \rot[90][5ex]{\parbox{\firsttoprow}{\centering Column C (two lines)}}%
  & \rot[90][5ex]{\parbox{\firsttoprow}{\centering Column D (two lines)}}%
  & \multirow{2}*{\rot[90][7.5ex]{\parbox{\firsttoprow}{\centering Column E (consists of three lines)}}}%
  & \multirow{2}*{\rot[90][5ex]{\parbox{\firsttoprow}{\centering Column F (two lines)}}}\\\cline{2-4}
  & B (two lines)%
  & C (three lines)%
  & D & &\\\hline
  \endfirsthead
  \caption*{Table \ref{tab:first} (Cont.)}\\\hline
  Column A (head)%
  & B  & C  & D%
  & Col. E%
  & Col. F\\\hline
  \endhead
  Cont A%
  & Cnt.B  & Cnt.C  & Cnt.D%
  & Cnt.E%
  & Cnt.F\\\hline
\end{longtabu}

\end{document}

table with spanned multiline cells

The rotation is made with xparse (see https://tex.stackexchange.com/a/32687/33087). There are problems:

  1. At the top row in columns B, C and D bottom vertical space between box and horizontal line is bigger. I want content to be at the middle of cell.
  2. Content of spanned head cells (columns A, E and F) vertically alligned by \multirow so the centers of boxes are located at the line between rows of head. I want the centers of boxes are located at centers of spanned cells.
  3. This example produces 6 bad boxes (overfull \vbox due to \multirow).

The second example provides ugly workaround with manual vertical fixups and without \multirow:

\documentclass[14pt,twoside]{extreport}
\usepackage{type1ec}
\usepackage[T2A]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}
\usepackage{multirow}
\usepackage{array}
\usepackage{longtable}
\usepackage{tabu}
\usepackage{xparse}
\usepackage[unicode=true]{hyperref}



\newcolumntype{Y}[1]{>{\strut\hspace{0pt}}X[#1]<{\hspace{0pt}\strut}}
\tabucolumn Y

\NewDocumentCommand{\rot}{O{90} O{1em} m}{\makebox[#2][l]{\rotatebox{#1}{#3}}}%



\begin{document}

\newlength{\firsttoprow}
\newlength{\fixuptoprow}
\setlength{\firsttoprow}{3cm}
\setlength{\fixuptoprow}{2cm}
\begin{longtabu} to \linewidth%
  {|Y{25,C}%
    |Y{15,C}|Y{15,C}|Y{15,C}%
    |Y{25,C}%
    |Y{25,C}|}
  \caption{First table caption%
  \label{tab:first}}\\\hline
  \begin{minipage}[t][0pt]{\linewidth}\vspace{-\fixuptoprow}\vspace{3.5ex}%
   \parbox{\linewidth}{\centering Column A (first page head)}%
  \end{minipage}%
  & \rot{\parbox{\firsttoprow}{\centering Column B}}%
  & \rot[90][5ex]{\parbox{\firsttoprow}{\centering Column C (two lines)}\hspace{1ex}}%
  & \rot[90][5ex]{\parbox{\firsttoprow}{\centering Column D (two lines)}}%
  & \begin{minipage}[t][0pt]{7.5ex}\vspace{-\fixuptoprow}%
     \rot[90][7.5ex]{\parbox{\firsttoprow}{\centering Column E (consists of three lines)}}%
    \end{minipage}%
  & \begin{minipage}[t][0pt]{5ex}\vspace{-\fixuptoprow}%
     \rot[90][5ex]{\parbox{\firsttoprow}{\centering Column F (two lines)}}%
    \end{minipage}\\\cline{2-4}
  & B (two lines)%
  & C (three lines)%
  & D & &\\\hline
  \endfirsthead
  \caption*{Table \ref{tab:first} (Cont.)}\\\hline
  Column A (head)%
  & B  & C  & D%
  & Col. E%
  & Col. F\\\hline
  \endhead
  Cont A%
  & Cnt.B  & Cnt.C  & Cnt.D%
  & Cnt.E%
  & Cnt.F\\\hline
\end{longtabu}

\end{document}

enter image description here

I hope someone can suggest beautiful decision which calculates fixups automatically. Also, for minipage decision see https://tex.stackexchange.com/a/99684/33087.

1

I'd use a much simpler markup, and do away with the vertical rules.

enter image description here

\documentclass[14pt,twoside]{extreport}
\usepackage{type1ec}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{array,graphicx}
\usepackage{longtable}


\newcommand\rot[1]{\rotatebox{90}{ \begin{tabular}{@{}c@{}}#1\end{tabular} }}



\begin{document}


\begin{longtable}{
>{\centering}m{2cm}
>{\centering}m{2cm}
>{\centering}m{2cm}
>{\centering}m{2cm}
>{\centering}m{2cm}
>{\centering\arraybackslash}m{2cm}
}
  \caption{First table caption%
  \label{tab:first}}\\\hline
Column A (first page head)
  & \rot{Column B}\par\hrule\smallskip B (two lines)
  & \rot{Column C\\ (two lines)}\par\hrule\smallskip C (three lines)
  & \rot{Column D\\ (two lines)}\par\hrule\smallskip D\\\mbox{}
  & \rot{Column E\\ (consists of\\ three lines)}
  & \rot{Column F\\ (two lines)}\\
\hline
  \endfirsthead
  \caption*{Table \ref{tab:first} (Cont.)}\\\hline
  Column A (head)%
  & B  & C  & D%
  & Col. E%
  & Col. F\\\hline
  \endhead
  Cont A%
  & Cnt.B  & Cnt.C  & Cnt.D%
  & Cnt.E%
  & Cnt.F\\\hline
\end{longtable}

\end{document}

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.