PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tabellen: rowcolor bei multirow abschalten



alpe
08-05-2010, 12:25
Ich habe hier ein kleines ästhetisches Problem bei dem ich nicht weiterkomme:

Ich will grundlegend alternierende Hintergrundfarben für die Zeilen meiner Tabelle. Allerdings möchte ich dieses Verhalten abschalten sobald ich mittels \multirow mehrere Zeilen zusammenfasse.

Dazu mal mein Beispiel, was nicht mehr wirklich minimal ist.


\documentclass[11pt,a4paper]{scrreprt}
\usepackage[utf8x]{inputenc}
\usepackage[ngerman]{babel}

\usepackage[table]{xcolor}
\usepackage{booktabs}
\usepackage{multirow}
\usepackage{tabularx}

\colorlet{tablerowcolor}{gray!10.0}
\colorlet{tableheadcolor}{gray!25}
\newcommand{\PreserveBackslash}[1]{\let\temp=\\#1\let\\=\temp}
\newcolumntype{v}[1]{>{\PreserveBackslash\raggedright\hspace{0pt}}p{#1}}
\newcommand{\tablefontsize}{ \footnotesize}
\newcommand{\tableheadfontsize}{\footnotesize}

\newcommand\tablestyle{%
\renewcommand{\arraystretch}{1.4}
\normalfont\normalsize
\sffamily\tablefontsize
\centering%
}
\newcommand\tablealtcolored{%
\rowcolors{1}{tablerowcolor}{white!100}%
}
\newcommand\tableheadcolor{%
\rowcolor{tableheadcolor}%
}
\newcommand\tablehead{%
\tableheadfontsize%
\sffamily\bfseries%
}
\newcommand\tablebody{%
\tablefontsize\sffamily\upshape%
}

\begin{document}
\begin{table}[]
\caption{Die Überschrift}\label{tab:sigtechcmp}
\tablestyle
\tablealtcolored
\begin{tabular}{v{0.2\linewidth}v{0.4\linewidth}v{ 0.3\linewidth}}
\hline
\tableheadcolor
\tablehead Merkmal &
\tablehead Vorteile &
\tablehead Nachteile\tabularnewline\hline
\tablebody
\cellcolor{white!100} &\cellcolor{white!100} a & \cellcolor{white!100}\tabularnewline
\cellcolor{white!100} &\cellcolor{white!100} a &\cellcolor{white!100} b\tabularnewline
\cellcolor{white!100}\multirow{-3}{*}{Merkmal 1} &\cellcolor{white!100} &\cellcolor{white!100} b\tabularnewline\hline
Merkmal 2 & a & b\tabularnewline
Merkmal 3 & a & b\tabularnewline
\hline
\end{tabular}
\end{table}
\end{document}

Wie man sieht könnte ich das ganze mit dem Befehl \cellcolor machen. Ich finde die Variante aber nicht so schön.
Lässt sich da nicht etwas allgemeines, wie eine Umgebung realisieren in der rowcolor abgeschaltet ist?
Idealerweise mit Berücksichtigung der dahinter folgenden korrekten Hintergrundfarbe.

Hat dazu jemand eine Idee?

EDIT: \hiderowcolors und \showrowcolors sind meiner Meinung nach nicht ganz genau das richtige, weil je nach Zeile gern bei einer bestimmten Hintergrundfarbe bleiben möchte


Gruß
alpe

rais
08-05-2010, 17:06
Moin moin,


Ich will grundlegend alternierende Hintergrundfarben für die Zeilen meiner Tabelle. Allerdings möchte ich dieses Verhalten abschalten sobald ich mittels \multirow mehrere Zeilen zusammenfasse.
(..)
Lässt sich da nicht etwas allgemeines, wie eine Umgebung realisieren in der rowcolor abgeschaltet ist?
Idealerweise mit Berücksichtigung der dahinter folgenden korrekten Hintergrundfarbe.

meinst Du das so?


\documentclass{scrreprt}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage[table]{xcolor}

\newif\ifalternatecolors
\alternatecolorstrue
\newcommand*\samerowcolors{\alternatecolorsfalse}
\makeatletter
\renewcommand*\@rowc@lors{%
\ifalternatecolors
\noalign{\global\advance\rownum\@ne}%
\fi
\@rowcolors%
}
\makeatother

\colorlet{tablerowcolor}{gray!10.0}
\colorlet{tableheadcolor}{gray!25}
\newcommand{\PreserveBackslash}[1]{\let\temp=\\#1\let\\=\temp}
\newcolumntype{v}[1]{>{\PreserveBackslash\raggedright\hspace{0pt}}p{#1}}
\newcolumntype{u}[1]{>{\arraybackslash\raggedright\hspace{0pt}}m{#1}}
\newcommand{\tablefontsize}{ \footnotesize}
\newcommand{\tableheadfontsize}{\footnotesize}

\newcommand\tablestyle{%
\renewcommand{\arraystretch}{1.4}%
\normalfont\normalsize
\sffamily\tablefontsize
\centering%
}
\newcommand\tablealtcolored{%
\rowcolors{1}{tablerowcolor}{white!100}%
}
\newcommand\tableheadcolor{%
\rowcolor{tableheadcolor}%
}
\newcommand\tablehead{%
\tableheadfontsize%
\sffamily\bfseries%
}
\begin{document}
\begin{table}%[]<--
\caption{Die Überschrift}\label{tab:sigtechcmp}
\tablestyle
\tablealtcolored
\begin{tabular}{u{0.2\linewidth}v{0.4\linewidth}v{ 0.3\linewidth}}
\tableheadcolor
\tablehead Merkmal &
\tablehead Vorteile &
\tablehead Nachteile\tabularnewline
Merkmal 1 & \multicolumn{2}{l}{%
\samerowcolors
\begin{tabular}{@{}v{0.4\linewidth}v{0.3\linewidth }@{}}
a & \\
a & b\\
&b
\end{tabular}}\\
Merkmal 2 & a & b\\
Merkmal 3 & a & b\\
Merkmal 4 & \multicolumn{2}{l}{%
\samerowcolors
\begin{tabular}{@{}v{0.4\linewidth}v{0.3\linewidth }@{}}
c & \\
c & d\\
&d
\end{tabular}}\\
Merkmal 5 & a & b\\
Merkmal 6 & a & b\\
\end{tabular}
\end{table}
\end{document}

BTW: [] ist was anderes, als die Klammer ganz wegzulassen, so es hier (\begin{table}[])auch nicht zu Nebenwirkungen kam, außer einer entsprechenden Warnung ...

BTW2: Dein `\tablebody' wirkt sich nur auf die Zelle aus, in der dieser Befehl steht, müsste also in jeder folgenden Zelle wiederholt aufgerufen werden ... da ist es leichter, auf \tablebody zu verzichten (die Einstellungen machst Du ja vorher eh schon mit \tablestyle).

MfG

alpe
10-05-2010, 08:46
Genau so meinte ich das. Danke!

Ich seh allerdings bei der Syntax der Verzweigung, die du bei \samerowcolors benutzt hast, nicht wirklich durch - Dürfte ja aber schließlich trotzdem funktionieren.

rais
10-05-2010, 19:53
Moin moin,


Ich seh allerdings bei der Syntax der Verzweigung, die du bei \samerowcolors benutzt hast, nicht wirklich durch - Dürfte ja aber schließlich trotzdem funktionieren.
Normalerweise (d.h. hier xcolor mit table-Option) wird in jeder Tabellenzeile \rownum inkrementiert (in \@rowc@lors) und der Einfärbemechanismus schaut bloß, ob dieser \rownum ungerade oder gerade ist, um die entsprechenden Farben zu setzen. Solange \alternatecolorstrue gilt, ändert sich auch nix an diesem Verhalten.
Wird nun \samerowcolors bzw. \alternatecolorsfalse verwendet, zählt hier \rownum nicht mehr weiter, d. h. egal was es vorher war (gerade oder ungerade), der Wert ändert sich nicht mehr.
Und falls Du Dich fragst, wer diesen \ifalternatecolors wieder zurück auf true schaltet: \multicolumn gruppiert seinen Inhalt, damit gilt \samerowcolors nur innerhalb dieser Gruppe.;)

MfG

alpe
10-05-2010, 20:20
Danke für die Hinweise.

Kannst du mir bei dieser Gelegenheit auch gleich noch eine Quelle geben, wo erklärt wird wozu man @ bzw. \makeatletter \maketoother nutzt und warum \rowcolors hierbei so merkwürdig \rowc@lors heißt?

Steht bestimmt irgendwo geschrieben und muss hier nicht extra ausschweifend erklärt werden. Habe dazu bisher nur mal etwas in einem Buch gelesen, aber das einzige was ich dort verstanden hatte das @ wegen UTF-8 nicht geht und man dort auf den andern Befehl ausweichen muss.

rais
11-05-2010, 15:32
Moin moin,


Kannst du mir bei dieser Gelegenheit auch gleich noch eine Quelle geben, wo erklärt wird wozu man @ bzw. \makeatletter \maketoother nutzt

Afair steht's im TeXbook

und warum \rowcolors hierbei so merkwürdig \rowc@lors heißt?

\@rowc@lors ist einfach ein anderes Makro als `\rowcolors'. Warum es so heißt, musst Du den Autor des xcolor-Pakets fragen.
Generell gilt: wenn ein @ im Befehlsnamen verwendet wird, dann ist vom Paketautor normalerweise nicht vorgesehen, daß der Paketnutzer daran dreht.
Da kann er die Befehle dann auch nennen, wie er lustig ist ...


Habe dazu bisher nur mal etwas in einem Buch gelesen, aber das einzige was ich dort verstanden hatte das @ wegen UTF-8 nicht geht und man dort auf den andern Befehl ausweichen muss.
Aus welchem Buch hast Du das denn? Mit UTF-8 oder nicht hat das imho gar nix zu tun.
Ein Makroname darf normalerweise entweder nur aus einem einzigen Sonderzeichen oder aus einem oder mehreren Buchstaben bestehen (das kann man zwar umgehen, z.B. mit \csname ... \endcsname, aber das ist eine andere Geschichte). Für TeX gibt es generell genau 52 `Buchstaben' (A--Z und a--z).
\makeatletter heißt wörtlich ``mach `@' zu einem Buchstaben'' und \makeatother hebt dies wieder auf.

MfG