3

I'm trying to create a table that mimics an enumerated list. The idea is that the first column should have the exact same horizontal padding and indentation as an enumeration label. Below is what I have so far. I've tried to base my solution on the standard metrics of a list environment (\leftmargin, \labelsep, etc). It almost works, but the text following the table gets separated into its own paragraph for some reason. Does anyone know why this happens? I would also appreciate tips on how to simplify my solution.

\documentclass{article}

\usepackage[showframe, a5paper]{geometry} \usepackage{array}

\begin{document} Ut dapibus elementum lorem ut rutrum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non nulla dignissim, dignissim nunc ac, auctor magna. \begingroup \list{}{\leftmargin 0pt}\item \relax \begin{tabular}{ @{} % left padding >{\raggedleft} % right-align column p{\labelwidth} % column width @{\hspace{\labelsep}} % right pading l l l } 1. & A & sit & amet \ 2. & B & . & tincidunt \ 3. & C & nulla & $f(x) = \sqrt[3]{x}$ % ^^^ I want this column to look exactly like the "label column" of a list \end{tabular} \endlist \endgroup % the following text will not stick to the previous paragraph Duis quam sem, finibus in nisi non, facilisis blandit magna. Mauris a arcu et est elementum pulvinar. Curabitur eros sem, vehicula nec augue nec, accumsan luctus turpis. \begin{enumerate} \item A \item B \end{enumerate} Mauris a arcu et est elementum pulvinar. Curabitur eros sem, vehicula nec augue nec, accumsan luctus turpis. Curabitur id mauris semper, interdum ligula ac, sagittis velit.

\end{document}

XeLaTeX output

By the way, the outer environment is based on the implementation of the quote environment which I often see recommended as a starting point for custom list- or quote-like environments:

$ latexdef quote

\quote: \long macro:->\list {}{\rightmargin \leftmargin }\item \relax

$ latexdef endquote

\endquote: \long macro:->\endlist

3 Answers3

5

The listliketab package is done for that:

\documentclass{article}
\usepackage{array}
\usepackage{listliketab}

\begin{document} Ut dapibus elementum lorem ut rutrum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non nulla dignissim, dignissim nunc ac, auctor magna.

\storestyleof{enumerate} \begin{listliketab} \newcounter{tabenum}\setcounter{tabenum}{0} \newcommand{\tabitem}{\addtocounter{tabenum}{1}\thetabenum.} \begin{tabular}{@{\hspace*{-0.67em}}L l l l@{}} \tabitem & A & sit & amet \ \tabitem & B & . & tincidunt \ \tabitem & C & nulla & $f(x) = \sqrt[3]{x}$ \end{tabular} \end{listliketab}

Duis quam sem, finibus in nisi non, facilisis blandit magna. Mauris a arcu et est elementum pulvinar. Curabitur eros sem, vehicula nec augue nec, accumsan luctus turpis. \begin{enumerate} \item A \item B \end{enumerate} Mauris a arcu et est elementum pulvinar. Curabitur eros sem, vehicula nec augue nec, accumsan luctus turpis. Curabitur id mauris semper, interdum ligula ac, sagittis velit.

\end{document}

enter image description here

Edit: If I've well understood your last requirements, you can obtain what you want with the \InsertBoxC command, from the plain TeX macro package insbox:

\documentclass{article}
\usepackage{array}
\usepackage{listliketab}
\usepackage{insbox}

\begin{document}

Ut dapibus elementum lorem ut rutrum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non nulla dignissim, dignissim nunc ac, auctor magna. %Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non nulla dignissim, dignissim nunc ac, auctor magna.% \InsertBoxC{\parbox{\textwidth}{\vspace{-\baselineskip}\storestyleof{enumerate}% \begin{listliketab} \newcounter{tabenum}\setcounter{tabenum}{0} \newcommand{\tabitem}{\addtocounter{tabenum}{1}\thetabenum.} \begin{tabular}{@{\hspace{-0.67em}}L l l l@{}} \tabitem & A & sit & amet \ \tabitem & B & . & tincidunt \ \tabitem & C & nulla & $f(x) = √[3]{x}$ \end{tabular}\vspace{-\baselineskip} \end{listliketab}}}% % Duis quam sem, finibus in nisi non, facilisis blandit magna. Mauris a arcu et est elementum pulvinar. Curabitur eros sem, vehicula nec augue nec, accumsan luctus turpis. \begin{enumerate} \item A \item B \end{enumerate} Mauris a arcu et est elementum pulvinar. Curabitur eros sem, vehicula nec augue nec, accumsan luctus turpis. Curabitur id mauris semper, interdum ligula ac, sagittis velit.

\end{document}

enter image description here

Bernard
  • 271,350
  • Thanks your answer. This package looks really promising. I'm having some issues with line breaks/paragraphs, but otherwise it does exactly what I want. It seems impossible to make the line break/paragraph behavior mirror that of a normal list. – MyComputer May 01 '21 at 09:17
  • What type of columns do you have? The standard l,r,c are for single-lined cells. If you want line breaking, use p{some length}or X columns (the latter with tabularx). – Bernard May 01 '21 at 09:36
  • My rows do not span multiple lines/paragraphs. I was talking about the line breaks above and below the table. Suppose I want to place a list in the middle of a paragraph, for example some text \begin{listliketab}...\end{listliketab} some text after the list. I expect the environment to display its contents on a new line with appropriate padding above and below without breaking the text following into a new paragraph. – MyComputer May 01 '21 at 14:19
  • @user100361: I've added a variant using \insertBoxC from insboxwhich does what you want (as far as I've understood what you want): at the point of insertion, the current paragraph goes till the end of line, then the listliketab environment is inserted, and the paraph continues afterwards. The vertical padding has to be fine-tuned by hand. Please see whether it's OK for you. – Bernard May 01 '21 at 18:40
4

I recommend using an actual enumerate environment. To get columns, use the tabto package. You can specify the tabbing values in \za and \zb. More columns can be added in the same manner.

\documentclass{article}
\usepackage{enumitem,tabto}
\newcommand\za{\tabto*{.3in}}
\newcommand\zb{\tabto*{.8in}}
\begin{document}
\begin{enumerate}
            \item A\za sit   \zb amet
            \item B\za .     \zb tincidunt
            \item C\za nulla \zb $f(x) = \sqrt[3]{x}$
\end{enumerate}
\end{document}

enter image description here


SUPPLEMENT

In response to the OP's desire to have the columns auto-adjust to the content, I have implemented a version that writes column tabto's to the .abc file, and uses \@starttoc{abc} to read them back in. It can take up to 3 compilations to fully resolve the column widths. There may also be times where one needs to delete the .aux and .abc files and recompile, if the column content or padding shrinks.

The MWE is set up for a 5-column table. The value of \padding defines the inter-column gap.

\documentclass{article}
\usepackage{enumitem,tabto}
\newlength\zaval   \newlength\zbval
\newlength\zcval   \newlength\zdval
\newlength\padding
\setlength\padding{1em}
\newcommand\z[1]{\zaux#1\relax}
\def\zaux#1&#2&#3&#4&#5\relax{\za{#1}\zb{#2}\zc{#3}\zd{#4}#5}
\newcommand\za[1]{\zcheck{#1}{0pt}   {\zaval}}
\newcommand\zb[1]{\zcheck{#1}{\zaval}{\zbval}}
\newcommand\zc[1]{\zcheck{#1}{\zbval}{\zcval}}
\newcommand\zd[1]{\zcheck{#1}{\zcval}{\zdval}}
\newcommand\zcheck[3]{#1\sbox0{\ignorespaces#1\unskip\kern\padding}
  \ifdim\dimexpr#2+\wd0>#3\relax
  \global#3=\dimexpr#2+\wd0\relax\fi
  \tabto*{#3}}
\makeatletter
\AtBeginDocument{\@starttoc{abc}}
\makeatother
\AtEndDocument{%
\addtocontents{abc}
  {\noexpand\global\noexpand\zaval=\the\zaval\noexpand\relax}
\addtocontents{abc}
  {\noexpand\global\noexpand\zbval=\the\zbval\noexpand\relax}
\addtocontents{abc}
  {\noexpand\global\noexpand\zcval=\the\zcval\noexpand\relax}
\addtocontents{abc}
  {\noexpand\global\noexpand\zdval=\the\zdval\noexpand\relax}
}
\begin{document}
\begin{enumerate}
  \item \z{A  & situation& amet                & hi mom     & Done}
  \item \z{B  & .        & tincidunt           & Boo!       & right}
  \item \z{bcC& nulla    & $f(x) = \sqrt[3]{x}$& Tsk, Tsk...& now.}
\end{enumerate}
\end{document}

enter image description here

For these particular data, the .abc file ends up as

\global \zaval =27.50005pt\relax 
\global \zbval =75.88905pt\relax 
\global \zcval =133.36137pt\relax 
\global \zdval =190.69481pt\relax 
4

Just set all the length that define vertical spaces in a list environment to 0pt. And, by the way, why do you use \begingroup\list and \endlist\endgroup together instead of the usual \begin{list} and \end{list} which have the same effect but is better LaTeX code?

EDIT: Actually, you can get rid of the list environment if you place \par\noindent before and after the tabular.

\documentclass{article}

\usepackage[showframe, a5paper]{geometry} \usepackage{array}

\begin{document} Ut dapibus elementum lorem ut rutrum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non nulla dignissim, dignissim nunc ac, auctor magna.

\begin{list}{}{% \setlength\leftmargin{0pt}\setlength{\topsep}{0pt} \setlength{\itemsep}{0pt}\setlength\partopsep{0pt} \setlength{\parskip}{0pt}\setlength\parsep{0pt} }\item \begin{tabular}{ @{} % left padding >{\raggedleft} % right-align column p{\labelwidth} % column width @{\hspace{\labelsep}} % right pading l l l } 1. & A & sit & amet \ 2. & B & . & tincidunt \ 3. & C & nulla & $f(x) = \sqrt[3]{x}$ \ % ^^^ I want this column to look exactly like the "label column" of a list \end{tabular} \end{list} Duis quam sem, finibus in nisi non, facilisis blandit magna. Mauris a arcu et est elementum pulvinar. Curabitur eros sem, vehicula nec augue nec, accumsan luctus turpis.

\par\noindent \begin{tabular}{ @{} % left padding >{\raggedleft} % right-align column p{\labelwidth} % column width @{\hspace{\labelsep}} % right pading l l l } 1. & A & sit & amet \ 2. & B & . & tincidunt \ 3. & C & nulla & $f(x) = \sqrt[3]{x}$ \ % ^^^ I want this column to look exactly like the "label column" of a list \end{tabular} \par\noindent Duis quam sem, finibus in nisi non, facilisis blandit magna. Mauris a arcu et est elementum pulvinar. Curabitur eros sem, vehicula nec augue nec, accumsan luctus turpis. \begin{enumerate} \item A \item B \end{enumerate} Mauris a arcu et est elementum pulvinar. Curabitur eros sem, vehicula nec augue nec, accumsan luctus turpis. Curabitur id mauris semper, interdum ligula ac, sagittis velit.

\end{document}

enter image description here

  • Thank you, it was apparently \begingroup / \endgroup that caused the text following the table to get broken into a new paragraph. The reason I wrap the table in a list is to get correct vertical padding and because it is very good at preventing extra line breaks. – MyComputer May 01 '21 at 08:38