3
1

Ich versuche, einen Knoten innerhalb eines Knotens zu zeichnen. Vereinfacht sieht es so aus:

\documentclass{article}
\usepackage{tikz}
\begin{document}
  \begin{tikzpicture}
    \node (Aussen) {
       \node{Innen};
   };
  \end{tikzpicture}
\end{document}

Jedoch erhalte ich den Fehler:

! Undefined control sequence.
l.6        \node
                {Innen};

TikZ kennt nun \node nicht mehr innerhalb des Knotens! Wie schachtelt man nodes richtig?

gefragt 05 Aug '13, 19:03

Felix's gravatar image

Felix
1.3k525667
Akzeptiert-Rate: 47%

bearbeitet 25 Aug '13, 13:32

stefan's gravatar image

stefan ♦♦
18.3k163148

(\tikz\node{Innen};) Man verhindert aber im besten Fall das Verschachteln von Nodes, da alle Optionen vererbt werden. Gibst du zum Beispiel eine minimum width für die äußere Node an, verwendet die innere diese auch und so hat die äußere nicht mal die minimum width, wenn die innere ganz klein ist (es gibt ja noch die inner xseps). Was möchtest du denn überhaupt erreichen? Eventuell kann man mit fit und backgrounds etwas robuster (wenn auch unkomfortabler) arbeiten. Im Worst-Case speichert man das innere TikZ-Picture in einer box und verwendet die dann in der äußeren.

(05 Aug '13, 19:11) Qrrbrbirlbel

Innerhalb des Node-Textes befindet du dich wieder im klassischen TeX(t)-Modus.

TikZ sorgt extra dafür, dass Makros wie \path, \draw and \node

  1. nur innerhalb von TikZ-Pictures die TikZ-Bedeutung haben (man kann also in der Preamble selber ein \node-Makro definieren, ohne dass TikZ’ \node davon beeinträchtigt ist) und
  2. innerhalb der Node-Texte wieder ihre Bedeutung haben, die sie vor dem TikZ-Picture hatten, das oben selbst-definierte \node-Makro kann also im Node-Text wieder in der eigenen Definition verwendet werden.

Du benötigst eine weitere tikzpicture-Umgebung oder das Kurz-Makro \tikz, dein Beispiel mit nodes=draw versehen

\documentclass[tikz,convert=false]{standalone}
\begin{document}
  \begin{tikzpicture}[nodes=draw]
    \node (Aussen) {
       \tikz\node{Innen};
   };
  \end{tikzpicture}
\end{document}

ergibt dann

alt text

Das funktioniert gerade noch zufriedenstellend. Probleme entstehen, wenn man Optionen verwendet. Diese werden nämlich an das innere TikZ-Picture sowie die Nodes vererbt. Verwendet man zum Beispiel minimum width=2cm an der äußeren Node verwendet die innere das auch und letztlich wird die äußere doch größer (inner xsep kommt ja auch noch dazu):

\documentclass[tikz,convert=false]{standalone}
\begin{document}
  \begin{tikzpicture}[nodes=draw]
    \draw[help lines] (0,0) grid (3,1);
    \node[minimum width=2cm, anchor=south west] (Aussen) {
       \tikz\node{Innen};
   };
  \end{tikzpicture}
\end{document}

alt text

Mit der fit-Library und dem fit-Key kann man dem entgegenwirken, in dem man erst die innere Node zeichnet und dann die äußere drumherum fittet:

\documentclass[tikz,convert=false]{standalone}
\usetikzlibrary{fit}
\begin{document}
  \begin{tikzpicture}[nodes=draw]
    \draw[help lines] (0,0) grid (3,1);
    \node (innen) at (1,.5) {Innen};
    \node[fit=(innen), minimum width=2cm] {};
  \end{tikzpicture}
\end{document}

alt text

Selbstverständlich zeichnet das auch die äußere Node später, so dass ihre Füllung die innere überdeckt, mit der backgrounds-Library und der on background layer kann man das ändern:

\documentclass[tikz,convert=false]{standalone}
\usetikzlibrary{fit,backgrounds}
\begin{document}
  \begin{tikzpicture}[nodes=draw]
    \node[fill=white] (innen) at (1,.5) {Innen};
    \begin{scope}[on background layer]
      \node[fill=yellow, fit=(innen), minimum width=2cm] {};
    \end{scope}
  \end{tikzpicture}
\end{document}

alt text

Eine Alternative zu fit und backgrounds ist die Speicherung der inneren Node in einer Box mittels \sbox. Zur Verwendung innerhalb des TikZ-Pictures (dessen Optionen es erben soll) benutzt man am besten \tikzBox wie unten definiert.

\documentclass[tikz,convert=false]{standalone}
\newbox\mybox
\newcommand{\tikzBox}[2][\mybox]{%
  \sbox#1{\pgfinterruptpicture#2\endpgfinterruptpicture}}
\begin{document}
  \begin{tikzpicture}[nodes=draw]
    \tikzBox{\tikz\node[fill=white] (innen) at (1,.5) {Innen};}
    \node[fill=yellow, minimum width=2cm] {\usebox\mybox};
  \end{tikzpicture}
\end{document}

alt text

Permanenter link

beantwortet 05 Aug '13, 19:41

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k3815
Akzeptiert-Rate: 53%

Ich habe das jetzt mit einer weiteren tikzpicture-Umgebung innerhalb des node gemacht. Vielleicht geht es ja besser.

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,shapes.multipart}
\begin{document}
  \begin{tikzpicture}
    \node[draw,fill=yellow!96!black,rectangle, rounded corners=2ex,
      align=center, inner sep=3ex, font=\sffamily] (Aussen) {
      \begin{tikzpicture}
        \node[draw, shape=rectangle split, rectangle split parts=2,
          inner sep=1ex, rounded corners=0pt,
          fill=white, font=\vphantom{Q}\sffamily] (Innen) {Eins \nodepart{two} Zwei};
    \end{tikzpicture}};
    \node[draw, inner sep=1ex, right=of Aussen] (Drei) {Drei};
    \draw (Aussen) -- (Drei);
    \draw[dashed] (Innen.one east) -- (Drei);
    \draw[dashed] (Innen.two east) -- (Drei);
  \end{tikzpicture}
\end{document}

Ausgabe der verschachtelten TikZ-Bilder

Permanenter link

beantwortet 05 Aug '13, 19:06

Felix's gravatar image

Felix
1.3k525667
Akzeptiert-Rate: 47%

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×731
×76

gestellte Frage: 05 Aug '13, 19:03

Frage wurde gesehen: 24,659 Mal

zuletzt geändert: 25 Aug '13, 13:32