Diese Antwort enthält drei Lösungsvorschläge, die alle mit der originalen tabular
-Umgebung arbeiten (und nicht eine TikZ-\matrix
verwenden, auch wenn das in diesem einfachen Fall noch sehr einfach umzusetzen wäre).
Alle drei Varianten verwenden dafür die .aux
-Datei, um sich Positionen auf dem Papier zu merken und benötigen deshalb mindestens zwei Kompilierungsvorgänge, um eine korrekte Linie zu zeichnen.
Damit die Tabellen selbst frei von irgendwelchen Markierungen und Hilfsmakros sind, habe ich dafür die (Pseudo-)Spalten M
und N
definiert, die einfach vor (M
) der ersten und nach (N
) der letzten Spalte, die markiert werden sollen, in die Spaltenspezifikation eingefügt werden.
Wir benötigen außerdem noch einen Count(er), der mitzählt, in welcher Zeile wir uns befinden. LaTeX stellt außerdem das Makro \in@
und \ifin@
zur Verfügung (in PGF/TikZ existieren diese auch mit dem Prefix pgfutil@
).
Der allen Lösungen gemeinsame Code ist dann neben dem Laden des array
-Pakets
\newcount\c@tabularlinecounter
\newcommand*\setLinesToCross[1]{\gdef\@lines{#1}\global\c@tabularlinecounter\z@\relax}
\newcolumntype{M}{>{%
\global\advance\c@tabularlinecounter1\relax
\@expandtwoargs\in@{,\the\c@tabularlinecounter,}{,\@lines,}%
\ifin@\@marklines@s\fi}}
\newcolumntype{N}{<{%
\@expandtwoargs\in@{,\the\c@tabularlinecounter,}{,\@lines,}%
\ifin@\@marklines@e\fi}}
Die Makros \@marklines@s
und \@marklines@e
müssen jetzt nur noch entsprechend der Lösung definiert werden. (Dies ist eher dafür, um diese Antwort übersicht gestalten zu können. Wenn in der Praxis eh nur eine Lösung verwendet wird, kann die Definition der Makros natürlich direkt in die Spaltendefinition geschoben werden.)
zref-savepos
Mittels \zsaveposx
wird die horizontale Position auf dem Papier in die .aux
-Datei geschrieben, die dann beim nächsten Kompiliervorgang mittels \zposx
gelesen wird. Es sei angemerkt, dass die Linie unter/vor dem Zeileninhalt gezeichnet wird. Ist dies ungewünscht (bei unterschiedlichen Farben), kann das Zeichnen auch in die N
-Spalte verschoben werden, dann allerdings mit \llap
und nicht \rlap
.
Für jede Tabellenzeile werden zwei Zeilen in die .aux
-Datei geschrieben.
\usepackage{zref-savepos}
\newcommand*\@marklines@s{%
\zsaveposx{tab-\the\c@tabularlinecounter}%
\rlap{\rule[.65ex]{\dimexpr\zposx{tabend-\the\c@tabularlinecounter}sp-%
\zposx{tab-\the\c@tabularlinecounter}sp\relax}{.4pt}}}
\newcommand*\@marklines@e{\zsaveposx{tabend-\the\c@tabularlinecounter}}
TikZ
Die TikZ-Lösung funktioniert sehr ähnlich, dank der tikzmark
-Library kann die Linie ebenfalls unter dem Text gezeichnet werden.
Für jede Tabellenzeile werden fünf Zeilen in die .aux
-Datei geschrieben.
\usepackage{tikz}
\usetikzlibrary{tikzmark}
\newcommand*\@marklines@s{%
\tikz[remember picture,overlay]
\draw (+0pt,+.65ex) -- ([yshift=+.65ex]pic cs:tabend-\the\c@tabularlinecounter);}
\newcommand*\@marklines@e{\pgfmark{tabend-\the\c@tabularlinecounter}}
PGF
Eine Umsetzung mittels PGF, die ebenfalls die Linie unter dem Text zeichnet, würde eine ähnliche Implementation benötigen, die bereits die tikzmark
-Library verwendet. Um das Rad nicht neu zu erfinden, stelle ich mich hier mit einer einfachen Lösung zufrieden, die die Linie „nur“ über den Text zeichnen kann.
Das Makro \pgfrememberpicturepositiononpagetrue
ist das PGF-Äquivalent der remember picture
-Option, overlay
macht nichts anderes als \pgf@relevantforpicturesizefalse
.
Es gibt in PGF ebenfalls eine schnellere Version als \pgfnode
um Koordinaten zu definieren, nämlich \pgfcoordinate
, allerdings hat das Makro in der Version 2.10 von PGF/TikZ noch ein Bug, so dass man es nicht mit remember picture
verwenden konnte.
Für jede Tabellenzeile werden zwei Zeilen in die .aux
-Datei geschrieben
\usepackage{pgf}
\newcommand*\@marklines@s{%
\pgfpicture
\pgfrememberpicturepositiononpagetrue
\pgfsetbaseline{+-.65ex}
\pgfnode{coordinate}{center}{}{tab-\the\c@tabularlinecounter}{}
\endpgfpicture}
\newcommand*\@marklines@e{%
\pgfpicture
\pgfrememberpicturepositiononpagetrue
\pgf@relevantforpicturesizefalse
\pgfsetbaseline{+0pt}
\pgfpathmoveto{\pgfpoint{+0pt}{+.65ex}}
\pgfpathlineto{\pgfpointanchor{tab-\the\c@tabularlinecounter}{center}}
\pgfusepath{stroke}
\endpgfpicture}
Code
\documentclass[margin=5mm]{standalone}
\usepackage{array}
\makeatletter
\newcount\c@tabularlinecounter
\newcommand*\setLinesToCross[1]{\gdef\@lines{#1}\global\c@tabularlinecounter\z@\relax}
\newcolumntype{M}{>{%
\global\advance\c@tabularlinecounter1\relax
\@expandtwoargs\in@{,\the\c@tabularlinecounter,}{,\@lines,}%
\ifin@\@marklines@s\fi}}
\newcolumntype{N}{<{%
\@expandtwoargs\in@{,\the\c@tabularlinecounter,}{,\@lines,}%
\ifin@\@marklines@e\fi}}
%% zref-savepos
\usepackage{zref-savepos}
\newcommand*\@marklines@s{%
\zsaveposx{tab-\the\c@tabularlinecounter}%
\rlap{\rule[.65ex]{\dimexpr\zposx{tabend-\the\c@tabularlinecounter}sp-%
\zposx{tab-\the\c@tabularlinecounter}sp\relax}{.4pt}}}
\newcommand*\@marklines@e{\zsaveposx{tabend-\the\c@tabularlinecounter}}
%% TikZ
%\usepackage{tikz}
%\usetikzlibrary{tikzmark}
%\newcommand*\@marklines@s{%
% \tikz[remember picture,overlay]
% \draw (+0pt,+.65ex) -- ([yshift=+.65ex]pic cs:tabend-\the\c@tabularlinecounter);}
%\newcommand*\@marklines@e{\pgfmark{tabend-\the\c@tabularlinecounter}}
%% PGF
%\usepackage{pgf}
%\newcommand*\@marklines@s{%
% \pgfpicture
% \pgfrememberpicturepositiononpagetrue
% \pgfsetbaseline{+-.65ex}
% \pgfnode{coordinate}{center}{}{tab-\the\c@tabularlinecounter}{}
% \endpgfpicture}
%\newcommand*\@marklines@e{%
% \pgfpicture
% \pgfrememberpicturepositiononpagetrue
% \pgf@relevantforpicturesizefalse
% \pgfsetbaseline{+0pt}
% \pgfpathmoveto{\pgfpoint{+0pt}{+.65ex}}
% \pgfpathlineto{\pgfpointanchor{tab-\the\c@tabularlinecounter}{center}}
% \pgfusepath{stroke}
% \endpgfpicture}
\makeatother
\begin{document}
\setLinesToCross{2,3,4}
\begin{tabular}{M*3{c}|cN}
$A_1$ & $A_2$ & $A_3$ & $K$ \\ \hline
0 & 0 & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 1 & 0 & 0 \\
0 & 1 & 1 & 1 \\
1 & 0 & 0 & 1 \\
1 & 0 & 1 & 1 \\
1 & 1 & 0 & 1 \\
1 & 1 & 1 & 1
\end{tabular}
\setLinesToCross{5,6,7,8,9}
\begin{tabular}{M*3{c}|cN}
$A_1$ & $A_2$ & $A_3$ & $K$ \\ \hline
0 & 0 & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 1 & 0 & 0 \\
0 & 1 & 1 & 1 \\
1 & 0 & 0 & 1 \\
1 & 0 & 1 & 1 \\
1 & 1 & 0 & 1 \\
1 & 1 & 1 & 1
\end{tabular}
\end{document}
Output