Ich wurde von golatex praktisch hierher geschickt, weil hier wohl so viel TikZ-Kompetenz versammelt ist :) ... Ich hoffe, ihr verzeiht mir, wenn ich meine Anfrage dort hier mehr oder weniger reinkopiere...

Folgendes ist mein Problem: Ich möchte gerne mit in meinem LaTeX-Dokument eine relativ komplexe Grafik darstellen, die wiederum selber Grafiken (TikZ-Bilder) enthalten soll, außerdem Pfeile, Beschriftungen, etc., siehe Abbildung, die Quadrate sind selbst TikZ-Grafiken.

so in etwa

Meine Idee der Umsetzung war nun, eine übergeordnete TikZ-Grafik zu erstellen, in denen ich dann Nodes positioniere, die dann per \input die jeweiligen untergeordneten TikZ-Dokumente enthalten.

Das funktioniert so weit erstmal auch, aber in den relativ positionierten untergeordneten Bildern verschieben sich die Nodes seltsamerweise... Dazu hab ich auch ein Minimalbeispiel:

main.tex:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary[positioning]
\begin{document}

\begin{tikzpicture}
  \node (1) {\input{line}};
  \node (2)[right=of 1]{\input{line}};
\end{tikzpicture}

\end{document}

line.tex:

\begin{tikzpicture}[point/.style={circle,inner sep=0pt,minimum size=5pt,fill=black}]
  \draw
(0,0) -- (0,4);
  \node [point,label=left:$A$] (A) at (0,2) {};
\end{tikzpicture}

Ergebnis

Zu bemerken ist, dass wenn ich die Nodes nicht relativ zueinander, sondern absolut positioniere, tritt das Problem nicht auf:

\draw (0,0) node {\input{line}};
\draw (2,0) node {\input{line}};

Warum ich die absolute Positionierung dennoch ausschließe, sollte auf der Hand liegen.

Vielleicht hat ja jemand eine Idee, woran das liegen könnte, für Hilfe wäre ich auf jeden Fall sehr dankbar. Den Artikel Wie kann ich tikz-nodes verschachteln? habe ich gelesen, allerdings verstehe ich da noch nicht, ob und wie ich etwa die \tikzBox in meinem Fall verwenden kann...

Natürlich bin ich auch offen für Vorschläge, wie ich die große Grafik auf anderem Wege erzeugen kann, die dieses Problem umgehen (oder die ohnehin viel geeigneter sind). Warum das Ergebnis oben so aussieht, wie es aussieht, daran wäre ich natürlich trotzdem interessiert :)

gefragt 21 Okt '13, 17:42

mOisen's gravatar image

mOisen
28113
Akzeptiert-Rate: 0%

bearbeitet 21 Okt '13, 18:45

cgnieder's gravatar image

cgnieder
22.1k243463


Das Problem bei dieser Verschachtelung liegt darin, dass die innere tikzpicture-Umgebung und dadurch auch der innere Node die äußeren Optionen erben. In diesem Fall wird right=of 1 vererbt.

Das sieht man, wenn man diese Option innen überschreibt. Wenn z.B. line.tex so aussieht

\begin{tikzpicture}[point/.style={circle,inner sep=0pt,minimum size=5pt,fill=black},right=0pt]
  \draw (0,0) -- (0,4);
  \node [point,label=left:$A$,right=-2.5pt] (A) at (0,2) {};
\end{tikzpicture}

dann wird die right-Option innen in jedem Fall überschrieben und die Teilbilder sehen gleich aus.

Ausgabe der Linien und Nodes

Eine Lösung ist das Packen des inneren Bildes in eine Box, die später mehrfach verwendet wird, ohne Neuberechnung mit Berücksichtung geerbter Optionen. Mit dem \tikzBox-Makro aus der verlinkten Antwort von Qrrbrbirlbel kann es so aussehen:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary[positioning]

\newbox\mybox
\newcommand{\tikzBox}[2][\mybox]{%
  \sbox#1{\pgfinterruptpicture#2\endpgfinterruptpicture}}

\begin{document}

\tikzBox{\input{line}}

\begin{tikzpicture}
  \node (1) {\usebox{\mybox}};
  \node (2)[right=of 1]{\usebox{\mybox}};
\end{tikzpicture}

\end{document}

Statt mehrfach \input zu verwenden, wird das zunächst einmal in die Box eingelesen und in Folge jeweils \usebox benutzt.

Was, wenn man mehrere solcher Teilbilder hat? Wenn sie nicht gemischt verwendet werden, sondern nacheinander, kann man die Box ja mit dem nächsten Teilbild belegen und mehrfach verwenden. Ansonsten kann man verschiedene Boxen mit jeweils verschiedenem Namen verwenden. Ggf. könnte man hierfür das Makro \tikzBox um ein Argument erweitern, das den Boxnamen festlegt, so dass jeweils eine Box dieses Namens mit dem übergebenen Inhalt erzeugt wird.

Permanenter link

beantwortet 21 Okt '13, 19:33

stefan's gravatar image

stefan ♦♦
18.1k143048
Akzeptiert-Rate: 48%

bearbeitet 21 Okt '13, 19:40

Tausend Dank!!! Das war eine super erklärte Antwort. Sogar, was meine nächste Frage gewesen wäre (mehrere Teilbilder...) wurde gleich mit erläutert. Und das so schnell... Ich bin restlos begeistert und bedanke mich noch einmal :)

(22 Okt '13, 11:43) mOisen
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:

×728
×76

gestellte Frage: 21 Okt '13, 17:42

Frage wurde gesehen: 12,777 Mal

zuletzt geändert: 22 Okt '13, 11:43