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, 07:02

welle's gravatar image

welle
10642431
Akzeptiert: 100%


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, 08:16

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k1415

bearbeitet 14 Dez '13, 12: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, 11:57

esdd's gravatar image

esdd
14.2k53251

Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

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üge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×185

Frage gestellt: 14 Dez '13, 07:02

Frage wurde angeschaut: 3,249 Mal

Zuletzt aktualisiert: 14 Dez '13, 12:28