3
1

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

Code, hier editierbar zum Übersetzen:
\documentclass{article}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\node (Aussen) {
\node{Innen};
};
\end{tikzpicture}
\end{document}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Jedoch erhalte ich den Fehler:

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

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.4k163148

(\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

Code, hier editierbar zum Übersetzen:
\documentclass[tikz,convert=false]{standalone}
\begin{document}
\begin{tikzpicture}[nodes=draw]
\node (Aussen) {
\tikz\node{Innen};
};
\end{tikzpicture}
\end{document}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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):

Code, hier editierbar zum Übersetzen:
\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}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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:

Code, hier editierbar zum Übersetzen:
\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}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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:

Code, hier editierbar zum Übersetzen:
\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}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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.

Code, hier editierbar zum Übersetzen:
\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}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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.

Code, hier editierbar zum Übersetzen:
\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}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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 ausblenden]

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

Frage-Themen:

×731
×76

gestellte Frage: 05 Aug '13, 19:03

Frage wurde gesehen: 24,812 Mal

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

Willkommen, erstes Mal hier? Schau mal unter FAQ!

×