3

I have a table with 1000 (variable, can be any) rows and 3 (fixed) columns. Each cell has a 10 digit number.

Displaying it in a single continuous stream of rows is not looking good and not maximal use of available print space.

I want it to be displayed from current point till end of current page. The remaining rows has to be folded and displayed till the bottom of the page and the process should continue till there is enough width available in the page. Subsequent rows should go into subsequent pages with same logic. The last set of rows should be evenly distributed from the top of the page so that the last row contains same number of columns as the first row.

Also the header of the columns need to be repeated in each of the instances of the columns. And if possible, the lines to be displayed between the rows and columns.

Thanks in Advance. Aravind

  • 1
    Welcome to TeX.SX! Probably it's simpler not to use a table. – egreg Aug 02 '16 at 13:06
  • Welcome to TeX SX! You can do that with a single long table, but part of the job will have to be done by hand. You can in a first step at which rows happen page breaks, and reorganise your data/code so that your obtain your three columns with a correct display. – Bernard Aug 02 '16 at 13:08

1 Answers1

3

Here's a possibility:

\documentclass{article}
\usepackage{multicol}
\usepackage{capt-of}
\usepackage{siunitx}

\usepackage{lipsum} % just for the example

\newcommand{\entry}[3]{%
  \makebox[\columnwidth][s]{\num{#1}\hfil\num{#2}\hfil\num{#3}}\par
}
\newenvironment{pseudotabular}[1]% the argument is the caption
 {\setlength\columnsep{1cm}%
  \begin{multicols}{2}[\captionof{table}{#1}]
  \footnotesize
  \setlength\parindent{0pt}}
 {\end{multicols}}

\begin{document}

You can see the result in table~\ref{long}.

\lipsum[2]

\begin{pseudotabular}{A long table\label{long}}
\entry{1010101010}{2121212121}{3232323232}
\entry{1010101010}{2121212121}{3232323232}
\entry{1010101010}{2121212121}{3232323232}
\entry{1010101010}{2121212121}{3232323232}
...
\end{pseudotabular}

\end{document}

enter image description here

Another possibility is xtab, but tricking it into automatically getting balanced columns is almost impossible.

See Trick Supertabular into Multicols in new command and http://www.guitex.org/home/en/forum/5-tex-e-latex/26889-supertabular-e-twocolumn-riempimento-parziale-altezza-testo

\documentclass{article}
\usepackage{multicol,capt-of}
\usepackage{xtab}
\usepackage{siunitx}

\usepackage{lipsum} % just for the example

\newcommand{\entry}[3]{%
  \num{#1}&\num{#2}&\num{#3}\\\hline
}
\makeatletter
\def\mod@estimate@lineht{% 
  \ST@lineht=\arraystretch \baslineskp
%  \ST@lineht=.95\ST@lineht
  %\global\advance\ST@lineht by 1\p@ 
  \ST@stretchht\ST@lineht\advance\ST@stretchht-\baslineskp
  \ifdim\ST@stretchht<\z@\ST@stretchht\z@\fi
  \ST@trace\tw@{Average line height: \the\ST@lineht}% 
  \ST@trace\tw@{Stretched line height: \the\ST@stretchht}% 
}
\newenvironment{strictxtabular}
  {\let\estimate@lineht\mod@estimate@lineht\xtabular}
  {\endxtabular}
\newcommand{\TrickSupertabularIntoMulticols}{%
  \let\mcnewpage=\newpage
  \renewcommand\newpage{%
    \if@firstcolumn
      \hrule width\linewidth height0pt
      \columnbreak
    \else
      \mcnewpage
    \fi
  }%
}
\makeatother

\begin{document}

You can see the result in table~\ref{long}.

\lipsum[2]

\begin{multicols}{2}[\captionof{table}{A table\label{long}}]
\footnotesize\setlength{\tabcolsep}{2pt}
\TrickSupertabularIntoMulticols

\tablehead{%
  \multicolumn{1}{c}{\bfseries First} &
  \multicolumn{1}{c}{\bfseries Second} &
  \multicolumn{1}{c}{\bfseries Third} \\
}
\tabletail{\hline}
\begin{strictxtabular}{@{}|r|r|r|@{}}
\hline
\entry{1010101010}{2121212121}{3232323232}
\entry{1010101010}{2121212121}{3232323232}
\entry{1010101010}{2121212121}{3232323232}
\entry{1010101010}{2121212121}{3232323232}
\entry{1010101010}{2121212121}{3232323232}
\entry{1010101010}{2121212121}{3232323232}
\entry{1010101010}{2121212121}{3232323232}
\entry{1010101010}{2121212121}{3232323232}
\entry{1010101010}{2121212121}{3232323232}
\entry{1010101010}{2121212121}{3232323232}
...
\end{strictxtabular}
\end{multicols}

\end{document}

enter image description here

egreg
  • 1,121,712
  • Thanks for the very useful reply. Is there a way to include the horizontal and vertical lines separating the rows and columns? Thanks in advance. – B Aravind Aug 02 '16 at 13:34
  • @BAravind Are you sure you want to make this like a worksheet window? – egreg Aug 02 '16 at 13:37
  • Also to repeat the header row after every folding and in each page. Thanks. – B Aravind Aug 02 '16 at 13:39
  • @BAravind For that you need xtab. – egreg Aug 02 '16 at 13:40
  • Not exactly. The lines need to be only within the three columns of same row. Adjacent folded rows ideally should not be connected. But I can take it for now if it is not possible or very complicated. But lines need be there to look like a table. – B Aravind Aug 02 '16 at 13:42
  • @BAravind No, rules are not necessary for a table to look like a table: the alignment is sufficient. – egreg Aug 02 '16 at 13:48
  • That is true. My my guide would not like that. :) – B Aravind Aug 02 '16 at 13:52
  • Thanks again for the helpful reply. The code is working very well when it is used as a separate file. when i include in my tex file, the following error message appears:! Undefined control sequence. \ST@cr ... \ST@next \@empty }\fi \fi \fi \ST@next l.111 \entry{1010101010}{2121212121}{3232323232} The control sequence at the end of the top line of your error message was never \def'ed. If you have misspelled it (e.g.,\hobx'), type I' and the correct spelling (e.g.,I\hbox'). Otherwise just continue, and I'll forget about whatever was undefined.` – B Aravind Aug 02 '16 at 14:30
  • @BAravind Did you do \usepackage{xtab}? – egreg Aug 02 '16 at 14:33
  • yes. I did use that. – B Aravind Aug 02 '16 at 14:37