Erstellen eines Morphologischen Kastens mit Lualatex

Tabellen und Grafiken erstellen und anordnen


Zoid
Forum-Century
Forum-Century
Beiträge: 104
Registriert: Do 12. Mär 2020, 13:48

Erstellen eines Morphologischen Kastens mit Lualatex

Beitrag von Zoid »

Moin moin,

ich würde gerne einen Morphologischen Kasten mit Lualatex nach folgendem Vorbild erstellen:
Bild
Wobei ich gerne die Kreise in zwei verschiedenen Farben Darstellen würde. Ein Zentrieren der Schrift und der Kreise wäre auch von Vorteil (da darf es gerne vom Original abweichen :D ).

Nun dachte ich mir, dass man das doch mit tikz oder booktabs bzw. tabularx machen könnte, aber leider weit gefehl. Soweit ich es an verschiedenen Stellen im Netz gelesen habe, erstellt man Tabellen oder eine Matrix besser nicht mit tikz und die anderen beiden Optionen machen mir schon bei den vertikalen Trennstrichen einen Strich durch die Rechnung, da diese nicht über die gesamt Zeilenhöhe gehen und die Pakete wohl auch nciht für derartige Anwendungen vorgesehen sind. Wenn so ein Fehler schon am Anfang auftritt, dann lasse ich lieber gleich die Finger davon.

Welche Möglichkeiten gibt es noch, derartige Abbildungen zu erstellen?

Viele Dank und viele Grüße :wink:


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

Re: Erstellen eines Morphologischen Kastens mit Lualatex

Beitrag von Bartman »

Für diesen Kasten kann man entweder eine TikZ-Matrix benutzen oder mit der Hilfe der TikZ-Bibliothek tikzmark auf einer Tabelle zeichnen. In den Foren wird immer wieder davon abgeraten, die Befehle von booktabs zusammen mit senkrechten Linien einzusetzen.

Da hier vermutlich niemand Lust hat, den Tabelleninhalt abzutippen, wäre es gut, wenn Du diesen in einem Beispiel veröffentlichst.


Zoid
Forum-Century
Forum-Century
Beiträge: 104
Registriert: Do 12. Mär 2020, 13:48

Re: Erstellen eines Morphologischen Kastens mit Lualatex

Beitrag von Zoid »

Ne, die sollte nur als Orintierung für ein Layout dienen. Mir würde zu Beginn auch ein einfacheres Format reichen, wie das folgende schematische Beispiel:

| Merkmal | Ausprägung |
| Merkmal 1 | Ausprägung 1 | Ausprägung 2 |
| Merkmal 2 | Ausprägung 1 | Ausprägung 2 | Ausprägung 3 |
| Merkmal 3 | Ausprägung 1 | Ausprägung 2 | Ausprägung 3 | Ausprägung 4 |

Die Zellenbreite könnte aber ein Problem darstellen, wenn alle Zeilen in Summe gleich breit sein sollen.

Aber wenns doch mit Tikz gemacht werden muss, dann werd ich mich mal an die 800+ Seiten Anleitung setzen ...


Zoid
Forum-Century
Forum-Century
Beiträge: 104
Registriert: Do 12. Mär 2020, 13:48

Re: Erstellen eines Morphologischen Kastens mit Lualatex

Beitrag von Zoid »

Das konnte ich bisher soweit schon mal zusammenbasteln. Bin quasi fast am Ziel, fehlt nur noch das komplette Layout und die bunten Kreise und alles andere:

\documentclass[ngerman,12pt,a4paper,toc=listof,parskip=full,singlespacing=true]{scrreprt}
\usepackage{tikz}
\usetikzlibrary{matrix}

\begin{document}

\begin{tikzpicture}
\matrix [matrix of nodes,rectangle, draw,
nodes={draw,rectangle}]
{Merkmal & Ausprägung\\
Merkmal 1 & Ausprägung 1 & Ausprägung 2\\
Merkmal 2 & Ausprägung 1 & Ausprägung 2 & Ausprägung 3\\
Merkmal 3 & Ausprägung 1 & Ausprägung 2 & Ausprägung 3 & Ausprägung 4\\
};
\end{tikzpicture}

\end{document}

Also für mich sieht das sehr abstrakt aus und ich kann mir leider nicht vorstellen, wie das irgendwie irgendwann mal zum Ziel führen sollte.


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

Re: Erstellen eines Morphologischen Kastens mit Lualatex

Beitrag von Bartman »

Der Ausbau Deines Beispiels könnte wie folgt entworfen werden:

\documentclass[tikz]{standalone}
\usetikzlibrary{matrix,shapes.geometric}

\begin{document}
\begin{tikzpicture}[
    font=\sffamily,
    circle mark/.style={
        draw=red,
        shape=ellipse,
        ultra thick,
        inner xsep=-3pt
    },
    line/.style={red, ultra thick}
]
\matrix [
    matrix of nodes,
    nodes={
        draw, 
        minimum width=2.6cm, 
        minimum height=.8cm, 
        anchor=center
    },
    row sep=-\pgflinewidth,
    column sep=-\pgflinewidth
] (m) {
    Merkmal & Ausprägung\\
    Merkmal 1 & Ausprägung 1 & Ausprägung 2\\
    Merkmal 2 & Ausprägung 1 & Ausprägung 2 & Ausprägung 3\\
    Merkmal 3 & Ausprägung 1 & Ausprägung 2 & Ausprägung 3 & Ausprägung 4\\
};
\path [nodes=circle mark]
    (m-2-2) node (cm1) {\phantom{Ausprägung 1}}
    (m-4-4) node (cm2) {\phantom{Ausprägung 3}}
;
\draw [line] (cm1.east) -- (cm2.west);
\end{tikzpicture}
\end{document}

Zoid
Forum-Century
Forum-Century
Beiträge: 104
Registriert: Do 12. Mär 2020, 13:48

Re: Erstellen eines Morphologischen Kastens mit Lualatex

Beitrag von Zoid »

Ich habe das Beispiel mal etwas weiter ausgebaut, stoße aber wieder an Grenzen:

\documentclass[tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{fit,matrix,shapes.geometric}

\begin{document}
\begin{tikzpicture}[
    font=\sffamily,
    circle mark finish/.style={
        draw=red,
        shape=ellipse,
        thick,
        inner xsep=-3pt
    },
        circle mark unfinish/.style={
        draw=green,
        shape=ellipse,
        thick,
        inner xsep=-3pt
    },
    line/.style={red, thick}
]
\matrix [
    matrix of nodes,
    nodes={
        draw, 
        minimum width=2.6cm, 
        minimum height=.8cm, 
        anchor=center
    },
    row sep=-\pgflinewidth,
    column sep=-\pgflinewidth,
    execute at empty cell={\node{};}
] (m) {
    Merkmal & Ausprägung & & &\\
    Merkmal 1 & Ausprägung 1 & Ausprägung 2 &{} &{}\\
    Merkmal 2 & Ausprägung 1 & Ausprägung 2 & Ausprägung 3&{}\\
    Merkmal 3 & Ausprägung 1 & Ausprägung 2 & Ausprägung 3 & Ausprägung 4\\
};
%\node[draw,fit=(m-1-3)(m-1-4),nodes]{Test};

\path [nodes=circle mark finish]
    (m-2-2) node (cm1) {\phantom{Ausprägung 1}}
    (m-4-4) node (cm3) {\phantom{Ausprägung 3}}
;
\path [nodes=circle mark unfinish]
    (m-3-3) node (cm2) {\phantom{Ausprägung 2}}
;
\draw [line] (cm1.east) -- (cm2.west);
\draw [line] (cm2.east) -- (cm3.west);
\end{tikzpicture}
\end{document}

Ich gebe meinen Plan auf, eine individuell anpassbare Zellenbreit in Abhängigkeit der Anzahl der Zellen in einer Reihe zu erhalten.
Hinzugefügt habe ich eine weitere farbige Markierung (grüne Ellipse) und leere Zellen.
Jetzt habe ich versuch durch die Integration von execute at empty cell={\node{};} und \node[draw,fit=(m-1-3)(m-1-4),nodes]{Test}; leere Zellen hinzuzufügen und zu verbinden. Dies ist durch Benutzen von & nicht einfach so möglich.
Allerdings wird mir nun folgende Fehlermeldung ausgespcukt, sofern ich \node[draw,fit=(m-1-3)(m-1-4),nodes]{Test}; im Code aktiviere (im Beispiel deaktiviert):

! Package pgf Error: No shape named `m-1-3' is known.

See the pgf package documentation for explanation.
Type  H <return>  for immediate help.
 ...                                              
                                                  
l.39 \node[draw,fit=(m-1-3)(m-1-4),nodes] {Test};

Daraus interpretiere ich, dass die Zelle nicht da ist, obwol ich sie sehen kann. Jetzt weiß ich auch nicht mehr weiter.

Des Weiteren würde ich gerne noch die zweite horizontale und vertikale Trennlinie dick zeichnen lassen. Kann ich dazu row sep ähnlich wie bei den nodes umdefinieren?


Zoid
Forum-Century
Forum-Century
Beiträge: 104
Registriert: Do 12. Mär 2020, 13:48

Re: Erstellen eines Morphologischen Kastens mit Lualatex

Beitrag von Zoid »

Zoid hat geschrieben:
Mo 2. Nov 2020, 09:31

Des Weiteren würde ich gerne noch die zweite horizontale und vertikale Trennlinie dick zeichnen lassen. Kann ich dazu row sep ähnlich wie bei den nodes umdefinieren?

Frage halb selbst beantwortet. Ich habe noch folgenden Code hinzugefügt:

line thick/.style={black, ultra thick}

\draw [line thick] (m-1-1.north east) -- (m-4-1.south east);
%\draw [line thick] (m-1-1.south west) -- (m-1-5.south west);

Leider geht das nur bei der vertikalen linie, da ich das Ende der horizontalen Linie mit m-1-5 nicht adressieren kann (hier wieder deaktiviert).


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

Re: Erstellen eines Morphologischen Kastens mit Lualatex

Beitrag von Bartman »

Der Stil nodes ist in Deinen Beiträgen nirgends definiert und die Fehlermeldung verschwindet, wenn Du die Option nodes in empty cells hinzufügst.

\documentclass[tikz]{standalone}
\usetikzlibrary{fit,matrix,shapes.geometric}

\begin{document}
\begin{tikzpicture}[
    font=\sffamily,
    circle mark/.style={
        draw=#1,
        shape=ellipse,
        thick,
        inner xsep=-3pt
    },
    circle mark finish/.style={
        circle mark=red
    },
    circle mark unfinish/.style={
        circle mark=green
    },
    line/.style={red, thick},
    line thick/.style={ultra thick}
]
\matrix [
    matrix of nodes,
    nodes={
        draw, 
        minimum width=2.6cm, 
        minimum height=.8cm, 
        anchor=center
    },
    row sep=-\pgflinewidth,
    column sep=-\pgflinewidth,
    nodes in empty cells% <- eingefügt
%    execute at empty cell={\node{};}
] (m) {
    Merkmal & Ausprägung & & &\\
    Merkmal 1 & Ausprägung 1 & Ausprägung 2 &  & \\
    Merkmal 2 & Ausprägung 1 & Ausprägung 2 & Ausprägung 3& \\
    Merkmal 3 & Ausprägung 1 & Ausprägung 2 & Ausprägung 3 & Ausprägung 4\\
};
\node[draw,fit=(m-1-3)(m-1-4)]{Test};

\path [nodes=circle mark finish]
    (m-2-2) node (cm1) {\phantom{Ausprägung 1}}
    (m-4-4) node (cm3) {\phantom{Ausprägung 3}}
;
\path [nodes=circle mark unfinish]
    (m-3-3) node (cm2) {\phantom{Ausprägung 2}}
;
\draw [line] (cm1.east) -- (cm2.west);
\draw [line] (cm2.east) -- (cm3.west);

\draw [line thick] 
    (m-1-1.north east) -- (m-4-1.south east)
    (m-1-1.south west) -- (m-1-5.south west)
;
\end{tikzpicture}
\end{document}

Zoid
Forum-Century
Forum-Century
Beiträge: 104
Registriert: Do 12. Mär 2020, 13:48

Re: Erstellen eines Morphologischen Kastens mit Lualatex

Beitrag von Zoid »

Da dachte ich, dass nodes automatisch vordefiniert ist. Aber so klappt es auch, danke dafür.

Wie kann ich denn jetzt noch die Zellen 1-2 bis 1-5 miteinander verbinden und die Schrift mittig anordnen? Wäre praktisch, wenn man das quasi als eine node festlegen könnte, denke ich.

Der zuvor gewählt Ansatz zeichnet zwar irgendwas, aber bei mir ist die Schrift zu hoch und die Umrandung zu groß, außerdem sind die senkrechten dünnen Trennlinien in Zeile 1 immer noch zu sehen.

\node[draw,fit=(m-1-3)(m-1-4)]{Test};

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

Re: Erstellen eines Morphologischen Kastens mit Lualatex

Beitrag von Bartman »

Du hast bzgl. nodes recht. Der Stil ist vorhanden, aber erwartet, wie die Fehlermeldung sagt, einen Wert.

Wenn Du mit der Verbindung der Zellen 1-2 bis 1-5 eine gemeinsame Spaltenbeschriftung anstrebst, dann könnte ich mir das so vorstellen:

\documentclass[tikz]{standalone}
\usetikzlibrary{fit,matrix,shapes.geometric}

\begin{document}
\begin{tikzpicture}[
    font=\sffamily,
    circle mark/.style={
        draw=#1,
        shape=ellipse,
        thick,
        inner xsep=-3pt
    },
    circle mark finish/.style={
        circle mark=red
    },
    circle mark unfinish/.style={
        circle mark=green
    },
    line/.style={red, thick},
    line thick/.style={ultra thick}
]
\matrix [
    matrix of nodes,
    nodes={
        draw, 
        minimum width=2.6cm, 
        minimum height=.8cm, 
        anchor=center
    },
    row sep=-\pgflinewidth,
    column sep=-\pgflinewidth,
    nodes in empty cells,
    row 1/.style={nodes={draw=none}}
] (m) {
    |[draw]| Merkmal &&&&\\
    Merkmal 1 & Ausprägung 1 & Ausprägung 2 &  & \\
    Merkmal 2 & Ausprägung 1 & Ausprägung 2 & Ausprägung 3& \\
    Merkmal 3 & Ausprägung 1 & Ausprägung 2 & Ausprägung 3 & Ausprägung 4\\
};
\node [draw, fit=(m-1-2)(m-1-5), inner sep=-.5\pgflinewidth, label=center:Ausprägung]{};

\draw [line thick] 
    (m-1-1.north east) -- (m-4-1.south east)
    (m-1-1.south west) -- (m-1-5.south west)
;

\path [nodes=circle mark finish]
    (m-2-2) node (cm1) {\phantom{Ausprägung 1}}
    (m-4-4) node (cm3) {\phantom{Ausprägung 3}}
;
\path [nodes=circle mark unfinish]
    (m-3-3) node (cm2) {\phantom{Ausprägung 2}}
;
\draw [line] 
    (cm1.east) -- (cm2.west)
    (cm2.east) -- (cm3.west)
;
\end{tikzpicture}
\end{document}

Antworten