0

I created a custom environment to separate the semantics from design and formatting of use case tables. Everything works fine except the tabularx environment is unable to break across columns which creates nasty looking areas of white space when several (especially longer) use cases follow right after one another. Is there any way I can enable them to break across columns?

MWE 1 MWE 2

\documentclass[10pt]{scrartcl}

\usepackage[english]{babel}
\usepackage[margin=15mm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[svgnames,table]{xcolor}

\usepackage{booktabs,tabularx,multicol,enumitem,blindtext}
\setlist{leftmargin=*,nosep}

\newcommand{\tabhead}[2][DarkBlue]{\textbf{\large\sffamily\color{#1} #2}}

\newcounter{usecase}
\newenvironment{usecase}[1]{
    \refstepcounter{usecase}
    \noindent\tabularx{\linewidth}{lX}
    \rowcolor{gray!20}\tabhead{Case~\theusecase} & \tabhead[DarkGreen]{#1}\\
    \toprule
    }
    {\bottomrule\endtabularx\medskip}

\newcommand{\actor}[1]{Actor & #1\\\midrule}

\newcommand{\precondition}[1]{Needs & #1\\\midrule}

\newcommand{\mainpath}[1]{
    Path & \begin{minipage}[t]{\linewidth}\blindenumerate[20]
    \end{minipage}\\}

\setlength{\footskip}{1cm}



\begin{document}

\title{The Title}
\author{Casimir}
\date{\today}
\maketitle

\begin{abstract}
    \blindtext
\end{abstract}

\begin{multicols}{2}

\section{First Section}

\blindtext

\subsection{First Subsection}

\begin{usecase}{Some use case}
    \actor{Some actor}
    \precondition{User logged in}
    \mainpath{}
\end{usecase}

\begin{usecase}{Some use case}
    \actor{Some actor}
    \precondition{User logged in}
    \mainpath{}
\end{usecase}

\begin{usecase}{Some use case}
    \actor{Some actor}
    \precondition{User logged in}
    \mainpath{}
\end{usecase}

\begin{usecase}{Some use case}
    \actor{Some actor}
    \precondition{User logged in}
    \mainpath{}
\end{usecase}

\begin{usecase}{Some use case}
    \actor{Some actor}
    \precondition{User logged in}
    \mainpath{}
\end{usecase}

\begin{usecase}{Some use case}
    \actor{Some actor}
    \precondition{User logged in}
    \mainpath{}
\end{usecase}

\end{multicols}

\end{document}

Update

New implementation with inspiration from David Carlisle.

\documentclass[10pt]{scrartcl}

\usepackage[english]{babel}
\usepackage[margin=15mm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[svgnames,table]{xcolor}

\usepackage{multicol,enumitem,blindtext}
\setlist{leftmargin=*,nosep}

\newcommand{\uchead}[2][DarkBlue]{\textbf{\large\sffamily\color{#1} #2}}

\newcounter{usecase}
\newenvironment{usecase}[1]{
    \refstepcounter{usecase}
    \noindent\colorbox{gray!20}{%
       \makebox[\dimexpr\linewidth-2\fboxsep][l]{%
         \uchead{Case~\theusecase}~~\uchead[DarkGreen]{#1}}}\par
    \hrule}
    {\bigskip}

\newlength\lcol\setlength{\lcol}{1.2cm}
\newcommand{\ucentry}[1]{\noindent\strut\makebox[\lcol][l]{\textbf{#1}}}

\newcommand{\actor}[1]{%
    \ucentry{Actor} #1\hrule}

\newcommand{\precondition}[1]{%
    \ucentry{Needs} #1\hrule}

\newcommand{\mainpath}[1]{%
    \ucentry{Path}
    \vspace{-\dimexpr\parskip+\baselineskip}%
    \setlist[enumerate]{labelindent=\dimexpr\lcol+\fboxsep} #1\smallskip\hrule}

\setlength{\footskip}{1cm}



\begin{document}

\title{The Title}
\author{Casimir}
\date{\today}
\maketitle

\begin{abstract}
    \blindtext
\end{abstract}

\begin{multicols}{2}

\section{First Section}

\blindtext

\subsection{First Subsection}

\begin{usecase}{Some use case}
    \actor{Some actor}
    \precondition{User logged in}
    \mainpath{\blindenumerate[9]}
\end{usecase}

\begin{usecase}{Some use case}
    \actor{Some actor}
    \precondition{User logged in}
    \mainpath{\blindenumerate[9]}
\end{usecase}

\begin{usecase}{Some use case}
    \actor{Some actor}
    \precondition{User logged in}
    \mainpath{\blindenumerate[9]}
\end{usecase}

\begin{usecase}{Some use case}
    \actor{Some actor}
    \precondition{User logged in}
    \mainpath{\blindenumerate[9]}
\end{usecase}

\begin{usecase}{Some use case}
    \actor{Some actor}
    \precondition{User logged in}
    \mainpath{\blindenumerate[9]}
\end{usecase}

\begin{usecase}{Some use case}
    \actor{Some actor}
    \precondition{User logged in}
    \mainpath{\blindenumerate[9]}
\end{usecase}

\begin{usecase}{Some use case}
    \actor{Some actor}
    \precondition{User logged in}
    \mainpath{\blindenumerate[9]}
\end{usecase}

\end{multicols}

\end{document}

1 Answer 1

1

Things that look like lists are usually better set as lists than tables, then they break naturally.

You could fiddle a bit more with the spacing but:

enter image description here

\documentclass[10pt]{scrartcl}

\usepackage[english]{babel}
\usepackage[margin=15mm]{geometry}
\usepackage[utf8]{inputenc}
\usepackage[svgnames,table]{xcolor}

\usepackage{booktabs,tabularx,multicol,enumitem,blindtext}
\setlist{leftmargin=*,nosep}

\newcommand{\tabhead}[2][DarkBlue]{\textbf{\large\sffamily\color{#1} #2}}

\newcounter{usecase}
\newenvironment{usecase}[1]{
    \refstepcounter{usecase}
    \colorbox{gray!20}{%
       \makebox[2cm][l]{\tabhead{Case~\theusecase}}%
       \hspace{6pt}%
       \makebox[\dimexpr\linewidth-3cm-6pt-2\fboxsep]{%
         \tabhead[DarkGreen]{#1}}}\par
    \hrule}
    {\hrule\medskip}

\newcommand{\actor}[1]{%
   \par
   \makebox[2cm][l]{\strut Actor}
       \hspace{6pt}%
   \mbox{#1}\par\hrule}

\newcommand{\precondition}[1]{%
   \par
   \makebox[2cm][l]{\strut Needs}
       \hspace{6pt}%
   \mbox{#1}\par\hrule}


\newcommand{\mainpath}[1]{%
   \par
   \makebox[2cm][l]{\strut Path}
    \par
   \nobreak
   \vspace{-\dimexpr\parskip+\baselineskip}%
    \setlist[enumerate]{leftmargin=2cm}%
   \blindenumerate[20]
  }

\setlength{\footskip}{1cm}



\begin{document}

\title{The Title}
\author{Casimir}
\date{\today}
\maketitle

\begin{abstract}
    \blindtext
\end{abstract}

\begin{multicols}{2}

\section{First Section}

\blindtext

\subsection{First Subsection}

\begin{usecase}{Some use case}
    \actor{Some actor}
    \precondition{User logged in}
    \mainpath{}
\end{usecase}

\begin{usecase}{Some use case}
    \actor{Some actor}
    \precondition{User logged in}
    \mainpath{}
\end{usecase}

\begin{usecase}{Some use case}
    \actor{Some actor}
    \precondition{User logged in}
    \mainpath{}
\end{usecase}

\begin{usecase}{Some use case}
    \actor{Some actor}
    \precondition{User logged in}
    \mainpath{}
\end{usecase}

\begin{usecase}{Some use case}
    \actor{Some actor}
    \precondition{User logged in}
    \mainpath{}
\end{usecase}

\begin{usecase}{Some use case}
    \actor{Some actor}
    \precondition{User logged in}
    \mainpath{}
\end{usecase}

\end{multicols}

\end{document}
5
  • That's a great suggestion! I adapted your implementation made some changes (see my updated question). A few questions remain, though: 1. Can I set \parskip to zero only inside an environment so that I don't have to include a \noindent on every new line? 2. How can I prevent the \hrules from breaking to the next column, even if at the very end of a column? 3. How come the \hrule below the enumerate environment is right on the baseline (unless I include a \smallskip)?
    – Janosh
    Aug 15, 2017 at 16:53
  • 4. How can I make text break onto new lines if it doesn't fit into the use case header?
    – Janosh
    Aug 15, 2017 at 17:15
  • 1
    @Casimir replace the \makebox[length]{stuff} by \parbox[t]{length}{\raggedright stuff} in the definitions Aug 15, 2017 at 18:34
  • yes just \setlength\parindent{0pt} inside the environment. Add more \nobreak here and there (or put all the heading lines into a minipage) or ... Aug 15, 2017 at 18:36
  • Weird, I'm pretty sure I had tried \setlength\parindent{0pt} to no effect. Now it works, though. Thanks for your help!
    – Janosh
    Aug 16, 2017 at 6:39

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .