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, 13:03

Felix's gravatar image

Felix
1.3k225366
Akzeptiert: 89%

bearbeitet 25 Aug '13, 07:32

stefan's gravatar image

stefan ♦♦
5.8k12234

(\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, 13: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, 13:41

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k1415

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, 13:06

Felix's gravatar image

Felix
1.3k225366

Deine Antwort auf die Frage (nicht auf andere Antworten)
Knebel-Vorschau

Folge dieser Frage

Per E-Mail:

Wenn Du Dich anmeldest, kannst Du Updates hier abonnieren

Per RSS:

Antworten

Antworten und Kommentare

Aktuelle Buch-Infos

LaTeX Cookbook

LaTeX Beginners Guide

Limitierter Rabatt ebook
50% Coupon code tDRet6Y

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üge einfach zwei Leerzeichen an die Stelle ein, an der die neue Zeile sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Zugeordnete Themen:

×492
×51

Frage gestellt: 05 Aug '13, 13:03

Frage wurde angeschaut: 7,588 Mal

Zuletzt aktualisiert: 25 Aug '13, 07:32