In der folgenden Tabelle (Wahrheitstafel) muss ich alle Zeilen durchstreichen, in deren letzter Spalte eine Null steht. Wie kann ich das machen?

alt text

\documentclass[margin=5mm]{standalone} 
\begin{document} 
\begin{tabular}{*3{c}|c} 
  $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}

gefragt 14 Dez '13, 13:02

welle's gravatar image

welle
106222631
Akzeptiert-Rate: 0%


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

alt text

Permanenter link

beantwortet 14 Dez '13, 14:16

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k2815
Akzeptiert-Rate: 53%

bearbeitet 14 Dez '13, 18:28

Hier ist noch ein Vorschlag mit tikz, der nur einen Durchlauf braucht. Allerdings werden die Linien unter der Kopfzeile und vor der letzten Spalte an der letzten Zelle der ersten Zeile ausgerichtet. Das ist die, in der jetzt das K steht. Diese muss also eine ausreichend große Breite und Höhe haben.

\documentclass[margin=5mm]{standalone}

\usepackage{tikz}
\usetikzlibrary{matrix}

% Syntax \tabellenlinien[<name der matrix>]{<anzahl der spalten>} 
\newcommand\tabellenlinien[2][m]{% 
  % Linie unter Kopfzeile
  \draw (#1.west|-#1-1-#2.south)--(#1-1-#2.south-|#1.east); 
  % senkrechte Linie vor letzter Spalte
  \draw (#1.north-|#1-1-#2.west)--(#1.south-|#1-1-#2.west); 
  }

% Syntax \zeilenstreichen[<name der matrix>][<kommaseparierte liste der zu streichenden zeilen] 
% Die Kopfzeile ist die 0.Zeile 
\newcommand\zeilenstreichen[2][m]{% 
  \foreach [evaluate=\i as \zeile using int(\i+1)] \i in {#2} 
   \draw[streichen](#1-\zeile-1-|#1.west)--(#1-\zeile-1-|#1.east);}

% Einstellungen für die Streichung, z.B. thick, red 
\tikzset{streichen/.style={red}}

\begin{document}

\begin{tikzpicture} 
\matrix(m)[matrix of math nodes]{ 
  A_1&A_2 &A_3&K\\
  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\\}; 
  \tabellenlinien{4} 
  \zeilenstreichen{1,2,3} 
\end{tikzpicture}
\hspace{0.5cm}
\begin{tikzpicture} 
\matrix(m)[matrix of math nodes]{ 
  A_1&A_2 &A_3&K\\
  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\\}; 
  \tabellenlinien{4} 
  \zeilenstreichen{4,...,8} 
\end{tikzpicture}

\end{document}

alt text

Permanenter link

beantwortet 14 Dez '13, 17:57

esdd's gravatar image

esdd
17.7k254256
Akzeptiert-Rate: 62%

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×254

gestellte Frage: 14 Dez '13, 13:02

Frage wurde gesehen: 12,768 Mal

zuletzt geändert: 14 Dez '13, 18:28