![Tikz: Die Position eines Etiketts ändert sich schrittweise und nicht kontinuierlich](https://rvso.com/image/400373/Tikz%3A%20Die%20Position%20eines%20Etiketts%20%C3%A4ndert%20sich%20schrittweise%20und%20nicht%20kontinuierlich.png)
Betrachten Sie das folgende MEW. Ich verstehe nicht, warum sich die Position des Etiketts von i2 schrittweise und nicht kontinuierlich ändert. Mit 178-180 bekomme ich
Mit 175-177 bekomme ich
Der erste ist zu niedrig, der zweite zu hoch... Ist es ein Fehler meinerseits oder eine Schwäche des Systems?
\documentclass{article}
\usepackage{tkz-euclide}
\usetkzobj{all}
\usetikzlibrary{calc,patterns,angles,quotes,intersections}
\begin{document}
\noindent\hrulefill
\begin{center}
\begin{tikzpicture}[scale=0.5,
dot/.style 2 args={circle,inner sep=1pt,fill,label={#2},name=#1},
dot2/.style 2 args={circle,inner sep=.6pt,draw=black, fill=white,label={#2},name=#1},
dot3/.style 2 args={circle,inner sep=.8pt,draw=black, fill=white,label={#2},name=#1},
extended line/.style={shorten >=-#1,shorten <=-#1},
extended line/.default=1cm]
\draw[help lines,step=1] (-1,-1) grid (10,6);
\draw [->] (-1,0) -- (10,0) node [below left] {$x$};
\draw [->] (0,-1) -- (0,6) node [below left] {$y$};
\node [dot={p1}{[below=1.5mm]$p_1$}] at (3,1) {};
\node [dot={p2}{[above right]$p_2$}] at (8,0) {};
\node [dot={p3}{[above=1mm]$p_3$}] at (3.5,2.5) {};
\node [dot={p4}{[above right]$p_4$}] at (6,3) {};
\coordinate (i1) at (intersection of p1--p2 and p3--p4);
\coordinate (i2) at (intersection of p1--p3 and p2--p4);
\draw [extended line=0.3cm] (p2) -- (i1) ;
\draw [extended line=0.3cm] (p2) -- (i2) ;
\draw [extended line=0.3cm] (p4) -- (i1) ;
\draw [extended line=0.3cm] (p1) -- (i2) ;
\draw [thick] (p1) -- (p2);
\draw [thick] (p2) -- (p4);
\draw [thick] (p3) -- (p4);
\draw [thick] (p3) -- (p1);
\draw [very thick,extended line=0.3cm] (i1) -- (i2) ;
\coordinate (i3) at (intersection of p2--p3 and i1--i2);
\coordinate (o) at (intersection of p2--p3 and p1--p4);
\coordinate (i4) at (intersection of i1--o and p2--p4);
\coordinate (i5) at (intersection of i2--o and p1--p2);
\coordinate (i6) at (intersection of i1--o and p1--p3);
\coordinate (i7) at (intersection of i2--o and p3--p4);
\draw [very thin,extended line=0.3cm] (p1) -- (p4) ;
\draw [very thin,extended line=0.3cm] (p2) -- (i3) ;
\draw [very thin,extended line=0.3cm] (i1) -- (i4) ;
\draw [very thin,extended line=0.3cm] (i2) -- (i5) ;
\node[dot2,label={}] at (o) {};
\node[dot2,label={}] at (i4) {};
\node[dot2,label={}] at (i5) {};
\node[dot2,label={}] at (i6) {};
\node[dot2,label={}] at (i7) {};
\node[dot3,label={[above]$i_1$}] at (i1) {};
\node[dot3,label={[label distance=0mm]176.0:$i_2$}] at (i2) {}; % <<<=====
\end{tikzpicture}
\end{center}
\noindent\hrulefill
\end{document}
Antwort1
Das von Ihnen festgestellte Verhalten ist ordnungsgemäß dokumentiert in derTikZ- und PGF-Handbuch, und zwar auf Seite 247 für Version 3.1.4b. Relevante Zitate:
- Der 〈Winkel〉 wird verwendet, um eine Position am Rand des Hauptknotens zu bestimmen. (...)
- Dann wird ein Ankerpunkt für den Beschriftungsknoten berechnet. Er wird so bestimmt, dass der
label node
vom Rand des „wegzeigt“main node
. (...) Für Winkel zwischen diesen „Hauptwinkeln“, beispielsweise 30° oder 110°, werden kombinierte Anker, beispielsweisesouth west
für 30° odersouth east
für 110° , verwendet. Für Winkel in der Nähe der Hauptwinkel (die bis zu 2° vom Hauptwinkel abweichen) wird jedoch der Anker für den Hauptwinkel verwendet. Daher hat eine Beschriftung an einem Randpunkt für 2° den Ankerwest
, während eine Beschriftung für 3° den Anker hatsouth west
, was zu einem „Sprung“ des Ankers führt. Sie können den Anker „von Hand“ mit deranchor
Taste oder indirekten Tasten wie setzenleft
.
Um eine präzise Positionierung zu erreichen, verwenden Sie entweder den in den Kommentaren gegebenen Vorschlag (wie \path (i2) ++(160:1.5em) node{$i_2$} ;
) oder wenden Sie das an, was im letzten zitierten Satz steht, indem Sie die anchor
Option verwenden, wie in
\node[label={[label distance=0mm, anchor=0] 180:$i_2$}] at (i2) {};
oder
\node[label={[label distance=0mm, anchor=357] 177:$i_2$}] at (i2) {};
Hier 177
entspricht das dem 〈Winkel〉 im obigen Zitat aus dem Handbuch und ist relativ zum leeren Knoten, der von erstellt wurde \node (...) at (i2) {};
(der Standardwert ist above
, also 90
), während das anchor=357
den Knoten betrifft, der von der label
Option erstellt wurde. Ich habe einen Unterschied von 180° zwischen ihnen gelassen, sodass sie einander gegenüberliegen. Hier ist die Ausgabe mit:
\node[label={[label distance=0mm, anchor=345] 165:$i_2$}] at (i2) {};
Um die Positionierung gut zu verstehen, schlage ich vor, so etwas zu versuchen:
\node[name=aaa, draw,
label={[draw, label distance=0mm, anchor=345] 165:$i_2$}]
at (i2) {};
\fill[red] (aaa.165) circle (1pt);
Auf diese Weise ist die Funktion, die den Winkel auf die Beschriftung abbildet, $i_2$
kontinuierlich (modulo der begrenzten Genauigkeit der Gleitkommadarstellung), aber wie in den Kommentaren erwähnt, kann man die Funktion noch regelmäßiger machen, indem man die circle
Form für beide Knoten verwendet:
\node[name=aaa, circle, draw,
label={[circle, draw, label distance=0mm, anchor=345] 165:$i_2$}]
at (i2) {};
\fill[red] (aaa.165) circle (1pt);
Hinweis: Die label distance
wird gemäß der durch 〈angle〉 in den Hauptknotenoptionen festgelegten Richtung verfolgt, nicht gemäß der anchor
in der label
Option angegebenen Richtung. Aus irgendeinem Grund, den ich nicht kenne, scheint es jedoch so, dass der Abstand zwischen den beiden Ankerpunkten derdoppeltdavon mit der label distance
Option angegeben:
\node[name=aaa, circle, draw,
label={[name=bbb, circle, draw, label distance=8mm, anchor=310] 270:$i_2$}]
at (i2) {};
\fill[red] (aaa.270) circle (1pt);
\fill[blue] (bbb.310) circle (1pt);
\draw[orange!35, <->] (aaa.270) -- node[right] {$d$} +(0,-16mm);
Antwort2
Zu lang für einen Kommentar.
Bei höheren Werten sind kontinuierliche Variationen zu erkennen label distance
.
\documentclass{article}
\usepackage{tkz-euclide}
\usetkzobj{all}
\usetikzlibrary{calc,patterns,angles,quotes,intersections}
\begin{document}
\begin{tikzpicture}[
dot3/.style 2 args={circle,inner sep=.8pt,fill=black,label={#2},name=#1},]
\coordinate (i2) at (0,0);
\draw[thin,gray] (i2) -- ++(178:105mm);
\draw[thin,gray] (i2) -- ++(179:105mm);
\draw[thin,gray] (i2) -- ++(180:105mm);
\node[dot3,label={[label distance=0mm]178.0:$i_2$}] at (i2) {}; % <<<=====
\node[dot3,label={[label distance=0mm]179.0:$i_2$}] at (i2) {}; % <<<=====
\node[dot3,label={[label distance=0mm]180.0:$i_2$}] at (i2) {}; % <<<=====
\node[dot3,label={[label distance=50mm,blue]178.0:$i_2$}] at (i2) {}; % <<<=====
\node[dot3,label={[label distance=50mm,blue]179.0:$i_2$}] at (i2) {}; % <<<=====
\node[dot3,label={[label distance=50mm,blue]180.0:$i_2$}] at (i2) {}; % <<<=====
\node[dot3,label={[label distance=100mm,red]178.0:$i_2$}] at (i2) {}; % <<<=====
\node[dot3,label={[label distance=100mm,red]179.0:$i_2$}] at (i2) {}; % <<<=====
\node[dot3,label={[label distance=100mm,red]180.0:$i_2$}] at (i2) {}; % <<<=====
\end{tikzpicture}
\end{document}