%2C%20als%20ob%20es%20ein%20Knoten%20w%C3%A4re.png)
Ich bin verwirrt über Tikz-Bilder. Ich kann sie problemlos frei definieren und sogar Koordinaten hinzufügen, die durch Namensvererbung verfügbar sind, wie (-A)
beispielsweise in \pic (S) at (0,0) {myPic}; \draw (S-A) -- ++(0,0);
. Dies ist alles auf Seite 255 des PGF-Handbuchs dokumentiert.
Ich verstehe jedoch nicht, warum es nicht möglich ist, einem Bild wie dem oben gezeigten einen Namen zu geben, wenn darin keine Koordinate definiert ist. Standardmäßig wäre es toll, wenn es sich wie ein normaler Knoten verhalten könnte.
MWE:
\documentclass{minimal}
\usepackage{tikz}
\tikzset{
myBlock/.pic = {
\node[draw,minimum width=1cm,minimum height=0.5cm] at (0,0) {};
},
myBlockNamed/.pic = {
\node[draw,minimum height=1cm,minimum width=0.5cm] (-m) at (0,0) {};
},
}
\begin{document}
\begin{tikzpicture}
\pic () at (0,0) {myBock}; % can't give it a name
\pic (S) at (3,0) {myBlockNamed}; % can give it a name
\draw (S-A) -- ++(2,0);
\end{tikzpicture}
\end{document}
Der zugrunde liegende Punkt ist, dass ich an einer Kontrollblockbibliothek arbeite (damit wir den Chat unten mit @Alenanno beenden können). Hier ist beispielsweise die Definition eines mathematischen Operators
\tikzset{
mySum background/.style = {
circle, minimum size=1.5em, fill=white,
},
mySum edge/.style = {
draw=black, circle, minimum size=1.5em, line width=.5pt,
},
pics/bOp/.style = {
code = {
\node [mySum background] {};
\foreach \t [count=\i] in {#1}{
\pgfmathsetmacro{\angle}{\i*90}
\node[anchor=center, font=\tiny] at (\angle:0.45em) {$\t$};
}
\node [mySum edge] {};
},
},
}
Antwort1
Es gibt einen Trick, der unter bestimmten Umständen verwendet werden kann und der die Tatsache ausnutzt, dass ein pic
in ein eingefügt wird scope
, das mit dem Schlüssel benannt werden kann local bounding box
. Beachten Sie, dass dies in Bäumen oder Diagrammen nicht funktioniert.
\documentclass[tikz,border=5]{standalone}
\tikzset{pics/.cd,
pic a/.style={code={
\node [fill=red!20, shape=circle] {A};
}}
}
\begin{document}
\begin{tikzpicture}
\pic [local bounding box=A1] at (0,0) {pic a};
\pic [local bounding box=A2] at (3,0) {pic a};
\foreach \i in {0,15,...,345}{
\draw [red, ->] (\i:1) -- (A1);
\draw [blue, ->] (3,0)++(\i:1) -- (A2);
}
\end{tikzpicture}
\end{document}
Es ist auch möglich, den gegebenen Namen zu verwenden, pic
indem ein „Wrapper“-Schlüssel definiert wird, der dem Code explizit einen Bereich hinzufügt:
\documentclass[tikz,border=5]{standalone}
\usetikzlibrary{fit}%
\makeatletter
\tikzset{pics/named scope code/.style={code={\tikz@fig@mustbenamed%
\begin{scope}[local bounding box/.expanded=\tikz@fig@name]#1\end{scope}%
}}}
\makeatother
\tikzset{pics/.cd,
pic a/.style={named scope code={
\node [fill=red!20, shape=circle] {A};
}}
}
\begin{document}
\begin{tikzpicture}
\pic (A1) at (0,0) {pic a};
\pic (A2) at (3,0) {pic a};
\foreach \i in {0,15,...,345}{
\draw [red, ->] (\i:1) -- (A1);
\draw [blue, ->] (3,0)++(\i:1) -- (A2);
}
\end{tikzpicture}
\end{document}
Das Ergebnis ist das gleiche wie zuvor.
Antwort2
Von demPgf-Handbuch (Version 3.0.0), Seite 252:
Im Gegensatz zu Knoten können Bilder später nicht referenziert werden. Sie können Knoten referenzieren, die sich innerhalb eines Bildes befinden, aber nicht „das Bild selbst“. Insbesondere können Sie keine Linien zwischen Bildern zeichnen, so wie Sie sie zwischen Knoten zeichnen können. Generell gilt: Immer wenn es Sinn macht, dass eine Zeichnung möglicherweise mit anderen knotenähnlichen Dingen verbunden werden könnte, ist ein Knoten besser als ein Bild.
Wenn Bilder verwendet werden, um die volle Leistung eines Knotens zu emulieren (was prinzipiell möglich ist), dauert deren Erstellung länger und sie beanspruchen mehr Speicher als ein Knoten, der denselben Effekt erzielt.
Wenn Sie also etwas tun, was ein Knoten gut kann, und es keinen besonderen Grund für die Verwendung gibt pic
, ist es besser, einen Knoten zu verwenden. In der Antwort auf die Frage " gibt es einen Workaround"So geben Sie \pic einen Namen", aber genau das ist es, ein Workaround.
Wenn Sie jedoch Knoten um einen anderen Knoten herum positionieren möchten, können Sie diese Frage überprüfen, die ich vor einiger Zeit gestellt habe (Wie positioniere ich Knoten um einen anderen Knoten in TiKZ?) oder Sie verwenden ein Tikz foreach mit einem regulären Knoten.
Aktualisierte Antwort
Nachdem ich nun weiß, was Sie brauchen, hier eine Lösung mit Tikz. Der neue Befehl \mySumn
(Sie können ihn umbenennen) nimmt zwei Argumente an, wie \mySumn{#1}{#2}
, wobei #1
der Name des Knotens und #2
die Position ist.
Ich habe versucht, ein optionales Argument hinzuzufügen, above of
aber es ist mir nicht gelungen. Sie können mit diesem Code jedoch dasselbe tun, allerdings auf eine andere Weise. Beachten Sie Folgendes:
\mySumn{p1}{0,0};
\mySumn{p2}{$(p1.north east)+(1em,1em)$};
Es wird ein Knoten p1
bei den Koordinaten platziert (0,0)
und dann wird ein weiterer Knoten p2
im Nordosten von p1 +1em auf der x- und der y-Achse (diagonal oben rechts) platziert.
Natürlich können Sie weiterhin Kanten von einem Knoten zum anderen zeichnen.
Ausgabe
Code
\documentclass[margin=10pt]{standalone}
\usepackage{tikz}
\usepackage{xparse}
\usetikzlibrary{calc,arrows.meta,positioning}
\tikzset{
mySumbk/.style = {
draw, circle, minimum size=1.5em, fill=white,
},
}
\newcommand{\mySumn}[2]{
\node[mySumbk,fill=white] (#1) at (#2) {};
\foreach \angle/\maop in {
90/+,
180/-
}{
\node[anchor=center, font=\tiny] at ($(#1)+(\angle:.45em)$) {$\maop$};
}}
\begin{document}
\begin{tikzpicture}[>=latex]
\mySumn{p1}{0,0};
\mySumn{p2}{$(p1.north east)+(1em,1em)$};
\draw (p1) -- (3,0);
\draw (p1) edge[out=90,in=180] (p2);
\end{tikzpicture}
\end{document}
Antwort3
Alte Frage, aber ich war mit der local bounding box
Lösung nicht zufrieden, da ich keine Möglichkeit fand, sie besser zu kontrollieren (z. B. den Abstand zum inneren Inhalt).
pic
Meine Lösung bestand darin, ein verschachteltes Bild in zusammen mit der Option zu verwenden remember picture
. Die Namen werden kaskadierend als Argumente übergeben. Damit können Sie nicht nur auf den pic
als Knoten verweisen (weil es tatsächlich ein Knoten ist), sondern auch auf seinen Inhalt.
Ein weiterer Punkt ist, dass bei dieser Lösung der Inhalt pic
immer zentralisiert ist, was auch das war, wonach ich bei der Arbeit an diesem Code gesucht habe.
Sei vorsichtig:
- Sie müssen das Dokument zweimal kompilieren, weil
remember picture
. - verschachtelte Knoten können aufgrund der Vererbung schwierig sein.
Hier ist der Code:
\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}[remember picture]
\tikzset{
mine/.pic={
\node[draw](#1){
\begin{tikzpicture}[remember picture]
\node[draw](#1-1){#1-1};
\node[draw, right=of #1-1](#1-2){#1-2};
\end{tikzpicture}
};
},
}
\pic{mine=a};
\pic[right=of a]{mine=b};
\draw[thick, blue, <->](a-1)to[out=90, in=90](b-1);
\draw[thick, blue, <->](a-2)to[out=-90, in=-90](b-2);
\draw[thick, red](a)to(b);
\end{tikzpicture}
\end{document}
Antwort4
Es scheint, dass wenn ich für meinen Operator einen Befehl wie folgt definiere:
\tikzset{
mySum background/.style = {
circle, minimum size=1.5em, fill=white,
},
mySum edge/.style = {
draw=black, circle, minimum size=1.5em, line width=.5pt,
},
}
\newcommand{\bOp}[1]{
\tikz[outer sep=0pt]{
\node [mySum background] {};
\foreach \t [count=\i] in {#1}{
\pgfmathsetmacro{\angle}{\i*90}
\node[anchor=center, font=\tiny] at (\angle:0.45em) {$\t$};
}
\node [mySum edge] {};
}
}
Es ist dann möglich, einen Knoten zu erstellen, der ein gefälschtes Bild enthält, da das oben genannte genau das ist, was man zum Definieren eines Bildes verwenden würde.
\node (1) at (0,0) {\bOp{+,-,,}};
\draw (4,0) -- (1);