PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tabellen: multirow & Textumbruch



missfranzi
05-08-2010, 09:41
Hallo zusammen,

Bisher habe ich in den meisten Fällen meine Latex-Probleme immer noch irgendwie (wenn auch vielleicht nicht programmiererisch sauber - da kenn ich mich zu wenig aus) mit einigem Web-suchen lösen können, aber gerade komme ich nicht weiter.

Ich habe schon einiges ausprobiert. Mit 'longtable' habe ich auch eine Tabelle bekommen, die von der Spaltenaufteilung so war, wie ich mir das vorgestellt habe. Da war dann das Problem, dass ich den Seitenumbruch nicht kontrollieren konnte. Ich habe in meiner Tabelle immer 12 Zeilen (im Beispiel unten sind es nur 4) die zusammengehören, und die ich nicht trennen möchte. Von diesen 12er-Sätzen habe ich aber viele. Meine Überlegung war dann, ich könnte auch mehrere von diesen als eigene 'tabulars' in eine Table-Umgebung setzen. Möchte aber, dass die Spaltenbreite bei den einzelnen 'kleinen' Tabellen gleich ist. Mit 'tabularx' sollte das doch gehen, da ich die Tabellenbreite angebe, die feste Breite einer Spalte, und die restliche Breite wird dann unter den restlichen Spalten gleich verteilt.
Wenn ich es jetzt noch hinbekommen würde, dass der Text innerhalb der 'multirow's umgebrochen wird!

In meinem Beispiel ist die erste Tabelle so, wie ich sie gerne hätte (bis auf eben das fehlende Umbrechen des Datums und des Textes in der vorletzten Spalte).
Die 2. Tabelle habe ich so hingemogelt, dass sie in etwa so aussieht wie ich es gerne hätte - ist aber meiner Meinung nach keine schöne Lösung, und passt sich eben auch nicht an die ggf. unterschiedliche Seitenbreite an.
Und mal davon abgesehen, dass ich nicht verstehe, warum das + unten in der Zelle steht...


************************************************** ******
\documentclass{scrbook}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}

\usepackage{tabularx}
%\usepackage{array}
\usepackage{multirow}
\usepackage{booktabs}

\newcommand{\otoprule}{\midrule[\heavyrulewidth]}
\newcolumntype{Z}{>{\centering\arraybackslash}X}
\newcolumntype{C}[1]{>{\centering}m{#1}}


\begin{document}



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{tabularx}{\textwidth}{ZZZZZZ p{3cm}Z}
\toprule
\textbf{Platte} & \textbf{Datum} & \textbf{Posi\-tion} & \textbf{VC-Gruppe} & \textbf{FVA STN} & \textbf{Ergeb\-nis} & \textbf{Bemerkung} & \textbf{Boni\-tur} \\

\otoprule
%%%%%%%%%%%%%%%%%%%%%Platte1%%%%%%%%%%%%%%%
\multirow{4}{*}{\textbf{1}} & \multirow{4}{*}{23.07. 2010} & A1 & & 1006 & \multirow{2}{*}{--} & \multirow{2}{*}{} & \multirow{4}{*}{28.07. 2010} \\
& & A2 & EU1 & 1165 & & & \\
\cmidrule{3-7}
& & B1 & & 1007 & \multirow{2}{*}{+} & \multirow{2}{*}{1007 nicht angewachsen} & \\
& & B2 & EU1 & 1165 & & & \\
\bottomrule
\end{tabularx}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\\
\\

\begin{tabular}{C{1.2cm}C{1.2cm}C{1.0cm}C{1.2cm}C{ 1.0cm}C{1.2cm}p{3.0cm}C{1.2cm}}
\toprule
\textbf{Platte} & \textbf{Datum} & \textbf{Posi\-tion} & \textbf{VC-Gruppe} & \textbf{FVA STN} & \textbf{Ergeb\-nis} & \textbf{Bemerkung} & \textbf{Boni\-tur} \tabularnewline
\otoprule
%%%%%%%%%%%%Platte1%%%%%%%%%%%%%%%%%%%%%%%%
\multirow{4}{1.2cm}{\textbf{\begin{center}1\end{ce nter}}} & \multirow{4}{1.2cm}{\begin{center}23.07. 2010\end{center}} & A1 & & 1006 & \multirow{2}{1.2cm}{--} & \multirow{2}{3.0cm}{} & \multirow{4}{1.2cm}{\begin{center}28.07. 2010\end{center}}
\tabularnewline
& & A2 & EU1 & 1165 & & & \tabularnewline
\cmidrule{3-7}
& & B1 & & 1007 & \multirow{2}{1.2cm}{\begin{center}+\end{center}} & \multirow{2}{3.0cm}{1007 nicht angewachsen} & \tabularnewline
& & B2 & EU1 & 1165 & & & \tabularnewline
\bottomrule
\end{tabular}

\end{document}
************************************************** *******

Hat einer von Euch eine Idee, wie ich das hinkriege?
Danke!

Liebe Grüße,
Franzi

Xenara
05-08-2010, 10:34
Ich habe versucht, deinen Tabellencode noch etwas zu vereinfachen. Im MB einmal deine bisherige Lösung, dann ein funktionierendes Beispiel und zum Schluss ein stark veränderter Code. Für das letzte Beispiel habe ich auch die Tabellenspalten etwas geändert, da manche Spalten sehr gequetscht wirkten.


\documentclass{scrbook}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}

\usepackage{tabularx}
%\usepackage{array}
\usepackage{multirow}
\usepackage{booktabs}
\usepackage{blindtext}

\newcommand{\otoprule}{\midrule[\heavyrulewidth]}
\newcolumntype{Z}{>{\centering\arraybackslash}X}
\newcolumntype{C}[1]{>{\centering}m{#1}}


\begin{document}



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{tabularx}{\textwidth}{ZZZZZZ p{3cm}Z}
\toprule
\textbf{Platte} & \textbf{Datum} & \textbf{Posi\-tion} & \textbf{VC-Gruppe} & \textbf{FVA STN} & \textbf{Ergeb\-nis} & \textbf{Bemerkung} & \textbf{Boni\-tur} \\

\otoprule
%%%%%%%%%%%%%%%%%%%%%Platte1%%%%%%%%%%%%%%%
\multirow{4}{*}{\textbf{1}} & \multirow{4}{*}{23.07. 2010} & A1 & & 1006 & \multirow{2}{*}{--} & \multirow{2}{*}{} & \multirow{4}{*}{28.07. 2010} \\
& & A2 & EU1 & 1165 & & & \\
\cmidrule{3-7}
& & B1 & & 1007 & \multirow{2}{*}{+} & \multirow{2}{*}{1007 nicht angewachsen} & \\
& & B2 & EU1 & 1165 & & & \\
\bottomrule
\end{tabularx}


\section*{Moderate Änderungen}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{tabularx}{\textwidth}{C{1.2cm}XC{1.0cm}C{1. 2cm}C{1.0cm}C{1.2cm}p{3cm}Z}
\toprule
\textbf{Platte} & \textbf{Datum} & \textbf{Posi\-tion} & \textbf{VC-Gruppe} & \textbf{FVA STN} & \textbf{Ergeb\-nis} & \textbf{Bemerkung} & \textbf{Boni\-tur} \tabularnewline
\otoprule
%%%%%%%%%%%%Platte1%%%%%%%%%%%%%%%%%%%%%%%%
\multirow{4}{*}{\textbf{1}} &%
\multirow{4}{*}{\parbox{1.2cm}{\centering 23.07. 2010}} &%
A1 & &%
1006 & \multirow{2}{1.2cm}{--} & \multirow{2}{3.0cm}{} &%
\multirow{4}{*}{\parbox{1.2cm}{\centering 28.07. 2010}}
\tabularnewline
& & A2 & EU1 & 1165 & & & \tabularnewline
\cmidrule{3-7}
& & B1 & & 1007 & \multirow{2}{1.2cm}{\centering +} & \multirow{2}{*}{\parbox{3cm}{1007 nicht angewachsen}} & \tabularnewline
& & B2 & EU1 & 1165 & & & \tabularnewline
\bottomrule
\end{tabularx}



\section*{Alternativer Vorschlag}
\blindtext

\begingroup% Änderungen gelten nur lokal
\renewcommand{\tabularxcolumn}[1]{m{#1}}% zentriert X-Spalten vertikal (gilt für die ganze Tabelle)
\renewcommand{\bf}{\bfseries}
\newcommand{\mr}[2]{\multirow{#1}{*}{#2}}% \mr{Anzahl Zeilen}{Text}

\noindent%
\begin{tabular}{cC{1.2cm}C{1.0cm}C{1.4cm}C{1.0cm}C {1.2cm}p{3.0cm}C{1.2cm}}
\toprule
\bf Platte & \bf Datum & \bf Posi\-tion & \bf VC-Gruppe & \bf FVA STN & \bf Ergeb\-nis & \bf Bemerkung & \bf Boni\-tur \tabularnewline
\otoprule
%%%%%%%%%%%%Platte1%%%%%%%%%%%%%%%%%%%%%%%%
\mr{4}{\bf 1} &%
\mr{4}{\parbox{1.2cm}{\centering 23.07. 2010}} &%
A1 & &%
1006 & \mr{2}{--} & \multirow{2}{3.0cm}{} &%
\mr{4}{\parbox{1.2cm}{\centering 28.07. 2010}}
\tabularnewline
& & A2 & EU1 & 1165 & & & \tabularnewline
\cmidrule{3-7}
& & B1 & & 1007 & \mr{2}{\centering +} & \mr{2}{\parbox{3cm}{1007 nicht angewachsen}} & \tabularnewline
& & B2 & EU1 & 1165 & & & \tabularnewline
\bottomrule
\end{tabular}
\endgroup

\end{document}

missfranzi
05-08-2010, 11:34
Danke Xenara, damit kann ich auf jeden Fall mal was anfangen - ich muss mal rumprobieren, ob ich nicht aus Deinen beiden einen Mix herstellen kann. Deine Veränderungen zur Vereinfachung sind ja auch sehr schön - auf sowas komm ich leider meist nicht von alleine...

Eine Frage aber noch:
Bei Deinem letzten Beispiel mit dem stark veränderten Code:



\section*{Alternativer Vorschlag}
\renewcommand{\tabularxcolumn}[1]{m{#1}}% zentriert X-Spalten vertikal (gilt für die ganze Tabelle)


wofür wird dies benötigt - in dem weiteren Beispiel gibt es doch gar keine X-Spalten?



\newcommand{\mr}[2]{\multirow{#1}{*}{#2}}% \mr{Anzahl Zeilen}{Text}


Das hatte ich mich die Tage schon gefragt: was bedeuten hier, wie auch oben, eigentlich die #1, #2, etc? Was genau macht dieser Zusatz hier? (Ist vielleicht ne blöde Frage, aber ich hab auch von Programmieren keine Ahnung, ich weiss es halt nicht...)

Werde auf jeden Fall nochmal an der 'Mischung' rumprobieren!
Liebe Grüße,
Franzi

Xenara
05-08-2010, 11:53
Sorry, da ist beim Kopieren was schiefgegangen, eigentlich wollte ich schon die X-Spalten verwenden. So sollts aussehen:

\documentclass{scrbook}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}

\usepackage{tabularx}
%\usepackage{array}
\usepackage{multirow}
\usepackage{booktabs}
\usepackage{blindtext}

\newcommand{\otoprule}{\midrule[\heavyrulewidth]}
\newcolumntype{Z}{>{\centering\arraybackslash}X}
\newcolumntype{C}[1]{>{\centering}m{#1}}


\begin{document}

\section*{Alternativer Vorschlag}
\blindtext

\begingroup% Änderungen gelten nur lokal
\renewcommand{\tabularxcolumn}[1]{m{#1}}% zentriert X-Spalten vertikal (gilt für die ganze Tabelle)
\renewcommand{\bf}{\bfseries}
\newcommand{\mr}[2]{\multirow{#1}{*}{#2}}% \mr{Anzahl Zeilen}{Text}

\noindent%
\begin{tabularx}{\textwidth}{cXC{1.2cm}C{1.2cm}C{1 .2cm}C{1.2cm}C{2.8cm}Z}
\toprule
\bf Platte & \bf Datum & \bf Posi\-tion & \bf VC-Gruppe & \bf FVA STN & \bf Ergeb\-nis & \bf Bemerkung & \bf Boni\-tur \tabularnewline
\otoprule
%%%%%%%%%%%%Platte1%%%%%%%%%%%%%%%%%%%%%%%%
\mr{4}{\bf 1} &%
\mr{4}{\parbox{1.2cm}{\centering 23.07. 2010}} &%
A1 & &%
1006 & \mr{2}{--} & \multirow{2}{3.0cm}{} &%
\mr{4}{\parbox{1.2cm}{\centering 28.07. 2010}}
\tabularnewline
& & A2 & EU1 & 1165 & & & \tabularnewline
\cmidrule{3-7}
& & B1 & & 1007 & \mr{2}{\centering +} & \mr{2}{\parbox{2.8cm}{1007 nicht angewachsen}} & \tabularnewline
& & B2 & EU1 & 1165 & & & \tabularnewline
\bottomrule
\end{tabularx}
\endgroup


\end{document}


Das #1,#2 steht für Platzhalter. Ein \newcommand-Befehl sieht erst mal so aus:


\newcommand{\neuername}{Das soll drinstehen}

So kann man dann im Code schreiben "Blabla \neuername blabla" und erhält nach Kompilieren "Blabla Das soll drinstehen blabla".

Manchmal will man ja aber nichts Fixes einfügen, sondern etwa Text ändern. Dann siehts so aus:


\newcommand{\neuername}[1]{\emph{#1}}

Dann schreibt man im Code "Blabla \neuername{Das ist kursiv.} blabla" und erhält "Blabla Das ist kursiv. blabla".
Somit bedeutet das [1], dass ein Argument verwendet werden muss, das dann an die Stelle von "#1" eingefügt wird, in diesem Fall in \emph{HIER}.

Das geht auch mit 2 oder mehr Argumenten, z.B.


\newcommand{\neuefarbe}[2]{\textcolor{#1}{#2}}

Im Code dann "Blabla \neuefarbe{red}{Roter Text.} blabla" und im Ergebnis "Blabla Roter Text. blabla"
Es ist eigentlich ganz einfach, wenn man das Prinzip verstanden hat (ich bin auch kein Programmierer).

missfranzi
06-08-2010, 09:06
Danke nochmal - meine Tabellen hab ich jetzt in etwa so wie ich mir das vorstell... die \parbox war wohl das wichtigste - und die anderen Tricks noch ganz hilfreich.

Die \newcommands hab ich bisher schon auch verwendet, nur eben mehr um konkrete Ausdrücke zu definieren, z.B. als Abkürzung für irgendwelche Formeln mit mehreren Hoch/Tiefgestellen Zeichen, oder für Artnamen, die ja meist eher lang sind und dann noch kursiv sein müssen, oder um Sachen wie cyclo-hexa-dien-...-carbonyl-CoA-hydratase nicht jedesmal ausschreiben zu müssen.
Diese Funktion für allgemeinere Definitionen - da muss ich wohl einfach mal etwas mit üben... Mit den 1-mehreren Platzhaltern, ja, ich glaub so halber hab ich das kapiert - wie gesagt, muss ich wohl mal mehr ausprobieren.

Warum kann ich aber \newcommands in die Präambel stellen, \renewcommands aber in das Dokument? Und wofür brauche ich letzteres überhaupt - reicht ersteres nicht?

Liebe Grüße,
Franzi

Xenara
06-08-2010, 10:28
Afaik können sowohl re- als auch newcommands entweder in der Präambel oder im Body stehen. Man sollte es aber natürlich erst definieren, bevor man es verwendet.

Der Unterschied zwischen renewcommand und newcommand ist der, dass man mit renewcommand ein bestehendes Kommando neu definieren kann. Das habe ich mit \bf gemacht. Dieser Befehl existiert, sollte aber eher vermieden werden und stattdessen \bfseries verwendet werden. Da mir das aber zu lang war zum Schreiben habe ich eben \bf zu \bfseries umdefiniert.
Mit newcommand kann man ein beliebiges, nicht existentes Kommando definieren.
newcommand prüft auch, ob der Befehl vielleicht sogar bereits existiert. Das war bei mir in o.g. Beispiel der Fall, als ich erst \b für \bfseries nehmen wollte. Aber offensichtlich existiert dieser Befehl schon, auch wenn ich ihn nicht kenne. Daher habe ich \bf genommen, das kannt ich wenigstens.