45° rotierter Text als Spaltenüberschrift

Tabellen und Grafiken erstellen und anordnen


MoonKid
Forum-Meister
Forum-Meister
Beiträge: 690
Registriert: Sa 30. Jun 2012, 11:56

45° rotierter Text als Spaltenüberschrift

Beitrag von MoonKid »

Es ist mal wieder schwierig das Problem in ein paar Worten im Titel zu erklären. ;)

Beispiel Bild

Jede Spalte dort hat eine um 45° rotierten Überschrift (bzw. Unterschrift, da sie in der letzten Zeile steht). Das möchte ich auch.

So einfach, wie ich dachte, ist es aber scheinbar nicht.
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,calc}

\begin{document}
\begin{tikzpicture}
    [every node/.style = draw]
    % erste Spalte sollte eigentlich rechtsbündig sein
    \node (A) {Text A};
    \node (A1) [right=of A] {?};
    \node (A2) [right=of A1] {?};
    \node (B) [below=of A] {längerer Text B};
    \node (B1) [right=of B] {?};
    \node (B2) [right=of B1] {?};
    \node (C) [below=of B] {nur C};
    \node (C1) [right=of C] {?};
    \node (C2) [right=of C1] {?};

    % das hier ginge wahlweise auch in der ersten Zeile, ebenfalls rechtsbündig
    \node (X) [below=of C1,transform canvas={rotate=45}] {foobar test};
    \node (Y) [below=of C2,rotate=45,anchor=north] {lipsum swääg};
\end{tikzpicture}
\end{document}
Nebenbei möchte ich den Text in der ersten Spalte auch rechtsbündig ausgerichtet haben. Vermutlich wäre hier die Lösung mit einer Matrix angebracht?Wollte das Beispiel jetzt aber nicht verkomplizieren. Der Fokus lieft auf dem rotierten Text.
XeLaTeX, TeX Live, vim-latexsuite

Gast

Beitrag von Gast »

Matrix wäre in der Tat besser. Anderenfalls musst du selbst dafür sorgen, dass die einzelnen Elemente wirklich untereinander stehen. Ich habe das hier mal dadurch vereinfacht:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,calc}
\usepackage[utf8]{inputenc}
\begin{document}
\begin{tikzpicture}
    [every node/.style = draw]
    % erste Spalte sollte eigentlich rechtsbündig sein
    \node (A) {Text A};
    \node (A1) [right=of A] {?};
    \node (A2) [right=of A1] {?};
    \node (B) [below=of A] {Text B};
    \node (B1) [right=of B] {?};
    \node (B2) [right=of B1] {?};
    \node (C) [below=of B] {Text C};
    \node (C1) [right=of C] {?};
    \node (C2) [right=of C1] {?};

    \node (X) [below=of C1,rotate=45,anchor=north east] {foobar test};
    \node (Y) [below=of C2,rotate=45,anchor=north east] {lipsum swääg};
\end{tikzpicture}
\end{document}

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Hier ist mal noch ein Beispiel mit einer Matrix
\documentclass[margin=5pt]{standalone}
\usepackage[utf8]{inputenc}
\usepackage{tikz}
\usetikzlibrary{matrix}
\tikzset{
   dot/.style={fill=#1,circle,minimum size=4.5ex,anchor=center},
   dot/.default={black}
}

\newsavebox\rbu
\newsavebox\rbl
\newsavebox\rbm
\newsavebox\rbh

\begin{document}
\sbox\rbu{\tikz\node[dot=blue!20]{?};}
\sbox\rbl{\tikz\node[dot=green]{};}
\sbox\rbm{\tikz\node[dot=yellow]{};}
\sbox\rbh{\tikz\node[dot=red]{};}
\begin{tikzpicture}
  \matrix[
     matrix of nodes,
     row sep=-\pgflinewidth,
     column sep=-\pgflinewidth,
     nodes={draw,inner sep=.3333em},
     inner sep=0pt
  ](m){
     \usebox\rbu & \usebox\rbl & \usebox\rbl \\
     \usebox\rbl & \usebox\rbu & \usebox\rbl \\
     \usebox\rbh & \usebox\rbm & \usebox\rbl \\
  };

  \foreach[count=\r] \text in{
       Text A,
       längerer Text B,
       Text C
     }\node[anchor=east]at(m-\r-1.west-|m.west){\text};

  \foreach[count=\c] \text in{
       foobar test,
       etwas anderes,
       lipsum swääg
     }\node[rotate=45,anchor=5]at(m-1-\c.south|-m.south){\text};
\end{tikzpicture}
\end{document}
Beim Rotieren von Nodes ist zu beachten, dass sich zum Beispiel der north east Anker des Nodes nach der Rotation relativ zur Nodeform immer noch an der selben Stelle befindet.
\documentclass[margin=5pt]{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
  [
    box/.style={#1,draw,minimum width=3cm,minimum height=1cm},
    box/.default=black
  ]
  \coordinate(O)at(0,0);
  \node[box,anchor=north east](n)at(O){};
  \node[circle,fill,inner sep=1pt] at(n.north east){x};
  \node[box=red,rotate=45,anchor=north east](r)at(O){};
  \node[fill,red,inner sep=1.5pt]at(r.north east){};
\end{tikzpicture}
\end{document}
Bild
Dateianhänge
gl_rotation.png
gl_rotation.png (3.07 KiB) 1299 mal betrachtet

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

Beitrag von Bartman »

@esdd

Danke für Dein matrix-Beispiel.

Darf ich statt
\usebox\rbu & \usebox\rbl & \usebox\rbl \\
\usebox\rbl & \usebox\rbu & \usebox\rbl \\
\usebox\rbh & \usebox\rbm & \usebox\rbl \\
an der Stelle auch
|[dot=blue!20]| ? & |[dot=green]|     & |[dot=green]| \\
|[dot=green]|	  & |[dot=blue!20]| ? & |[dot=green]| \\
|[dot=red]|	    & |[dot=yellow]|    & |[dot=green]| \\
benutzen? Wenn ja, welche Änderungen müssten dafür in Deinem Beispiel vorgenommen werden, um das gleiche Ergebnis zu erzielen?

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Dann müssen die Linien anschließend noch gezeichnet werden:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix,calc}
\usepackage[utf8]{inputenc}
\begin{document}
\begin{tikzpicture}[
  dot/.style={fill=#1,circle,minimum size=4ex,anchor=center},
  dot/.default={black},
]
\matrix[
  matrix of nodes,
  row sep=.6666em,
  column sep=.6666em,
  draw
](m){
  |[dot=blue!20]| ? & |[dot=green]|     & |[dot=green]| \\ 
  |[dot=green]|     & |[dot=blue!20]| ? & |[dot=green]| \\ 
  |[dot=red]|       & |[dot=yellow]|    & |[dot=green]| \\
};
\foreach[count=\i] \j in {2,3}{
    \draw($(m-1-\i|-m.north)!.5!(m-1-\j|-m.north)$)coordinate(h)--(h|-m.south);
    \draw($(m-\i-1-|m.west)!.5!(m-\j-1-|m.west)$)coordinate(h)--(h-|m.east);
  }

\foreach[count=\r] \text in{
    Text A,
    längerer Text B,
    Text C
  }\node[anchor=east]at(m-\r-1.west-|m.west){\text};

\foreach[count=\c] \text in{
    foobar test,
    etwas anderes,
    lipsum swääg
  }\node[anchor=north east, rotate=45]at(m-1-\c.south|-m.south){\text};
\end{tikzpicture}
\end{document}
oder
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix,calc}
\usepackage[utf8]{inputenc}
\begin{document}
\begin{tikzpicture}[
  dot/.style={fill=#1,circle,minimum size=4ex,anchor=center},
  dot/.default={black},
  rbu/.style={dot=blue!20},
  rbl/.style={dot=green},
  rbm/.style={dot=yellow},
  rbh/.style={dot=red!50},
]
\matrix[
  matrix of nodes,
  nodes in empty cells,
  nodes=rbl,
  row sep=.6666em,
  column sep=.6666em,
  draw
](m){
  |[rbu]|?&        &\\
          &|[rbu]|?&\\
  |[rbh] |&|[rbm]| &\\
};
\foreach[count=\i] \j in {2,3}{
    \draw($(m-1-\i|-m.north)!.5!(m-1-\j|-m.north)$)coordinate(h)--(h|-m.south);
    \draw($(m-\i-1-|m.west)!.5!(m-\j-1-|m.west)$)coordinate(h)--(h-|m.east);
  }

\foreach[count=\r] \text in{
    Text A,
    längerer Text B,
    Text C
  }\node[anchor=east]at(m-\r-1.west-|m.west){\text};

\foreach[count=\c] \text in{
    foobar test,
    etwas anderes,
    lipsum swääg
  }\node[anchor=north east, rotate=45]at(m-1-\c.south|-m.south){\text};
\end{tikzpicture}
\end{document}
Gruß
Elke

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

Beitrag von Bartman »

Danke für Deine Mühe. Ich bevorzuge Deine zweite Variante.

Antworten