2

I write a document which represents a catalog of stuff. Most of the content is a long table with heders in two balanced columns. xelatex is used to build pdf.

I planned to use longtabu from tabu package but seems it's incompatible with multicols and with Balancing long table inside multicol in LaTeX solution headers are not supported.

So currently I use supertabular with Trick Supertabular into Multicols in new command. It works almost good but first page looks incorrect. First column is not fully filled:

enter image description here

Also if remove headers then it doesn't fill both columns on all pages: enter image description here

Why it happens and how to fix?

\documentclass[10pt,twoside,a4paper]{book}
\usepackage{polyglossia}
\usepackage{fontspec}
\usepackage{xunicode}
\usepackage{xltxtra}
\usepackage{supertabular}
\usepackage{multirow}
\usepackage{multicol}
\usepackage{fancyhdr}
\usepackage{lipsum}
\usepackage[table]{xcolor}
\usepackage[
    top=29mm,
    left=20mm,
    right=10mm,
    bottom=13mm,
    headheight=28mm,
    headsep=-4mm,
    twoside,
    a4paper]
{geometry}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% page style
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\definecolor{HeadBg}{HTML}{004687}
\definecolor{FooterBg}{HTML}{D9DCEB}

\newcommand{\hd}{%
\begin{tabular}{@{}c@{}}
\color{HeadBg}\rule{\textwidth}{19mm} \\
\end{tabular}
}

\newcommand{\fd}[1]{%
\begin{tabular}{@{}p{10mm}@{}}
\centering\rule{0mm}{8mm}\cellcolor{FooterBg}\raisebox{1em}{#1} \\
\end{tabular}
}

\fancypagestyle{codetable}{%
    \fancyhf{}
    \fancyhead[EC]{\hd}
    \fancyhead[OC]{\hd}
    \fancyfoot[C]{\fd{\thepage}}
    \renewcommand{\headrulewidth}{0pt}
    \renewcommand{\footrulewidth}{0pt}
}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% table stuff
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%% https://tex.stackexchange.com/questions/105717/trick-supertabular-into-multicols-in-new-command
%% BEGIN
\newcount\n
\n=0
\def\tablebody{}
\makeatletter
\loop\ifnum\n<100
        \advance\n by1
        \protected@edef\tablebody{\tablebody
                \textbf{\number\n.}& shortText
                \tabularnewline
        }
\repeat

\makeatletter
\let\mcnewpage=\newpage
\newcommand{\TrickSupertabularIntoMulticols}{%
  \renewcommand\newpage{%
    \if@firstcolumn
      \hrule width\linewidth height 0pt
      \columnbreak
    \else
      \mcnewpage
    \fi
  }%
}
\makeatother
%% END

\definecolor{CellBg}{HTML}{CCD1E4}

%% Header
\newcommand{\catalogheader}{
\rowcolor{CellBg}
\multicolumn{2}{c}{\rule{0pt}{10mm}\rule{20mm}{0pt}} &&\\
\rowcolor{CellBg}
\rule{15mm}{0pt} & \rule{15mm}{0pt}%
& \multirow{-2}{*}[7mm]{\rule{0pt}{15mm}\rule{20mm}{0pt}}
& \multirow{-2}{*}[7mm]{\rule{0pt}{15mm}\rule{22mm}{0pt}} \\
\arrayrulecolor{white}
\hline
\arrayrulecolor{black}
}


\setlength{\columnsep}{1mm}

%% http://xpt.sourceforge.net/techdocs/language/latex/latex22-Controlling/ar01s03.html
\def\nlines#1{\expandafter\nlineii\romannumeral\number\number #1 000\relax}
\def\nlineii#1{\if#1m\expandafter\theline\expandafter\nlineii\fi}
\def\theline{\cellcolor{CellBg}{\textbf{one}} & two & \cellcolor{CellBg}{three} & four \\ \hline}

\begin{document}
\pagestyle{codetable}

\begin{multicols}{2}
\TrickSupertabularIntoMulticols

\tablefirsthead{\catalogheader}
\tablehead{\catalogheader}
\begin{supertabular}{clll}
\nlines{500}
\end{supertabular}

\end{multicols}
\end{document}

I'm not familiar with TeX lang so it's hard to understand even why that two column trick works.

I had tried longtable, xtab, tabu and supertabular. And only supertabular fits better than others for this task.

If the problem is not solvable with supertabular then maybe there are other table packages which supports headers, page breaks and multicolumn env (basically two cols)?

Thanks!

3
  • supertabular (and xtab which is based on it) overestimates the height of rows. I tried a trick that works with single column, but with your table fails miserably. :(
    – egreg
    Dec 3, 2014 at 22:47
  • No way to fix? Maybe there is a method to force or control height before first break or per page height or smth? Would be sad to use table with predefined rows per page instead of delegate to latex.
    – skozlovf
    Dec 6, 2014 at 16:54
  • Related: multicolumn long table or enumeration
    – Alan Munn
    Oct 1, 2016 at 18:01

0

Your Answer

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

Browse other questions tagged or ask your own question.