Zeilen in Tabelle durchstreichen

Tabellen und Grafiken erstellen und anordnen


icweasel

Zeilen in Tabelle durchstreichen

Beitrag von icweasel »

Hallo, ich habe eine Frage bzgl. der Formatierung von Tabellen. Ich muss für ein Mathe-Übungsblatt in der Uni Wahrheitstafeln erstellen, die bestimmte logische Aussagen über nat. Zahlen beweisen sollen. Dabei sollen die Zeilen, für die die Aussage nicht anwendbar ist, durchgestrichen werden.

Nun verzweifle ich langsam, denn ich finde einfach keinen Weg, wie man eine komplette Zeile einer Tabelle in Latex durchstreichen kann. Gibt es da einen einfachen Weg?


Hier ein Beispiel. Die erste Zeile soll durchgestrichen werden:
\documentclass[a4paper,headsepline,12pt,DIV11]{scrartcl}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage[fleqn]{amsmath}
\begin{document}
\section*{A 3: Aussagenlogik}
\subsection*{i)  $A1 \vee A2$}
\begin{tabular}{c|c||c}
 $A1$  &  $A2$  & $A1 \vee A2 $ \\
\hline
0 & 0 & 0\\
0 & 1 & 1\\
1 & 0 & 1\\
1 & 1 & 1\\
\end{tabular}
\end{document}

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Wenn die Tabelle wie in deinem Beispiel nicht gleitet, kannst du tikz mit der Bibliothek tikzmark nutzen. Der Vorschlag braucht immer zwei Durchläufe bis die Striche an der richtigen Stelle sind:
\documentclass{scrartcl} 

\usepackage{tikz}
\usetikzlibrary{tikzmark}

\newcommand\zeilestreichen[3][]{%
  \tikz[remember picture,overlay]\draw[thick,#1]([yshift=0.8ex]pic cs:#2)--([yshift=0.8ex]pic cs:#3);}

\begin{document} 
\section*{A 3: Aussagenlogik} 
\subsection*{i)  $A1 \vee A2$} 

\begin{tabular}{@{}cc|c||cc@{}}
                &$A1$  &  $A2$  & $A1 \vee A2 $ \\ 
  \hline 
  \tikzmark{z1l}&0 & 0 & 0&\tikzmark{z1r}\\ 
                &0 & 1 & 1\\ 
                &1 & 0 & 1\\ 
                &1 & 1 & 1\\ 
\end{tabular}
\zeilestreichen[red]{z1l}{z1r}
\end{document}
Alternativ kann man die Tabellen auch gleich als Matrix mit tikz erstellen. Das braucht dann nur einen Durchlauf:
\documentclass{scrartcl} 

\usepackage{tikz}
\usetikzlibrary{matrix}

% Syntax \tabellenlinien[<name der matrix>]{<anzahl der „variablen“ = anzahl der senkrechten linien>}
\newcommand\tabellenlinien[2][m]{%
  \draw[double] (#1.north-|#1-1-#2.east)--(#1.south-|#1-1-#2.east);
  \draw (#1.west|-#1-1-1.south)--(#1-1-1.south-|#1.east);
  \foreach [evaluate=\i as \spalte using int(\i-1)] \i in {2,...,#2}{
  \draw (#1.north-|#1-1-\spalte.east)--(#1-1-\spalte.east|-#1.south);}
  }

% 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]{
  A1&A2 &A1 \wedge A2\\ 
  0 & 0 & 0\\ 
  0 & 1 & 0\\ 
  1 & 0 & 0\\ 
  1 & 1 & 1\\};
  \tabellenlinien{2}
  \zeilenstreichen{1,2,3}
\end{tikzpicture}
\hfill
\begin{tikzpicture}
\matrix(m)[matrix of math nodes]{
  A1&A2& A1 \vee A2\\ 
  0 & 0 & 0\\ 
  0 & 1 & 1\\ 
  1 & 0 & 1\\ 
  1 & 1 & 1\\};
  \tabellenlinien{2}
  \zeilenstreichen{1}
\end{tikzpicture}

\end{document}
Gruß
Elke
Zuletzt geändert von esdd am Sa 14. Dez 2013, 16:29, insgesamt 1-mal geändert.

iceweasel

Beitrag von iceweasel »

Super, das ist genau das, was ich wollte! Funktioniert perfekt, vielen Dank!

Totto89

Beitrag von Totto89 »

Ich stehe vor einem ähnlichen Problem. Wie kann ich in meiner Matrix Einträge bzw. Zeile sowie Spalten streichen


 
$B =$
$
\bordermatrix{
  & Aachen	& Berlin   & Hamburg   & Paderborn & Dortmund & Frankfurt   \cr
Aachen & X  & 12 & 4 & 10 & 10 & 19 \cr
Berlin & 12 & X & 14 & 8 & 22 & 14 \cr
Hamburg & 4 & 14 & X & 6 & 8 & 15 \cr
Paderborn & 10 & 8 & 6 & X & 14 & 9 \cr
Dortmund & 10 & 22 & 8 & 14 & X & 20 \cr
Frankfurt & 19 & 14 & 15 & 9 & 20 &X  \cr 
}
\\

$


$B_r=$
$
\bordermatrix{
  & Aachen	& Berlin   & Hamburg   & Paderborn & Dortmund & Frankfurt   \cr
Aachen & X  & 6 & 0 & 6 & 2 & 12 \cr
Berlin & 4 & X & 6 & 0 & 10 & 3 \cr
Hamburg & 0 & 8 & X & 2 & 0 & 8 \cr
Paderborn & 4 & 0 & 0 & X & 4 & 0 \cr
Dortmund & 2 & 12 & 0 & 6 & X & 9 \cr
Frankfurt & 10 & 3 & 6 & 0 & 7 &X  \cr
}
\\

$  

$B_r=$
$
\hline
\bordermatrix{
  & Aachen	& Berlin   & Hamburg   & Paderborn & Dortmund & Frankfurt   \cr
Aachen & X  & 6 & 0^2 & 6 & 2 & 12 \cr
\tikzmark{z1l} Berlin & 4 & X & 6 & 0^3 & 10 & 3 \cr\tikzmark{z1r}\\
Hamburg & 0^2 & 8 & X & 2 & 0^2 & 8 \cr
Paderborn & 4 & 0^3 & 0^0 & X & 4 & 0^3 \cr
Dortmund & 2 & 12 & 0^2 & 6 & X & 9 \cr
Frankfurt & 10 & 3 & 6 & 0^3 & 7 &X  \cr
}
$  

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Hier ist ein Vorschlag mit tikz:
\documentclass{scrartcl}

\usepackage{tikz}
\usetikzlibrary{matrix}

\newcommand\zeilenstreichen[2][m]{%
  \foreach \zeile in {#2}{
  \draw[streichen](#1-\zeile-1-|#1.west)--(#1-\zeile-1-|#1.east);}
}

\newcommand\spaltenstreichen[2][m]{%
  \foreach \spalte in {#2}{
  %% komplette Spalte:
  % \draw[streichen](#1-1-\spalte|-#1.north)--(#1-1-\spalte|-#1.south);}
  %% oder Spalte ab 2.Zeile:
  \draw[streichen](#1-2-\spalte.north)--(#1-1-\spalte|-#1.south);}
}

\newcommand\zellenstreichen[2][m]{%
  \foreach \zelle in {#2}{\draw[streichen](#1-\zelle.west)--(#1-\zelle.east);}
}

\tikzset{streichen/.style={red,very thick}}

\begin{document}
$B=$
\begin{tikzpicture}[baseline]
  \matrix(m)[matrix of nodes, left delimiter=(,right delimiter=),column 1/.style={anchor=base west}]{%
    &Aachen&Berlin&Hamburg&Paderborn&Dortmund&Frankfurt\\
    Aachen&X&12&4&10&10&19\\
    Berlin&12&X&14&8&22&14\\
    Hamburg&4&14&X&6&8&15\\
    Paderborn&10&8&6&X&14&9\\
    Dortmund&10&22&8&14&X&20\\
    Frankfurt&19&14&15&9&20&X\\};
  \zeilenstreichen{2,4}
  \spaltenstreichen{2,4}
  \zellenstreichen{1-2,1-4}
\end{tikzpicture}
\end{document}
Gruß
Elke

Totto89

Beitrag von Totto89 »

Vielen Dank,

aber wie kann ich meine "0" wieder mit Hochzahlen ergänzen? Immer wenn ich 0^2 setze verschwindet diese aus der Matrix.

Hast mir sehr geholfen

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

In der Matrix habe ich auf den Mathemodus verzichtet, da die ganzen Städtenamen ja keine Variablen sind.

Nimm die Option matrix of math nodes und verwende für die Städtenamen den \text{} Befehl aus amsmath:
...
\usepackage{amsmath}
...
$B=$ 
\begin{tikzpicture}[baseline] 
   \matrix(m)[matrix of math nodes, left delimiter=(,right delimiter=),column 1/.style={anchor=base west}]{% 
    &\text{Aachen}& \text{Berlin}& \text{Hamburg}& \text{Paderborn}&\text{Dortmund}&\text{Frankfurt}\\
    \text{Aachen} & X  & 6 & 0^2 & 6 & 2 & 12 \\ 
    \text{Berlin} & 4 & X & 6 & 0^3 & 10 & 3 \\ 
    \text{Hamburg} & 0^2 & 8 & X & 2 & 0^2 & 8 \\ 
    \text{Paderborn} & 4 & 0^3 & 0^0 & X & 4 & 0^3 \\ 
    \text{Dortmund} & 2 & 12 & 0^2 & 6 & X & 9 \\ 
    \text{Frankfurt} & 10 & 3 & 6 & 0^3 & 7 &X \\ }; 
   \zeilenstreichen{2,4} 
   \spaltenstreichen{2,4} 
   \zellenstreichen{1-2,1-4} 
\end{tikzpicture} 
Gruß
Elke

Totto89

Beitrag von Totto89 »

Danke das klappt schon einmal.
Eine letzte Frage habe ich noch. Wie kann ich die Städte außerhalb der Matrix bekommen, so dass innerhalb der Matrix nur noch meine Zahlen stehen.

Vielen Dank


Gruß
Totto

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Wenn die Spaltenbeschriftung gedreht sein kann, könnte man das so lösen:
\documentclass{scrartcl} 
\usepackage{amsmath}
\usepackage{tikz} 
\usetikzlibrary{matrix}

\tikzset{streichen/.style={red,very thick}} 

\newcommand\zeilenstreichen[2][m]{% 
   \foreach \zeile in {#2}{ 
   \draw[streichen](#1-\zeile-1-|#1.west)--(#1-\zeile-1-|#1.east);} 
} 

\newcommand\spaltenstreichen[2][m]{% 
   \foreach \spalte in {#2}{ 
   \draw[streichen](#1-1-\spalte|-#1.north)--(#1-1-\spalte|-#1.south);} 
} 

\newcommand\zellenstreichen[2][m]{% 
   \foreach \zelle in {#2}{\draw[streichen]([yshift=0.8ex]#1-\zelle.base west)--([yshift=0.8ex]#1-\zelle.base east);} 
} 

\newcommand\beschriftung[3][m]{%
   \foreach[count=\n] \stadt in {#2}{
    \node[anchor=base east,text width=\widthof{#3},align=left,xshift=-2mm] at (#1-\n-1.base-|#1.west){\stadt};
    \node[align=left,anchor=west,rotate=90] at (#1-1-\n.north|-#1.north){\stadt};}
}

\begin{document} 
$B=$ 
\begin{tikzpicture}[baseline] 
    \matrix(m)[matrix of math nodes, left delimiter=(,right delimiter=)]{%  
      \text{X} & 6 & 0^2 & 6 & 2 & 12 \\ 
      4 & \text{X} & 6 & 0^3 & 10 & 3 \\ 
      0^2 & 8 & \text{X} & 2 & 0^2 & 8 \\ 
      4 & 0^3 & 0^0 & \text{X} & 4 & 0^3 \\ 
      2 & 12 & 0^2 & 6 & \text{X} & 9 \\ 
      10 & 3 & 6 & 0^3 & 7 & \text{X} \\ }; 
    \zeilenstreichen{2,4} 
    \spaltenstreichen{2,4} 
    \zellenstreichen{1-3,1-5}
    \beschriftung{Aachen,Berlin,Hamburg,Paderborn,Dortmund,Frankfurt}{Paderborn}
\end{tikzpicture}
\end{document}
Gruß
Elke

Totto89

Beitrag von Totto89 »

Leider hätte ich es am liebsten wie eine Bordermatrix.

Aber das ist nicht so schlimm.

Vielen Dank für deine schnelle Hilfe

Gruß
Totto

Antworten