Tabellen schöner formatieren

Tabellen und Grafiken erstellen und anordnen


MasterofDesaster
Forum-Anfänger
Forum-Anfänger
Beiträge: 22
Registriert: Fr 26. Nov 2010, 10:37

Tabellen schöner formatieren

Beitrag von MasterofDesaster »

Hi,

ich habe zwei Tabellen die ich formatieren möchte.
Tabelle 1 besteht aus Spalten welche eine fixe Breite haben sollen (sonst wird der Text nicht richtig umgebrochen). Nun möchte ich allerdings die Informationen in der letzten Spalte in die Mitte stellen. Wie mache ich das?

Bei Tabelle 2 haben einigen Zeilen zwei Spalten, anderen drei und in wieder anderen vier Spalten.
Die erste Spalte soll immer an der gleichen Position stehen, aber die darauf folgenden soll immer gemittelt stehen. Wenn es also nur ein Begriff gibt, dann soll dieser in der Mitte der drei Spalten stehen.
\documentclass
[
12pt,							% Schriftgröße
a4paper,					% Papier-Format
DIV22,						% Seiten-Rand Verhältniss
BCOR10mm				% Bindungskorrektur
]{scrbook}
\usepackage[utf8]{inputenc}					% Umlaute
\usepackage[ngerman]{babel}					% Deutsche Sprache für die Silbentrennung
\usepackage{xspace}								% kleinere Abstände
\usepackage{colortbl}								% Farbige Tabellen
\usepackage{booktabs}							% Tabellenlinien

\begin{document}

\begin{table}[htp]
	\begin{center}
		\begin{tabular}{>{\centering}p{2,3cm}p{2cm}p{2,3cm}p{2cm}p{2cm}p{2cm}}%{cccccc}	
			\toprule	
			\textbf{Anzahl}	&	\textbf{Transfer-funktion}	&	\textbf{Trainings-algorithmus}	&	\textbf{Lern-funktion}	&	\textbf{Wert}	&	\textbf{ungelernter - Wert}\tabularnewline
			\midrule
			3	&	tribas	&	trainlm	&	learnpn	&	mit Hilfe	&	0,588	\tabularnewline 
			3	&	tribas	&	trainlm	&	learnk	&	mit Hilfe	&	0,668	\tabularnewline			
			3	&	satlins	&	trainbfg	&	learnhd	&	ohne Hilfe	&	0,772	\tabularnewline		
			\bottomrule
		\end{tabular}
	\end{center}
	\caption{Tabelle1}
	\label{tab:Tabelle1}
\end{table}

\begin{table}[htp]
	\begin{center}
		\begin{tabular}{lccc}	
			\toprule
			\textbf{Parameter} &	\multicolumn{3}{c}{\textbf{Varianten}} \tabularnewline
			\midrule
			Anzahl Neuronen	& \multicolumn{1}{c}{2}	&	\multicolumn{1}{c}{3}	\tabularnewline 
			Transferfunktion		&	tribas	&	satlins	&	logsig	\tabularnewline			
			Trainingsalgorithmus	&	\multicolumn{1}{c}{trainlm}	&	\multicolumn{1}{c}{trainbfg}		\tabularnewline
			Lernfunktionen	&	learnpn	&	learnk	&	learnhd	\tabularnewline			
			Wert	&	\multicolumn{3}{c}{normal}	\tabularnewline
			Wert	&	mit Hilfe & ohne Hilfe	\tabularnewline
			\bottomrule
		\end{tabular}
	\end{center}
	\caption{Tabelle2}
	\label{tab:Tabelle2}
\end{table}

\end{document}
Wie setze ich meine Ideen um?

Gruß
Axel

Xenara
Forum-Meister
Forum-Meister
Beiträge: 682
Registriert: Mi 25. Nov 2009, 09:41

Beitrag von Xenara »

Ich liebe Minimalbeispiele :)

Hier mal meine Vorschläge. Bei der zweiten Tabelle weiss ich allerdings nicht, ob ich dich richtig verstanden habe, da ich finde, dass es so sehr unübersichtlich geworden ist.
\documentclass 
[ 
12pt,                     % Schriftgröße 
a4paper,               % Papier-Format 
DIV22,                  % Seiten-Rand Verhältniss 
BCOR10mm            % Bindungskorrektur 
]{scrbook} 
\usepackage[utf8]{inputenc}               % Umlaute 
\usepackage[ngerman]{babel}               % Deutsche Sprache für die Silbentrennung 
\usepackage{xspace}                        % kleinere Abstände 
\usepackage{colortbl}                        % Farbige Tabellen 
\usepackage{booktabs}                     % Tabellenlinien 
\usepackage{tabularx}
\usepackage{calc}

\newcolumntype{C}{>{\centering\arraybackslash}X}

\newcommand{\intab}[1]{\begin{tabular}{*{1}{T}} #1\end{tabular}}
\newcommand{\intabb}[2]{\begin{tabular}{*{2}{T}} #1 & #2 \end{tabular}}
\newcommand{\intabbb}[3]{\begin{tabular}{*{3}{T}} #1 & #2 & #3 \end{tabular}}
\newcolumntype{T}{>{\centering\arraybackslash}p{2cm}}


\begin{document} 

\begin{table}[htp] 
\renewcommand{\tabularxcolumn}[1]{m{#1}}
% Tabellen werden oben beschriftet (weil man sie von oben nach unten liest), Abbildungen unten
\caption{Tabelle1} 
\label{tab:Tabelle1} 
\centering
      \begin{tabularx}{\textwidth}{cCCCCC}   
         \toprule   
         \textbf{Anzahl}   &   \textbf{Transfer-funktion}   &   \textbf{Trainings-algorithmus}   &   \textbf{Lern-funktion}   &   \textbf{Wert}   &   \textbf{ungelernter -- Wert}\tabularnewline 
         \cmidrule(lr){1-1}
         \cmidrule(lr){2-2}
         \cmidrule(lr){3-3}
         \cmidrule(lr){4-4}
         \cmidrule(lr){5-5}
         \cmidrule(lr){6-6}
         3   &   tribas   &   trainlm   &   learnpn   &   mit Hilfe   &   0,588   \tabularnewline 
         3   &   tribas   &   trainlm   &   learnk   &   mit Hilfe   &   0,668   \tabularnewline         
         3   &   satlins   &   trainbfg   &   learnhd   &   ohne Hilfe   &   0,772   \tabularnewline       
         \bottomrule 
      \end{tabularx} 
\end{table} 

\begin{table}[htp]
	\caption{Tabelle2} 
	\label{tab:Tabelle2} 
	\centering 
      \begin{tabular}{l@{}c}   
         \toprule 
         \textbf{Parameter} &   \textbf{Varianten} \tabularnewline 
         \cmidrule(lr){1-1}
         \cmidrule(lr){2-2}
         Anzahl Neuronen   & \intabb{2}{3}\tabularnewline 
         Transferfunktion  & \intabbb{tribas}{satlins}{logsig}   \tabularnewline         
         Trainingsalgorithmus   &  \intabb{trainlm}{trainbfg}      \tabularnewline 
         Lernfunktionen   &  \intabbb{learnpn}{learnk}{learnhd}   \tabularnewline         
         Wert   &   \intab{normal}   \tabularnewline 
         Wert   &   \intabb{mit Hilfe}{ohne Hilfe}   \tabularnewline 
         \bottomrule 
      \end{tabular} 
\end{table} 

\end{document} 
Im Code sind ein paar Gimmicks eingebaut, wenn du eine Erläuterung brauchst, gib kurz Bescheid.

Was mir aufgefallen ist:
- Tabellen werden üblicherweise oben beschriftet, da man sie von oben nach unten liest. Abbildungen hingegen unten, da man diese eher von unten nach oben anschaut (z.B. bei einem XY-Diagramm)
- Statt \begin{center}...\end{center} in Umgebungen besser den Schalter \centering verwenden, da mit ersterer Variante Abstände entstehen, die nicht nötig sind.

MasterofDesaster
Forum-Anfänger
Forum-Anfänger
Beiträge: 22
Registriert: Fr 26. Nov 2010, 10:37

Beitrag von MasterofDesaster »

Hi,
so ist das perfekt :)

Jetzt musst du mir allerdings ein paar Sachen verraten ;)

Was machen die Packages:
  • \usepackage{tabularx}
    \usepackage{calc}
Was bedeutet:
  • \newcolumntype{C}{>{\centering\arraybackslash}X}
    \newcolumntype{T}{>{\centering\arraybackslash}p{2cm}}
    \newcommand{\intab}[1]{\begin{tabular}{*{1}{T}} #1\end{tabular}}
    \cmidrule(lr){1-1}
    \begin{tabular}{l@{}c}
Ich verstehe wie die Funktionen aufgerufen werden, aber nicht genau was sie machen?

Gruß und Dank Axel!

Xenara
Forum-Meister
Forum-Meister
Beiträge: 682
Registriert: Mi 25. Nov 2009, 09:41

Beitrag von Xenara »

MasterofDesaster hat geschrieben:Hi,
so ist das perfekt :)
Prima, dann hab ich richtig geraten :)

Jetzt musst du mir allerdings ein paar Sachen verraten ;)
Kein Problem:
\usepackage{tabularx}
\usepackage{calc}
TabularX stellt Tabellen mit der sogenannten X-Spalte zur Verfügung. Man kann X ganz normal wie p{...}, c, l, r verwenden, nur dass diese Spalten dann automatisch gespreizt werden, und zwar auf die bei \begin{tabularx}{BREITE}{XXX} angegebene Breite (hier ist das \textwidth, also Textbreite).
Werden mehrere X-Spalten verwendet, haben sie alle die gleiche Breite.
Ausserdem kann innerhalb der X-Spalten ein Zeilenumbruch stattfinden. Es lohnt sich, das TabularX-Paket anzuschauen, ich zumindest brauche es ständig.

calc hatte ich vergessen rauszunehmen, hatte was ausprobiert mit einer Länge abhängig von einem Wort. Mit calc kann man nämlich sowas machen: \widthof{Dein Wort}. Es wird dann eine Länge definiert, die exakt der Breite von "Dein Wort" (inklusive Leerzeichen) entspricht. Dann muss man nicht raten, wieviele cm, pt, em oder ex es breit ist. Das Paket kann aber noch viel viel mehr, das ist nur meine häufigste Anwendung.
\newcolumntype{C}{>{\centering\arraybackslash}X}
Der newcolumntype-Befehl ist das Pendant zu newcounter oder newcommand, nur eben für Tabellenspaltedefinitionen. Er stammt afaik aus dem Paket array, was hier glaube ich automatisch mit booktabs oder tabularx schon aufgerufen wird (nur, falls du mal die Doku suchst).
Die Handhabung ist wie \newcommand:
\newcolumntype{NAME}{Definition}
Hier war ich einfach zu faul, jedesmal die X-Spalte von Hand zu zentrieren mit >{\centering\arraybackslash}X und habe es kurzerhand auf "C" gelegt.
Der Teil mit >{...} stammt auch aus array (übrigens auch eine sehr lohnenswerte Doku ;) ), damit lassen sich Befehle _vor_ jede Spalte schreiben, hier wird also in jeder Zelle dieser Spalte erstmal \centering aufgerufen. Das \arraybackslash ist eine Sicherheitsmassnahme, das den Befehl für einen Zeilenumbruch wieder richtig setzt. Frag nicht nach Details, auf alle Fälle gibts ohne das Probleme, wenn es die letzte Spalte der Tabelle ist.
Es lassen sich mit array auch Befehle nach der Zelle schreiben, nämlich mit <{...}, nicht zu vergessen die neuen Spaltendefintionen m{...} und p{...} (siehe später).
\newcolumntype{T}{>{\centering\arraybackslash}p{2cm}}
Definiert den Spaltentyp T, der eine 2cm breite zentrierte p-Spalte ist. Ich war (wieder mal) zu faul, das bei jedem \intab(b(b)) extra zu ändern.
\newcommand{\intab}[1]{\begin{tabular}{*{1}{T}} #1\end{tabular}}
Definiert den neuen Befehl \intab, der das Argument dahinter in eine Tabelle mit der Spaltenbreite T (s.o.) schreibt.
Dto. \intabb und \intabbb, nur dass dort wegen der mehreren Wörter auch mehrere Spalten und damit Argumente nötig waren. Ich hätte die Befehle auch gerne \intab1, \intab2 und \intab3 genannt, aber LaTeX mag keine Zahlen in Befehlen.
Die Schreibweise *{Anzahl}{Spaltentyp} in der Spaltendefinition der Tabelle habe ich gewählt, weil es so dann übersichtlicher ist und sowieso alle Spalten die gleichen Eigenschaften haben sollen.
\cmidrule(lr){1-1}
Das gehört zu \midrule, \toprule, \bottomrule und stammt aus dem Paket booktabs. Es ist das Pendant zu \cline und ist, wie du gesehen hast, für Linien da, die nicht über die gesamte Tabellenbreite gehen sollen. Mit (lr) wird die Linie links und rechts eingekürzt.
\begin{tabular}{l@{}c}
Ohne das "@{}" fand ich den Abstand zwischen erster Spalte und den folgenden Spalten zu gross, denn es sind ja geschachtelte Tabellen, und jede Tabelle bring um sich herum einen Abstand mit. Nur addiert sich der natürlich bei der Schachtelung. Mit @{} kontrolliert man, was zwischen den Spalten passiert. Du kannst mal spasseshalber ein @{\hspace{2cm}} oder \rule{1ex}{4ex} einfügen, ich denke, dann ist klar, was passiert. Wenn man das Argument leer lässt, verschwindet einfach jeglicher horizontale Abstand.
Übrigens auch sehr nützlich, wenn man im Text eine Tabelle für eine Ausrichtung o.ä. verwendet, der Text aber gleich wie der andere beginnen soll. Hier in dem Beispiel unten sollte es klar werden.

Ausserdem ist in dem Code gleich noch eine nützliche Anwendung für TabularX eingebaut und ein Beispiel für die Verwendung von \widthof:
\documentclass[parskip=half]{scrreprt} 
\usepackage[ngerman]{babel} 
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}	

\usepackage{blindtext} 
\usepackage{tabularx}
\usepackage{calc}

\begin{document}

\blindtext

\begin{tabularx}{\textwidth}{lX}
Hier Tabelle: & \blindtext
\end{tabularx}

\blindtext

\begin{tabularx}{\textwidth}{@{}lX@{}}
Hier Tabelle: & \blindtext
\end{tabularx}

\blindtext

\begin{tabular}{|p{\widthof{So breit,}}|c|}
So breit, aber nicht breiter. Alles weitere wird umbrochen. & Eine normale c-Spalte.
\end{tabular}

\end{document}
Ich hoffe, ich habe dir damit geholfen und dich nicht völlig erschlagen :wink:

P.S. Wenn du die Dokus zu den Paketen suchst, am einfachsten kannst du sie so aufrufen (Windows):
Start -> Programme -> Zubehör -> Eingabeaufforderung
Eintippen: "texdoc Paketname", z.B. "texdoc array"
Dann öffnet sich das PDF. Unter Linux und Mac geht es afaik analog in der Shell, ich kanns nur nicht testen.

MasterofDesaster
Forum-Anfänger
Forum-Anfänger
Beiträge: 22
Registriert: Fr 26. Nov 2010, 10:37

Beitrag von MasterofDesaster »

Super!

Vielen Dank, das war sehr hilfreich :)

Allerdings habe ich noch eine Frage: Wie bekomme ich bei Tabelle 2 Striche zwischen die Spalten? Ich denke, das würde die Übersichtlichkeit erhöhen :P

Gruß
Axel

Xenara
Forum-Meister
Forum-Meister
Beiträge: 682
Registriert: Mi 25. Nov 2009, 09:41

Beitrag von Xenara »

So schöne Tabellen, und dann vertikale Linien einziehen wollen :shock: ;)
Allgemein heisst es, dass vertikale Linien die Übersichtlichkeit behindern, denn man liest ja von links nach rechts, eine horizontale Linie unterstützt, eine vertikale unterbricht. Daher: "Vertikale Linien sind böse."
Das booktabs-Paket unterstützt das auch gar nicht, du würdest Lücken in den horizontalen Linien bekommen, was auch nicht Sinn der Sache ist.

Hier mal zwei Möglichkeiten, wie man es übersichtlicher machen kann:
\documentclass 
[ 
12pt,                     % Schriftgröße 
a4paper,               % Papier-Format 
DIV22,                  % Seiten-Rand Verhältniss 
BCOR10mm            % Bindungskorrektur 
]{scrbook} 
\usepackage[utf8]{inputenc}               % Umlaute 
\usepackage[ngerman]{babel}               % Deutsche Sprache für die Silbentrennung 
\usepackage{xspace}                        % kleinere Abstände 
\usepackage{colortbl}                        % Farbige Tabellen 
\usepackage{booktabs}                     % Tabellenlinien 
\usepackage{tabularx}
\usepackage{xcolor}

\newcommand{\intab}[1]{\begin{tabular}{*{1}{T}} #1\end{tabular}}
\newcommand{\intabb}[2]{\begin{tabular}{*{2}{T}} #1 & #2 \end{tabular}}
\newcommand{\intabbb}[3]{\begin{tabular}{*{3}{T}} #1 & #2 & #3 \end{tabular}}
\newcolumntype{T}{>{\centering\arraybackslash}p{3cm}}


\begin{document} 

\begin{table}[htp]
	\caption{Entweder so:} 
	\label{tab:Tabelle2} 
	\centering 
      \begin{tabular}{l@{}c}   
         \toprule 
         \textbf{Parameter} &   \textbf{Varianten} \tabularnewline 
         \cmidrule(lr){1-1}
         \cmidrule(lr){2-2}
         Anzahl Neuronen   & \intabb{2}{3}\tabularnewline\addlinespace
         Transferfunktion  & \intabbb{tribas}{satlins}{logsig}   \tabularnewline\addlinespace  
         Trainingsalgorithmus   &  \intabb{trainlm}{trainbfg}      \tabularnewline\addlinespace 
         Lernfunktionen   &  \intabbb{learnpn}{learnk}{learnhd}   \tabularnewline\addlinespace         
         Wert   &   \intab{normal}   \tabularnewline\addlinespace 
         Wert   &   \intabb{mit Hilfe}{ohne Hilfe}   \tabularnewline 
         \bottomrule 
      \end{tabular} 
\end{table} 

\begin{table}[htp]
	\caption{Oder auch so:} 
	\label{tab:Tabelle2} 
	\centering 
      \begin{tabular}{l@{}c}   
         \toprule 
         \textbf{Parameter} &   \textbf{Varianten} \tabularnewline 
         \cmidrule(lr){1-1}
         \cmidrule(lr){2-2}
         Anzahl Neuronen   & \intabb{2}{3}\tabularnewline\addlinespace[.7ex]
\rowcolor[gray]{.9}     
         Transferfunktion  & \intabbb{tribas}{satlins}{logsig}\tabularnewline\addlinespace[.7ex]
         Trainingsalgorithmus   &  \intabb{trainlm}{trainbfg}\tabularnewline\addlinespace[.7ex]
\rowcolor[gray]{.9}     
         Lernfunktionen   &  \intabbb{learnpn}{learnk}{learnhd}   \tabularnewline\addlinespace[.7ex]
         Wert   &   \intab{normal}   \tabularnewline\addlinespace[.7ex]
\rowcolor[gray]{.9}     
         Wert   &   \intabb{mit Hilfe}{ohne Hilfe}   \tabularnewline 
         \bottomrule 
      \end{tabular} 
\end{table} 

\end{document} 
Vielleicht habe dich auch falsch verstanden, da ich vom Inhalt der Tabelle keine Ahnung habe.
Dann könntest du mal beschreiben (ev. mit anderem Inhalt) oder einen Screenshot machen und einzeichnen, wie die Tabelle zu lesen ist.

MasterofDesaster
Forum-Anfänger
Forum-Anfänger
Beiträge: 22
Registriert: Fr 26. Nov 2010, 10:37

Beitrag von MasterofDesaster »

Hi,

ich brauche bei der Tabelle vertikale Linien, damit schneller ersichtlich ist, dass es z.B. nur zwei Varianten für den Parameter gibt.
ich brauche in der ersten Spalte nur eine Linie:
Anzahl Neuronen 2 | 3
so würde mir das reichen :)

Gruß und vielen Dank!

Xenara
Forum-Meister
Forum-Meister
Beiträge: 682
Registriert: Mi 25. Nov 2009, 09:41

Beitrag von Xenara »

Ah, ok. Wie wärs so?
Ich hab die \intab(b(b))-Definition angepasst.
\documentclass 
[ 
12pt,                     % Schriftgröße 
a4paper,               % Papier-Format 
DIV22,                  % Seiten-Rand Verhältniss 
BCOR10mm            % Bindungskorrektur 
]{scrbook} 
\usepackage[utf8]{inputenc}               % Umlaute 
\usepackage[ngerman]{babel}               % Deutsche Sprache für die Silbentrennung 
\usepackage{xspace}                        % kleinere Abstände 
\usepackage{colortbl}                        % Farbige Tabellen 
\usepackage{booktabs}                     % Tabellenlinien 
\usepackage{tabularx}
\usepackage{xcolor}

\newcommand{\intab}[1]{\begin{tabular}{T} #1\end{tabular}}
\newcommand{\intabb}[2]{\begin{tabular}{T@{\rule[-.25ex]{.3pt}{2.25ex}}T} #1 & #2 \end{tabular}}
\newcommand{\intabbb}[3]{\begin{tabular}{T@{\rule[-.25ex]{.3pt}{2.25ex}}T@{\rule[-.25ex]{.3pt}{2.25ex}}T} #1 & #2 & #3 \end{tabular}}
\newcolumntype{T}{>{\centering\arraybackslash}p{2.5cm}}

\begin{document} 

\begin{table}[htp] 
   \caption{So?} 
   \label{tab:Tabelle2} 
   \centering 
      \begin{tabular}{l@{}c}   
         \toprule 
         \textbf{Parameter} &   \textbf{Varianten} \tabularnewline 
         \cmidrule(lr){1-1} 
         \cmidrule(lr){2-2} 
         Anzahl Neuronen   & \intabb{2}{3}\tabularnewline\addlinespace 
         Transferfunktion  & \intabbb{tribas}{satlins}{logsig}   \tabularnewline\addlinespace   
         Trainingsalgorithmus   &  \intabb{trainlm}{trainbfg}      \tabularnewline\addlinespace 
         Lernfunktionen   &  \intabbb{learnpn}{learnk}{learnhd}   \tabularnewline\addlinespace         
         Wert   &   \intab{normal}   \tabularnewline\addlinespace 
         Wert   &   \intabb{mit Hilfe}{ohne Hilfe}   \tabularnewline 
         \bottomrule 
      \end{tabular} 
\end{table} 

\end{document} 
Statt des etwas umständlichen "T@{\rule[Offset]{Breite}{Höhe}}T" ginge auch wie üblich "T|T", aber ich finde, der Strich ist dann zu lang und die Tabelle wird unübersichtlich.

MasterofDesaster
Forum-Anfänger
Forum-Anfänger
Beiträge: 22
Registriert: Fr 26. Nov 2010, 10:37

Beitrag von MasterofDesaster »

Hi,

vielen Dank. Ich habe es mir angesehen und mich spontan dagegen entschieden :P

Ohne sieht es dann doch besser aus. Mit sieht es wie ein Tannenbaum aus...

Vielen Dank für eure Hilfe!

Gruß
Axel

Antworten