# Is there a tool to make a complicated Table like this one (“Auswahlliste” from “Pahl/Beitz Konstruktionsmethodik”)?

I’m developing a product as a part of my thesis for my university in Germany. We are supposed to use standard methodology for decision making. One of the tools is called “Auswahlliste”. (I don’t even know how to translate it. Maybe “choice list”.) It has a peculiar look, but it’s well accepted among academics in Germany. But just thinking about creating it in tabular environment scares me. What would you suggest? Would you try to make it with Tex-measures or would you just make a Table in Excel or any other WYSIWYG software and import it as PDF? Is there a suitable tool to draw such wicked tables in Tex-world?

Here is what it looks like:

This figure was taken from the book Pahl/Beitz Konstruktionslehre, ISBN 978-3-642-29569-0.

To clear any confusion: I don’t have to make this table look like this at all costs. It’s just a standard table design used in German industry. I acknowledge all the flaws of this design and its lack of readability. I myself had a hard time understanding it at first glance. But still it’s the broadly accepted standard here and I would like to know whether it is possible to draw it with LaTeX tools. If I was trying to change the shape of it to fit my taste, I wouldn’t post this question.

• Not really. Might be easier to draw than to code as a table. – daleif Mar 11 '14 at 14:23
• If you change the diagonal line to a "step" then you could just do it in latex tabular, no packages needed (other than the standard graphicx to rotate the text). If you want the diagonal line then you may want to use pstricks or tikz nodes to draw that line. – David Carlisle Mar 11 '14 at 14:25
• The problem is that diagonal line at the right upper part of the table. With a lot of effort it might be possible to manage this by using the \slashbox package. – user31729 Mar 11 '14 at 14:29
• If you have a digitized blank form, there are tools for overlaying text atop it. – Steven B. Segletes Mar 11 '14 at 14:38
• This is the most muddled table I've ever seen. You are supposed to use standard methodology - This does not mean you have to use ugly tables. How about redesigning the table with use of the same criterias: same method (which is what they want you to use) but different design!? – schmendrich Mar 11 '14 at 15:45

Here is the third revision of my approach to programmatically create such diagrams, using TiKZ.

## Sample code

Preamble and definitions follow below: this code is meant to demonstrate the interface to the environments/macros which I define.

\begin{document}
\begin{assessmentTable}{%
\newcommand\ItemTitle       {L\"osungsvariante (Lv) eintragen:}
\newcommand\AssessmentTitle {Entscheidung}
\newcommand\RemarksTitle    {Bemerkungen (Hinweise, Begr\"undungen)}

}%
1 & + & + & + & ? &   &     & Anzahl er Me{\ss}stellen                  & ? \\
2 & + & - &   &   &   &     & Unterbringung der Masse                   & - \\
3 & - &   &   &   &   &     & Radioaktivit\"at                          & - \\
4 & + & + & + & + &   & (+) & (Weiterentwicklung bisheriger L\"osungen) & + \\
5 & + & + & + & + &   &     &                                           & + \\
6 & - &   &   &   &   &     & Fl\"ussigkeit nicht Leitend               & - \\
7 & + & + & + & + &   &     &                                           & + \\
8 & + & + & + & + &   &     & s.\ Lv 7                                  & +
\end{assessmentTable}
\end{document}


## Remarks.

The table is constructed by making simple macro calls, and inputting the contents of the table as one would a normal table in LaTeX. This allows for the easy construction and customization of the output.

The code admittedly has some idiosyncracies. Some adjustment to the lengths may be necessary to prevent some of the text in the table from overlapping, for example. Also, some of the ways I chose to code this environment were to avoid mysterious errors: for example, it would appear that if any TiKZ code appears in the tikzpicture environment after the final \foreach loop, the routine which defines paths produces an error as a result of \A no longer being defined. (I do not know why this should happen.)

Having said that, this code should produce reasonable results for simple inputs, and is hopefully robust to minor tweaks.

Below is the code to produce the above example document.

## Helper definitions

\documentclass[a4paper,10pt]{article}
\usepackage{pbox,tikz}
\usetikzlibrary{matrix,calc,fit,intersections}

\newlength\criterionwidth           % width for criterion table columns
\newlength\labelheight              % height for labels for assessment criteria
\newlength\labeldepth               % depth for labels for assessment criteria
\newlength\itemcolwidth             % width for the left-most column
\newlength\criterionlabelskip       % vert. skip between legend and first criterion label
\newlength\criterionlabelindent     % left indend for criterion labels from their columns
\newlength\assessmentdiagtopstretch % vert.dist. upwards to pull top of the diagonal
\newlength\assessmentdiagbotstretch % vert.dist. downwards to pull bottom of the diagonal
\newlength\remarkswidth             % absolute width of remarks column
\newlength\remarksxsep              % inner horiz. separation of remarks from column edge

\setlength\criterionwidth           {1.5em}
\setlength\labelheight              {3ex}
\setlength\labeldepth               {1ex}
\setlength\itemcolwidth             {3em}
\setlength\criterionlabelskip       {2ex}
\setlength\criterionlabelindent     {0ex}
\setlength\assessmentdiagtopstretch {5mm}
\setlength\assessmentdiagbotstretch {2mm}
\setlength\remarkswidth             {80mm}
\setlength\remarksxsep              {1em}

\newcommand\labeltypeface   {\itshape}      % face for description labels in the table
\newcommand\celltypesize    {\footnotesize} % size of evalutation cell contents
\newcommand\remarktypeface  {\small}        % size of remark cell contents


The various lengths can be varied to taste, and the typefaces can be used to control the appearance of the text in the table.

\makeatletter
\newcount\@RemarkCol            % Counter for position of the Remarks column
\newtoks\@CriterionNameToks     % Token list for labels of the criteria to asses
\@CriterionNameToks{}

\newcommand\AddCriterion[2]{%   Macro to define a new criterion column / label
\edef\@tempa{\the\@CriterionNameToks}%
\ifx\empty\@tempa\@CriterionNameToks{{#1}/{#2}}\else
\expandafter\@CriterionNameToks\expandafter{\the\@CriterionNameToks,{#1}/{#2}}
\fi}


The macro \AddCriterion is meant to be the user interface to define the criteria of assessment in the table. We also define a counter to keep track of the position of the Remarks column, depending on the number of criteria to be assessed.

## Table environment definition

\newenvironment{assessmentTable}[1]{%
\@CriterionNameToks{}%
\@RemarkCol=2\relax
#1%
\begin{tikzpicture}
\expandafter\def\expandafter\@CriterionNames\expandafter{\the\@CriterionNameToks}

\node (CriterionLegend) [inner sep=1em] {\parbox{\paperwidth}{\CriterionLegend}};

\coordinate (Criterion-first-anchor) at ($(CriterionLegend.south west) + (0,-\criterionlabelskip)$);
\def\CriterionAnchor{Criterion-first-anchor}
\foreach \A/\critLabel in \@CriterionNames {
\node [anchor=north west, text width=\criterionwidth, minimum height=\labelheight+\labeldepth, inner sep=0pt]
(\A-anchor) at (\CriterionAnchor) {};
\node [anchor=west, text height=\labelheight, text depth=\labeldepth]
(\A-label) at  ($(\A-anchor.east) + (\criterionlabelindent,0)$)
{\labeltypeface\critLabel};
\xdef\CriterionAnchor{\A-anchor.south east}%
}
\node [anchor=north west, inner xsep=\remarksxsep, inner ysep=0pt, text height=\labelheight, text depth=\labeldepth,
text width=\remarkswidth-2*\pgfkeysvalueof{/pgf/inner xsep}]
(Remarks-title) at (\CriterionAnchor)
{\labeltypeface\RemarksTitle};

\node [anchor=south west, minimum height=\itemcolwidth,rotate=90]
(ItemTitle) at (Remarks-title.north -| CriterionLegend.west)
{\ItemTitle};
\node [inner sep=0pt, fit=(ItemTitle)(ItemTitle |- CriterionLegend.north)]
(ItemTitle) {};

\def\CriterionAnchor{ItemTitle.west}
\node [anchor=north west, text height=\labelheight, text depth=\labeldepth, inner ysep=0pt]

\foreach \A/\critLabel in \@CriterionNames {%
\node [inner sep=0pt, anchor=south, minimum width=\criterionwidth, text height=\labelheight, text depth=\labeldepth]
}
\node [anchor=north west, rotate=90, minimum height=\criterionwidth, inner ysep=0pt]
(AssessmentTitle) at (Remarks-title.south east)  {\AssessmentTitle};
\node [inner sep=0pt, fit=(AssessmentTitle)] (AssessmentTitle)  {};
\node [anchor=north east]
(AssessmentLegend) at (CriterionLegend.north -| AssessmentTitle.east)
{\pbox{\paperwidth}{\AssessmentLegend}};

\def\@GridFinalRow{0}

\matrix [%
anchor=north west, matrix of nodes,%
nodes in empty cells,
inner sep=0pt,
nodes={%
draw=white, inner sep=0pt,
\ &\ &\ &\ &\ &\ &\ &\ &\ &\multicolumn{1}{c}{\ }&\multicolumn{3}{c|}{\ }\\
\hline
\end{tabular}

\end{document}

• Oops, I made a mistake... I planned to give a bounty to @user47919, but clicked the wrong place. – Niel de Beaudrap Mar 18 '14 at 11:09
• @NieldeBeaudrap You'll have to contact the staff (via the help link) to get the bounty here reversed – Joseph Wright Mar 18 '14 at 11:48
• @NieldeBeaudrap I flagged your comment, I would guess the mods can move the bounty :) (oh apparently not: If it isn't possible I'll bouncy the bounty on, and award 100 to the other answer:-) – David Carlisle Mar 18 '14 at 11:49
• @DavidCarlisle: That would be swell, thanks! – Niel de Beaudrap Mar 18 '14 at 11:57
• @NieldeBeaudrap bounty started, can't be awarded until tomorrow I think. – David Carlisle Mar 21 '14 at 15:08

The tap macros could be used to typeset this table:

\input tap
\input trans

\beginanchtable
\begintableformat & \center \endtableformat
%\B|+ | | | | | | | | \E|
\diagstroke \trth DOWN {0 0 0 1} a
\B"- " " " " \kern16mm " " " " \E"
\-
\-
\B|: | @4 Info | @4 Info 2 \E|
\B|- | @4 \- | " " " \E|
\uranchor8a
\B|: | " @4 Header A " " "  \E|
\B|- @2 | @4 \- " " "  \E|
\B|: | | "  @3 Header B " " "  \E|
\B|- @3 | @4 \- " "  \E|
\B|: | | | " @2 Header C " " "  \E|
\llanchor6a
\B|- @4 | @4 \- |  \E|
\B|: Lv | A | B | C | @4 Cos tam | \revolve\hbox{Head rot.} \E|
\=
\B|: 1 | + | + | + | @4 \left{Table position 1} | ?  \E|
\-
\B|: 2 | + | -- |  | @4 \left{Table position 2} | -- \E|
\-
\B|: 3 | -- |  |   | @4 \left{Table position 3} | +  \E|
\-
\endanchtable
\useanchors
\bye


Run the commands below to get PDF:

tex diagonal.tex
dvips diagonal.dvi
ps2pdf diagonal.ps


• This tap package looks like a proper way to do it since it looks tidier on the code side and could be easier to lear than TikZ solution. Unfortunately i havent found any documentation that would explain how to create such tables, so it's not so easy after all (for now). But it's definitely worth to look up later. – Smiling_Man Mar 14 '14 at 12:23
• Can you locate good PDF documentation for this package, @user47919? – Niel de Beaudrap Mar 14 '14 at 19:42
• Download package from CTAN tap077.zip and unzip it. Change to tapdoc/ folder and typeset the documentation with these commands: tex tapdoc ; dvips tapdoc; ps2pdf tapdoc.ps. – user47919 Mar 15 '14 at 18:26