Seite 1 von 2
TikZ: Probleme mit Positionierung einer Grafik
Verfasst: So 16. Jan 2011, 13:37
von SenZe
Hallo liebes Forum,
Dies ist zwar mein erster Beitrag, aber ich habe schon etwas länger hier mitgelesen.
Ich bin ein Anfänger in LaTeX und benutze LyX 1.6.8 unter Windows 7 und MikTeX.
Nun zu meinem Problem: Ich habe ein paar eigene commands definiert, in denen eine tikz-Grafik generiert wird. Diese möchte ich dann so flexibel wie möglich aufrufen können.
Hier ein Minimalbeispiel:
\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand\meinCommand
{
\tikz{
\newcommand\radiusK{0.6}
\draw (0,0) circle (\radiusK) node [midway]{A};
}
}
\begin{document}
\begin{tikzpicture}
\draw[help lines] (-4,-4)grid(8,2);
\node[inner sep=0pt](P1) at (0,0){\meinCommand};
\node[inner sep=0pt](P2) at (3,0){ \meinCommand };
\draw[->](P1)--(P2);
\end{tikzpicture}
\end{document}
So weit, so gut, die Positionierung funktioniert super, man sieht deutlich dass die "A"'s genau auf den Mittelpunkten der definierten Nodes liegen.
Jetzt möchte ich die Grafik erweitern, und zwar so, dass ihr Mittelpunkt nicht mehr im Kreis um das "A" liegt:
\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand\meinCommand
{
\tikz{
\newcommand\radiusK{0.6}
\draw (0,0) circle (\radiusK) node [midway]{A};
}
}
\newcommand\newCommand
{
\tikz{
%radius=0.6
\newcommand\radiusK{0.6}
%länge Oberlinie=3*radius
\newcommand\Strichlaenge{2.5} %multiplikator für radius!
\draw(0,0)circle(\radiusK)node[midway]{B};
\draw[very thick](0,\radiusK)--(0,\Strichlaenge*\radiusK);
}
}
\begin{document}
\begin{tikzpicture}
\draw[help lines] (-4,-4)grid(8,2);
\node[inner sep=0pt](P1) at (0,0){\meinCommand};
\node[inner sep=0pt](P2) at (3,0){\newCommand};
\draw[->](P1)--(P2);
\end{tikzpicture}
\end{document}
Hier sieht man nun, dass für die Position der Grafik nicht mehr der Punkt der Node (3,0) genommen wird, sondern ein anderer Punkt, der dadurch zustande kommt, dass der circle in newCommand nicht mehr um den Mittelpunkt der Grafik verläuft.
Wie kann ich das verhindern, sodass "B" wieder auf dem richtigen Punkt liegt?
Danke schonmal im Voraus!
Grüße, SenZe
Verfasst: Di 18. Jan 2011, 14:26
von SenZe
Noch als Ergänzung: Ich nutze pdflatex.
Verfasst: Di 18. Jan 2011, 18:41
von esdd
Hallo,
mit der Option yshift=0.75*0.6cm könntest Du zwar die Node P2 einfach so nach oben schieben, dass B an der richtigen Stelle liegt, musst dann aber auch die Koordinatenangabe für den Pfeil ändern.
\documentclass{scrartcl}
\usepackage{tikz}
\newcommand\meinCommand{%
\tikz{%
\newcommand\radiusK{0.6}
\draw (0,0) circle (\radiusK) node [midway]{A};}}
\newcommand\newCommand{%
\tikz{%
\newcommand\radiusK{0.6}
\newcommand\Strichlaenge{2.5}
\draw(0,0)circle(\radiusK)node[midway]{B};
\draw[very thick](0,\radiusK)--(0,\Strichlaenge*\radiusK);}}
\begin{document}
\begin{tikzpicture}
\draw[help lines] (-4,-4)grid(8,2);
\node[inner sep=0pt](P1) at (0,0){\meinCommand};
\node[inner sep=0pt,yshift=0.75*0.6cm](P2) at (3,0){\newCommand};
% (2.5-1):2=0.75
\draw[->](P1)--(P1-|P2.west);
\end{tikzpicture}
\end{document}
Ein anderer Vorschlag wäre
\documentclass{scrartcl}
\usepackage{tikz}
\newcommand\meinCommand[3][0.6]{%
\node[minimum width=2*#1cm,circle,draw](#2)at(#3){A};}
%\meinCommand[radius]{Nodenbezeichnung}{x,y}
\newcommand\newCommand[4][0.6]{%
\node[minimum width=2*#1cm,circle,draw](#2)at(#3){B};
\draw[very thick](#2)--+(0,#4*#1);}
%\newCommand[radius]{Nodenbezeichnung}{x,y}{Faktor}
\begin{document}
\begin{tikzpicture}
\draw[help lines] (-4,-4)grid(8,2);
\meinCommand{P1}{0,0}
\newCommand{P2}{3,0}{2.5}
\draw[->](P1)--(P2);
\end{tikzpicture}
\end{document}
Gruß
Elke
Verfasst: Di 18. Jan 2011, 20:29
von SenZe
Hallo Elke,
vielen Dank für deine Antwort. Hat mir sehr geholfen! Habe mich nun für den zweiten Vorschlag entschieden, da die eigenen Commands nun viel einfacher einzusetzen sind.
Nun möchte ich einen einfachen Befehl der Form
\connectNodes{nodebezeichnung1}{nodebezeichnung2}
erstellen. Dieser soll, wie der Name schon sagt, zwei Nodes so verbinden, als würde ich
ausführen. Allerdings möchte bzw. brauche ich hierfür einen eigenen Befehl, da die Verbindung eine Doppellinie mit einer gestrichelten und einer durchgezogenen Linie sein soll.
Wie mache ich das am klügsten, sodass das auch um Ecken herum einwandfrei funktioniert? Schau dir am besten mal mein Minimalbeispiel an, dann erkennst du schnell die Schwächen meines Versuchs:
\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand\meinCommand[3][0.6]{%
\node[minimum width=2*#1cm,circle,draw](#2)at(#3){A};}
%\meinCommand[radius]{Nodenbezeichnung}{x,y}
\newcommand\drawConnection[2]
{
%arg1: from
%arg2: to
\draw($(#1)+(0, 0.5mm)$) -| ($(#2)+( 0.5mm,0)$);
\draw[dashed] ($(#1)+(0,-0.5mm)$) -| ($(#2)+(-0.5mm,0)$);
}
\begin{document}
\begin{tikzpicture}
\draw[help lines] (-4,-4)grid(8,2);
\meinCommand{P1}{0,0}
\meinCommand{P2}{3,-3}
\meinCommand{P3}{6,-3}
\meinCommand{P4}{6,0}
\meinCommand{P5}{8,3}
%funktioniert gut:
\drawConnection{P1.east}{P2.north};
%funktioniert schlecht:
\drawConnection{P2.east}{P3.west}
%funktioniert schlecht:
\drawConnection{P3.north}{P4.south}
%auch nicht das Gelbe vom Ei:
\drawConnection{P4.north}{P5.south}
\end{tikzpicture}
\end{document}
Danke schonmal im Voraus für die Mühe!
Grüße
Verfasst: Mi 19. Jan 2011, 10:17
von esdd
Hallo,
hier ein Vorschlag, bei dem ich davon ausgegangen bin, dass alle Noden gleich groß sind:
\documentclass{scrartcl}
\usepackage{tikz}
\usetikzlibrary{calc}
\newcommand\meinCommand[3][0.6]{%
\node[minimum width=2*#1cm,circle,draw](#2)at(#3){A};}
%\meinCommand[radius]{Nodenbezeichnung}{x,y}
\newcommand\drawConnection[6][5]{%
\draw let \n1={#3+#1}, \n2={#6-#1} in (#2.\n1)#4(#5.\n2);
\draw[dashed] let \n1={#3-#1}, \n2={#6+#1} in (#2.\n1)#4(#5.\n2);}
%\drawConnection[Gradverschiebung]{Node1}{Grad1}{Verbindung}{Node2}{Grad2}
%Vertauschung der Noden fuehrt zu Vertauschung der Linien
\begin{document}
\begin{tikzpicture}
\draw[help lines] (-4,-4)grid(8,2);
%
\meinCommand{P1}{0,0}
\meinCommand{P2}{3,-3}
\meinCommand{P3}{6,-3}
\meinCommand{P4}{6,0}
\meinCommand{P5}{8,3}
%
\drawConnection{P1}{0}{-|}{P2}{90}
\drawConnection{P2}{0}{--}{P3}{180}
\drawConnection{P4}{270}{--}{P3}{90}
\drawConnection{P5}{180}{-|}{P4}{90}
\end{tikzpicture}
\end{document}
Gruß
Elke
Verfasst: Mi 19. Jan 2011, 12:51
von SenZe
Hallo Elke,
Danke, das funktioniert super!
Könntest du mir bitte noch kurz den Befehl
\newcommand\drawConnection[6][5]{%
\draw let \n1={#3+#1}, \n2={#6-#1} in (#2.\n1)#4(#5.\n2);
\draw[dashed] let \n1={#3-#1}, \n2={#6+#1} in (#2.\n1)#4(#5.\n2);}
%\drawConnection[Gradverschiebung]{Node1}{Grad1}{Verbindung}{Node2}{Grad2}
%Vertauschung der Noden fuehrt zu Vertauschung der Linien
erklären?
Meine Fragen dazu:
Was bedeutet bei dir das Argument Gradverschiebung? Ist das der Platz zwischen den beiden Linien?
Was sind diese \n1 und \n2, die du definierst, und was bedeutet die Struktur, in der du diese anwendest? (Ich meine hier insbesondere den Teil
... in (#2.\n1)#4(#5.\n2)
.
Nochmals vielen Dank!
Viele Grüße
Verfasst: Mi 19. Jan 2011, 14:04
von esdd
Hallo,
die Zahlen nach den Punkten bei den Noden sind die entsprechenden Gradangaben: (P1.0) ist also das gleiche wie (P1.east), (P2.90) wie (P2.north) und so weiter.
Die Verschiebung der Linien erreiche ich, in dem ich die "Gradverschiebung" (hier 5) zu der vorgegebenen Gradzahl dazuaddiere oder von ihr abziehe. Die erste durchgezogene Linie geht also von (P1.5) nach (P2.85) und die zugehörige gestrichelte von (P1.-5) nach (P2.95).
Der Abstand zwischen beiden Linien ist gleich dem Doppelten von Nodenradius*sin(Gradverschiebung), in dem Fall also das Doppelte von 0.6*sin5°
Gruß
Elke
Verfasst: Mi 19. Jan 2011, 17:51
von SenZe
Ah, ich verstehe, danke.
Wüsstest du, wie man die drawConnection-Funktion möglichst einfach so anpassen kann, dass man optional noch einen dritten Punkt (oder, wenn einfach realisierbar, auch mehrere) übergeben kann, der ein "Zwischenpunkt" der zu zeichnenden Verbindung ist? Ich meine dass so, dass die gezeichnete Verbindung dann vom Startpunkt über den Zwischenpunkt/die Zwischenpunkte zum Endpunkt verläuft.
Fällt dir da was ein?
Danke schonmal!
Viele Grüße
Verfasst: Mi 19. Jan 2011, 18:31
von iTob
Sag mal könnte es sein, dass alles was du willst als Kette (=chain) ohnehin schon in TikZ vorgesehen ist? Hast du mal das Handbuch gelesen – wenigstens den Abschnitt und das Tutorial (zu Beginn) über chains?
Das nur so als Randbemerkung, bevor du dir hier ewig einen abbrichst eigene Befehle zu basteln (basteln zu lassen) …
PS: „Rückfrage“ meint, dass die Antwortenden eine Rückfrage haben, nicht dass der Fragensteller noch eine weitere Frage anhängt.
Verfasst: Mi 19. Jan 2011, 20:46
von SenZe
Okay, das mit dem Status habe ich falsch verstanden, Entschuldigung dafür. Ich nehme an, "offen" wäre dann passender.
Ich habe immer mal wieder im TikZ-Handbuch gelesen, ja, der Begriff Chains ist mir dabei auch ab und zu untergekommen. Als LaTeX-Anfänger, der kaum einen Überblick über das wirklich mächtige TikZ hat und überhaupt nicht weiß, wonach er suchen soll, ist es dann aber doch relativ schwer, solche Probleme zu lösen.
Daher hoffe ich, dass mir dabei auch weiter so super geholfen wird wie bisher
