PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mehrere Objekte mit Rahmen drum



Joerka
19-05-2010, 07:24
Guten Morgen zusammen,

ich brauche eine elegante Lösung für folgendes Problem: Ich habe verschiedene Objekte - bspw. einen Graphen und ein Textobjekt -, die ich beide in gewisser Weise (nebeneinander, übereinander) anordnen und in einem gemeinsamen Rahmen abbilden möchte.

Folgende Lösung mit TikZ gefiel mir nie wirklich, weil ich IN EINEM NODE erneut eine TikZ-UMGEBUNG ÖFFNE (was sagt der LaTeX-Knigge dazu?):


\documentclass{scrbook}
\usepackage{tikz}
\usetikzlibrary{positioning}

% Damit die Box (steht in erster Zeile) nicht eingerückt wird:
\setlength{\parindent}{0pt}

% Breite der umschließenden Box ( wird auf die beiden inneren Boxen aufgeteilt)
\newlength{\Seitenbreite}
\setlength{\Seitenbreite}{\textwidth}
\addtolength{\Seitenbreite}{-10mm}


\begin{document}

\begin{tikzpicture}

% Umschließende Box: DER RAHMEN
\node [draw,outer sep=0,inner sep=0]
{
\begin{tikzpicture}[node distance=0]

% Linke innere Box: OBJEKT 1
\node [anchor=north east, outer sep=0,inner sep=2mm,text width=0.6\Seitenbreite] (A) at (0,0)
{Linke Box... \hfill ...bis hier!};

% Rechte innere Box: OBJEKT 2
\node [anchor=north east, outer sep=0,inner sep=2mm,text width=0.4\Seitenbreite,right = of A]
{Rechte Box...*\hfill ...bis hier!};

\end{tikzpicture}
};

\end{tikzpicture}

\end{document}


Sollte man als Objekte nicht nur Text, sondern auch Graphen verwenden, öffnet man quasi eine TikZ-Umgebung in einer TikZ-Umgebung, die in einer TikZ-Umgebung geöffnet wurde (siehe unten).

Das führt in den meisten Fällen zu Fehlermeldungen: Entfernt man bspw. unter "Linke Box" die Zeichen ;% vor node [below right], kommt es noch zu einer Overfull-Meldung. Entfernt man zusätzlich darunter die Zeichen ;% vor node [above left], wird die Grafik nicht mehr korrekt dargestellt.


\documentclass{scrbook}
\usepackage{tikz}
\usetikzlibrary{positioning}

% Damit die Box (steht in erster Zeile) nicht eingerückt wird:
\setlength{\parindent}{0pt}

% Breite der umschließenden Box ( wird auf die beiden inneren Boxen aufgeteilt)
\newlength{\Seitenbreite}
\setlength{\Seitenbreite}{\textwidth}
\addtolength{\Seitenbreite}{-10mm}


\begin{document}


\begin{tikzpicture}

% Umschließende Box: DER RAHMEN
\node [draw,outer sep=0,inner sep=0]
{
\begin{tikzpicture}[node distance=0]

% Linke innere Box: OBJEKT 1
\node [anchor=north east, outer sep=0,inner sep=2mm,text width=0.6\Seitenbreite] (A) at (0,0)
{
\begin{tikzpicture}
\draw[->] (0,0) -- (6,0);% node [below right] {$x$};
\draw[->] (0,0) -- (0,5);% node [above left] {$y$};
\end{tikzpicture}
};

% Rechte innere Box: OBJEKT 2
\node [anchor=north east, outer sep=0,inner sep=2mm,text width=0.4\Seitenbreite,right = of A]
{
\begin{tikzpicture}
\draw[->] (4,5) -- (0,5);% node [above left] {$x$};
\draw[->] (4,5) -- (4,0);% node [below right] {$y$};
\end{tikzpicture}
};

\end{tikzpicture}
};

\end{tikzpicture}

\end{document}


Ich suche also nach einer eleganteren Möglichkeit, Objekte anordnen und einrahmen zu können (Rahmen möglichst über gesamte Textbreite).

Vielen Dank und einen frischen Start in den Tag!

bischi
19-05-2010, 09:08
fbox um ne minipage rum und dann alles in die Minipage reinwerfen, dass du drinhaben willst (inklusive weitere Minipages falls nötig :D).

MfG Bischi

Joerka
19-05-2010, 11:26
Wie jetzt? Ne schnöde fbox ohne Schatten und diese ganzen anderen sinnvollen Effekte ;)

Hatte gehofft, dass einer kommt: Ist in TikZ doch ganz billig: so und so geht's (bspw. über ne Matrix oder was weiß ich)... :D

Na gut, nehm ich halt die fbox. Bliebe nur meine Frage: Geziemt es sich überhaupt, in einem Node wieder eine TikZ-Umgebung zu öffnen (brauch ich auch für andere Sachen)? Man sieht ja an meinem Beispiel, dass das irgendwann Probleme gibt...

bischi
19-05-2010, 12:42
Wie jetzt? Ne schnöde fbox ohne Schatten und diese ganzen anderen sinnvollen Effekte ;)

Das war doch deine Frage - oder? ;)


ich brauche eine elegante Lösung für folgendes Problem: Ich habe verschiedene Objekte - bspw. einen Graphen und ein Textobjekt -, die ich beide in gewisser Weise (nebeneinander, übereinander) anordnen und in einem gemeinsamen Rahmen abbilden möchte.

Du könntest natürlich auch ne spezielle box (ich glaub es gibt ne shading-box oder so die funktioniert wie ne fbox) benützen :D

MfG Bischi

esdd
17-06-2010, 15:17
Hallo,

in Deinem Code übernehmen die Noden mit den Koordinatenbeschriftungen x und y jeweils die Angaben für text width von der "übergeordneten" Node, was zu den von Dir beschriebenen Effekten führt. Sichtbar wird das, wenn Du bei Dir einfach allen Noden die Option draw verpasst.

Hier sind zwei Vorschläge, die den Koordinatenbeschriftungen ihre "normale" Breite lassen:


\documentclass{scrartcl}

\usepackage{tikz}
\usetikzlibrary{positioning}
\newcommand\rlinie{0.75pt}% hier wird Breite der Rahmenlinie vorgegeben

% Breite der umschließenden Box ( wird auf die beiden inneren Boxen aufgeteilt)
\newlength{\Seitenbreite}
\setlength{\Seitenbreite}{\textwidth}
\addtolength{\Seitenbreite}{-\rlinie}

\tikzset{rahmen/.style={draw,outer sep=0pt,inner sep=0pt,line width=\rlinie,minimum width=\Seitenbreite}}

\begin{document}

\noindent%
\begin{tikzpicture}
\node[rahmen]{% Umschließende Box: DER RAHMEN
\begin{tikzpicture}[node distance=0,every node/.style={outer sep=0pt,inner sep=2mm}]
\node [minimum width=0.6\Seitenbreite] (A) at (0,0){% Linke innere Box: OBJEKT 1
\begin{tikzpicture}
\draw[->] (0,0) -- (6,0)node [below right,minimum width=0pt] {$x$};
\draw[->] (0,0) -- (0,5)node [above left,minimum width=0pt] {$y$};
\end{tikzpicture}
};
\node [right = of A,minimum width=0.4\Seitenbreite]{% Rechte innere Box: OBJEKT 2
\begin{tikzpicture}
\draw[->] (4,5) -- (0,5)node [above left,minimum width=0pt] {$x$};
\draw[->] (4,5) -- (4,0)node [below right,minimum width=0pt] {$y$};
\end{tikzpicture}
};
\end{tikzpicture}
};
\end{tikzpicture}

\vspace{0.5cm}

\noindent%
\begin{tikzpicture}
\node[rahmen]{% Umschließende Box: DER RAHMEN
\begin{tikzpicture}[node distance=0,every node/.style={outer sep=0pt,inner sep=2mm,minimum width=0pt}]
\node [minimum width=0.6\Seitenbreite] (A) at (0,0){% Linke innere Box: OBJEKT 1
\begin{tikzpicture}
\draw[->] (0,0) -- (6,0)node [below right] {$x$};
\draw[->] (0,0) -- (0,5)node [above left] {$y$};
\end{tikzpicture}
};
\node [right = of A,minimum width=0.4\Seitenbreite]{% Rechte innere Box: OBJEKT 2
\begin{tikzpicture}
\draw[->] (4,5) -- (0,5)node [above left] {$x$};
\draw[->] (4,5) -- (4,0)node [below right] {$y$};
\end{tikzpicture}
};
\end{tikzpicture}
};
\end{tikzpicture}

\end{document}


Wenn Du die tikzlibrary fit verwendest, dann kannst Du Dir außerdem die äußerste TikZ-Umgebung sparen.



\documentclass{scrartcl}

\usepackage{tikz}
\usetikzlibrary{positioning,fit}
\newcommand\rlinie{0.75pt}% hier wird Breite der Rahmenlinie vorgegeben

% Breite der umschließenden Box ( wird auf die beiden inneren Boxen aufgeteilt)
\newlength{\Seitenbreite}
\setlength{\Seitenbreite}{\textwidth}
\addtolength{\Seitenbreite}{-\rlinie}

\tikzset{rahmen/.style={draw,outer sep=0pt,inner sep=0pt,line width=\rlinie,minimum width=\Seitenbreite}}

\begin{document}

\noindent%
\begin{tikzpicture}[node distance=0,every node/.style={outer sep=0pt,inner sep=2mm,minimum width=0pt}]
\node [minimum width=0.6\Seitenbreite] (A) at (0,0){% Linke innere Box: OBJEKT 1
\begin{tikzpicture}
\draw[->] (0,0) -- (6,0)node [below right] {$x$};
\draw[->] (0,0) -- (0,5)node [above left] {$y$};
\end{tikzpicture}
};
\node [right = of A,minimum width=0.4\Seitenbreite](B){% Rechte innere Box: OBJEKT 2
\begin{tikzpicture}
\draw[->] (4,5) -- (0,5)node [above left] {$x$};
\draw[->] (4,5) -- (4,0)node [below right] {$y$};
\end{tikzpicture}
};
\node [rahmen,fit=(A) (B)]{};
\end{tikzpicture}

\end{document}

Gruß
Elke