Multicolumns bei tabularx-Tabellen einfärben

Tabellen und Grafiken erstellen und anordnen


Gast

Multicolumns bei tabularx-Tabellen einfärben

Beitrag von Gast »

Hallo zusammen,

seit geraumer Zeit versuche ich, einen morphologischen Kasten mit tabularx zu erstellen (hat funktioniert) und dann die entsprechenden Ausprägungen einzufärben (funktioniert nur teilweise). Die Anzahl der Ausprägungen (Spalten) können dabei je Merkmal (Zeile) variieren.

Bisher nutze ich Multicolumns in tabularx-Tabellen in Verbindung mit \cellcolor bzw. einem auf tabularx-Tabellen angepassten Befehl (online gefunden, wahrscheinlich bei tex.stackexchange).
Beim Einfärben treten jedoch Probleme vor allem in den letzten Zellen einer Zeile auf. Außerdem passt die Spaltenaufteilung nicht mehr, wenn kein multicolumn genutzt wird.

Kann mir jemand einen Tipp geben, was ich übersehen habe bzw. wie ich das Ergebnis erhalte, das ich gerne möchte?
Ausprobiert habe ich auch verschachtelte Tabellen (in Verbindung mit \cellcolor), aber auch das war bisher nicht zielführend (Lage der verschachtelten Tabelle und deren Höhe passen nicht). Ein Beispiel dafür habe ich mit ins MWE gepackt. TikZ habe ich mir bisher nur am Rande angeschaut, da mich die gezeigten Beispiele nicht überzeugen. Einen Unterschied beim Verhalten zwischen tabu und tabularx konnte ich bisher nicht feststellen.

Vielen Dank im Voraus für eure Hilfe.

Folgend ein Beispiel mit einmal mit multicolumns und einmal mit verschachtelten Tabellen (neue Befehle habe ich mir definiert, da ich einige Tabellen so erstellen will/muss und es damit schneller geht):
\documentclass{scrreport}
\usepackage{calc}
\usepackage{tabularx} 
\usepackage{array}
\usepackage[table]{xcolor}				

%%% neue Befehle %%%
% neuer Spaltentyp für zentrierte X-Spalten
\newcolumntype{C}{>{\centering\arraybackslash}X}


% neuer Befehl für umbrechenden Multicolumns über X-Spalten. Funktioniert gut
\newcommand{\mcX}[2]{\multicolumn{#1}
				{%\def\Anzahl{#1}%
				|>{\hsize=\dimexpr#1\linewidth+#1\tabcolsep+#1\tabcolsep%-#1\arrayrulewidth
					}C|}
				{#2}}
% neuer Befehl, um Multicolumns über X-Spalten einzufärben. Funktioniert mäßig
\newcommand{\mcXColor}[2]{\multicolumn{#1}
				{%\def\Anzahl{#1}%
				|>{\cellcolor{lightgray}\hsize=\dimexpr#1\linewidth+#1\tabcolsep+#1\tabcolsep-#1\arrayrulewidth
					}C|}
				{#2}}

%%% Dokumentstart
\begin{document}

% für vertikal zentrierte Spalten die X-Spaltendefinition anpassen. Grundlage sind jetzt die m-Spalten (sonst die p-Spalten)
\renewcommand{\tabularxcolumn}[1]{>{\normalsize\centering\arraybackslash}m{#1}}


\begin{table}[htbp]
	\small
	\caption{Multicolumntabelle}
	\begin{tabularx}
	{\textwidth}		% Tabellenbreite = Textbreite
	{|m{2.5cm}|	% muss für die richtigen Zentrierung "m" sein
	*{6}{X|}
	}%
				 %	>\centering\arraybackslash}%
					%}
					 % horizontale & vertikale Zentrierung der X-Spalten
	\hline
	Merkmal & 
		\mcX{6}{Merkmalsausprägung} \\
	\hline
	
	Forschungs\-gebiete & 
		bio\-lo\-gisch & \cellcolor{lightgray}sozio\--technisch & öko\-logisch &
		öko\-nomisch & tech\-nisch & so\-zial \\
	\hline
	
	Ab\-strak\-tions\-grad & 
		\mcX{3}{\cellcolor{lightgray}gegen\-ständlich} & 
		\mcX{3}{formal} \\
	\hline
	
	Ent\-stehungs\-art & 
		\mcX{3}{natürlich} & 
		\mcX{3}{\cellcolor{lightgray}künstlich} \\
	\hline
	
	Zweck des Systems & 
		\mcXColor{2}{Örtliche und zeitliche Veränderung} & 
		\mcX{2}{Form\-veränderung} & 
		\mcX{2}{Struktur\-änderung} \\
	\hline
	
	Zeit\-ab\-hängig\-keit & 
		\mcX{3}{statisch} & 
		\mcXColor{3}{dynamisch} \\
	\hline
	\end{tabularx}%
\end{table}


\begin{table}[htbp]
  \small
  \caption{verschachtelte Tabelle}
    \begin{tabularx}
			{\textwidth}
	{|m{2.5cm}|	% muss für die richtigen Zentrierung "m" sein
	X|
	}%
	\hline
	Merkmal & 
		Merkmalsausprägung \\
	\hline
	
	Forschungs\-gebiete & 
		{\begin{tabularx}{\linewidth+2\tabcolsep}{*{5}{X|}X}
			bio\-lo\-gisch & \cellcolor{lightgray}sozio\--technisch & öko\-logisch &
			öko\-nomisch & tech\-nisch & so\-zial
			\end{tabularx}}\\
	\hline
	
	Ab\-strak\-tions\-grad & 
		{\begin{tabularx}{\linewidth+2\tabcolsep}{*{2}{X|}X}
			\cellcolor{lightgray}gegen\-ständlich & formal
			\end{tabularx}}\\
	\hline
	
	Ent\-stehungs\-art &
		{\begin{tabularx}{\linewidth+2\tabcolsep}{*{1}{X|}X}
			natürlich & \cellcolor{lightgray}künstlich
			\end{tabularx}}\\
	\hline
	
	Zweck des Systems &
		{\begin{tabularx}{\linewidth+2\tabcolsep}{*{2}{X|}X}
		\cellcolor{lightgray}Örtliche und zeitliche Veränderung & 
		Form\-veränderung & Struktur\-änderung
		\end{tabularx}}\\
	\hline
	
	Zeit\-ab\-hängig\-keit & 
		{\begin{tabularx}{\linewidth+2\tabcolsep}{*{1}{X|}X}
			statisch & \cellcolor{lightgray}dynamisch
			\end{tabularx}}\\
	\hline
    \end{tabularx}%
  \label{tab:Morphologie-Konzepte}%
	\par \normalsize
\end{table}%


% alte X-Spaltendefinition auf p-Basis wiederherstellen
\renewcommand{\tabularxcolumn}[1]{p{#1}} 

\end{document}

Bartman
Forum-Meister
Forum-Meister
Beiträge: 2456
Registriert: Do 16. Jul 2009, 21:41
Wohnort: Hessische Provinz

Beitrag von Bartman »

In meinem Vorschlag werden zwar mehr Tabellen eingefügt, als nötig sind, aber dafür spare ich Quelltext. Die Tabellenumgebung in der Tabelle sowie ihr Spaltentyp erfordern jedoch die Eingabe der Zeilenumbrüche.
\documentclass[captions=tableheading]{scrreprt}% Tippfehler in Klassenname entfernt
\usepackage[T1]{fontenc}% https://texwelt.de/fragen/5537
\usepackage{lmodern}
\usepackage[ngerman]{babel}
\usepackage{tabularx}% lädt array
\usepackage[table]{xcolor}
\usepackage{ragged2e}% für \RaggedRight

\newcommand{\ctab}[1]{%
	\begin{tabular}{@{}c@{}}#1\end{tabular}%
}

\newcommand{\mc}[2]{
	\multicolumn{#1}{c|}{\ctab{#2}}
}

\newcommand{\mcc}[2]{
	\multicolumn{#1}{
		>{\columncolor{lightgray}}c|
	}{\ctab{#2}}
}


\begin{document}
\begin{table}[htbp]
    \small
    \caption{Morphologie-Konzepte}
    \label{tab:Morphologie-Konzepte}
    \renewcommand{\tabularxcolumn}[1]{>{\hspace{0pt}\Centering}m{#1}}
    \begin{tabularx}{\textwidth}{
        |>{\hspace{0pt}\RaggedRight}m{2.5cm}|
        *6{X|}
    }
    \hline
    Merkmal & \mc{6}{Merkmalausprägung}\\
    \hline
    Forschungs\-gebiete & biologisch & \cellcolor{lightgray} soziotechnisch & 
    öko\-logisch & öko\-nomisch & technisch & sozial\\
    \hline
    Abstraktionsgrad & 
    \mcc{3}{gegenständlich} &
    \mc{3}{formal} \\
    \hline
    Entstehungsart & \mc{3}{natürlich} & 
    \mcc{3}{künstlich}\\
    \hline
    Zweck des Systems & 
    \mcc{2}{Örtliche und\\zeitliche\\Veränderung} &
    \mc{2}{Formveränderung} & 
    \mc{2}{Strukturveränderung}\\
    \hline
     Zeitabhängig\-keit & \mc{3}{statisch} & 
     \mcc{3}{dynamisch}\\
    \hline
    \end{tabularx}
\end{table}
\end{document}

Gast

Beitrag von Gast »

Vielen Dank. Hab's getestet und funktioniert. War meine Befürchtung also gerechtfertigt, dass das mit X-Spalten nicht zufriedenstellend funktioniert. Schade. Aber die vorgeschlagene Lösung ergibt, was ich möchte und ist praktikabel. Ich werde sie so nutzen.

Threadersteller

Beitrag von Threadersteller »

Sorry für das Reaktivieren, aber so ganz funktioniert es bei mir noch nicht.
Den Vorschlag wollte ich für weitere Tabellen nutzen. Dort sind aber andere/ mehr Kombinationen der Ausprägungen möglich. Daher habe ich, als quasi kleinstes gemeinsames Vielfaches, eine hohe Spaltenanzahl (30) genutzt, um die verschiedenen Varianten halbwegs symmetrisch/gleichmäßig verteilt abbilden zu können. Leider funktioniert es dort nicht. Dies liegt, wie ich herausgefunden haben, vor allem daran, dass die 30 einzelnen Spalten nicht einzeln genutzt werden. Die tabu- und die longtable-Pakete bieten entsprechende Lösungen an, wenn nur multicolumns genutzt werden. Gibt es eine entsprechende Möglichkeit bei tabularx oder andere Varianten? Die Nutzung der genannten alternativen Pakete hat leider kein zufriedenstellendes Ergebnis geliefert.
\documentclass[11pt,twoside]{scrbook}

\usepackage[T1]{fontenc} 
\usepackage[utf8]{inputenc} 
\usepackage[ngerman]{babel} 
\usepackage[table]{xcolor} 
\usepackage{tabularx} 

\renewcommand{\tabularxcolumn}[1]{>{\normalsize\centering\arraybackslash}m{#1}}

\newcommand{\ctab}[1]{%
   \begin{tabular}{@{}c@{}}#1\end{tabular}%
}
\newcommand{\mc}[2]{
   \multicolumn{#1}{c|}{\ctab{#2}}
}
\newcommand{\mcc}[2]{
   \multicolumn{#1}{
      >{\columncolor{lightgray}}c|
   }{\ctab{#2}}
}

\begin{document} 
	\begin{tabularx} {\textwidth}{|m{2.3cm}|X|*{30}{X|}}
    \hline
    Merkmal & \mc{30}{Merkmalsausprägung}\\
    \hline
    Abstraktionsgrad &
			\mcc{15}{gegenständlich} &
			\mc{15}{formal} \\
    \hline
    Entstehungsart & 
			\mc{15}{natürlich} &
			\mcc{15}{künstlich}\\
    \hline
    Zweck des Systems &
			\mcc{10}{Örtliche und\\zeitliche\\Veränderung} &
			\mc{10}{Formveränderung} &
			\mc{10}{Strukturveränderung}\\
    \hline
    Zeitabhängig\-keit & 
			\mc{15}{statisch} &
			\mcc{15}{dynamisch}\\
    \hline\end{tabularx}
\end{document}

Gast

Beitrag von Gast »

Zunächst einmal hast du 32 Spalten deklariert, verwendest aber nur 31. Dazu kommt, dass du in Wirklichkeit keine einzige Zeile mehr hast, in der tatsächlich eine X-Spalte verwendet wird. Sämtliche X-Spalten sind durch \multicolumn-Anweisungen überdeckt, bei denen als Spaltendeklaration c verwendet wird. c ist aber nicht dehnbar. Du kannst die Problematik sehr gut visualisieren, wenn du einmal über die erste echte Tabellenzeile noch eine Dummy-Zeile mit 31 leeren Spalten setzt. Du wirst dann sehen, dass diese weiter nach rechts reichen als die restlichen Tabellenzeilen.

Eigentlich sieht das ganze für mich ohnehin eher nach einer Grafik als einer Tabelle aus. Deshalb würde ich empfehlen, das mit pgf/TikZ zu machen. Wenn schon eine Tabelle, dann eher eine tabular* als eine tabularx. Allerdings funktioniert dabei das Füllen mit Farbe dann wieder nicht, weil der per \extracolsep{\fill} eingefügte Abstand nicht eingefärbt würde. Damit lande ich dann wieder bei meinem Vorschlag: Mach Grafiken besser als Bild. Ansonsten müsstest du in der Tat die Inneren Tabellen auf eine bestimmte Breite setzen statt sie einfach nur als c-Spalten zu realisieren. Das wäre in diesem Fall sogar möglich, da sowohl die Tabellenbreite als auch die Breite der einzigen nicht X-Spalte bekannt ist. Also kann man die Breite einer einzelnen Spalte einfach ausrechnen (die beiden \tabcolsep je Spalte nicht vergessen) und entsprechend \multicolumn-Zusammenfassungen als Spalten von entsprechenden Vielfachen dieser festen Breite definieren.

Man könnte auch versuchen, bei den \multicolumn wieder X-Spalten zu verwenden, muss dann aber zusätzliche Maßnahmen ergreifen, damit die Ausrichtung in allen Zellen passt. Außerdem bekommt man dann rasch einmal Probleme mit den vertikalen Linien (auf die man ohnehin besser verzichtet, wenn es eine Tabelle und keine Grafik sein soll):
\documentclass[11pt,twoside]{scrbook}

\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage[table]{xcolor}
\usepackage{tabularx}
\usepackage{ragged2e}

\renewcommand{\tabularxcolumn}[1]{>{\normalsize\centering\arraybackslash}m{#1}}

\newcommand{\ctab}[1]{%
   \begin{tabular}{@{}c@{}}#1\end{tabular}%
}
\newcommand{\mc}[2]{%
   \multicolumn{#1}{X|}{\ctab{#2}}%
}
\newcommand{\mcc}[2]{%
   \multicolumn{#1}{%
      >{\columncolor{lightgray}}X|
   }{\ctab{#2}}%
}

\begin{document}
   \begin{tabularx} {\textwidth}{|>{\RaggedRight}m{2.9cm}|*{30}{c|}}
     \hline
    Merkmal & \multicolumn{30}{c|}{Merkmalsausprägung}\\
    \hline
    Abstraktionsgrad &
         \mcc{15}{gegenständlich} &
         \multicolumn{15}{c|}{formal} \\
    \hline
    Entstehungsart &
         \mc{15}{natürlich} &
         \mcc{15}{künstlich}\\
    \hline
    Zweck des Systems &
         \mcc{10}{Örtliche und\\zeitliche\\Veränderung} &
         \mc{10}{Formveränderung} &
         \mc{10}{Strukturveränderung}\\
    \hline
    Zeitabhängig\-keit &
         \mc{15}{statisch} &
         \mcc{15}{dynamisch}\\
     \hline
   \end{tabularx}
\end{document}

Threadersteller

Beitrag von Threadersteller »

Danke für die Rückmeldung. Aber die Verwendung von tabular mit 30 Spalten mit definierter Breite hat mir leider nicht geholfen und auch dein Minimalbeispiel erzeugt bei mir nicht die gewünschte Ausgabe. Da das mit Tabellen scheinbar nicht so funktioniert, wie gewünscht, habe ich mich nun doch in pgf/tikz eingearbeitet (erstaunlich verständlich) und den Kasten damit erstellt (einfärben geht sogar auch), auch wenn der Umgang mit Text etwas gewöhnungsbedürftig ist. Danke trotzdem für die Hilfe.

Antworten