![Tikz: La posición de una etiqueta cambia paso a paso y no de forma continua](https://rvso.com/image/400373/Tikz%3A%20La%20posici%C3%B3n%20de%20una%20etiqueta%20cambia%20paso%20a%20paso%20y%20no%20de%20forma%20continua.png)
Considere el siguiente MEW. No entiendo por qué la posición de la etiqueta de i2 cambia paso a paso y no de forma continua. Con 178-180 obtengo
Con 175-177 me sale
El primero es demasiado bajo, el segundo demasiado alto... ¿Es un error mío o una debilidad del sistema?
\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}
Respuesta1
El comportamiento que encontró está debidamente documentado en elManual de TikZ y PGF, precisamente en la página 247 para la versión 3.1.4b. Citas relevantes:
- El 〈ángulo〉 se utiliza para determinar una posición en el borde del nodo principal. (...)
- Luego, se calcula un punto de anclaje para el nodo de etiqueta. Está determinado de tal manera que la
label node
voluntad “de espaldas” al borde delmain node
. (...) Para ángulos entre estos ángulos “mayores”, como 30° o 110°, se utilizan anclajes combinados, comosouth west
para 30° o 110°.south east
Sin embargo, para ángulos cercanos a los ángulos mayores (que difieren hasta 2° del ángulo mayor), se utiliza el anclaje para el ángulo mayor. Así, una etiqueta en un punto fronterizo de 2° tendrá el anclawest
, mientras que una etiqueta de 3° tendrá el anclasouth west
, resultando en un “salto” del ancla. Puede configurar el ancla “a mano” usando laanchor
tecla o teclas indirectas comoleft
.
Entonces, para lograr un posicionamiento preciso, use la sugerencia dada en los comentarios (me gusta \path (i2) ++(160:1.5em) node{$i_2$} ;
) o aplique lo que dice la última oración citada usando la anchor
opción, como en
\node[label={[label distance=0mm, anchor=0] 180:$i_2$}] at (i2) {};
o
\node[label={[label distance=0mm, anchor=357] 177:$i_2$}] at (i2) {};
Aquí, 177
corresponde a 〈ángulo〉 en la cita anterior del manual y es relativo al nodo vacío creado por \node (...) at (i2) {};
(el valor predeterminado es above
, es decir, 90
), mientras que anchor=357
se refiere al nodo creado por la label
opción. Mantuve una diferencia de 180° entre ellos para que estuvieran uno frente al otro. Aquí está el resultado con:
\node[label={[label distance=0mm, anchor=345] 165:$i_2$}] at (i2) {};
Para entender bien el posicionamiento, sugiero probar algo como esto:
\node[name=aaa, draw,
label={[draw, label distance=0mm, anchor=345] 165:$i_2$}]
at (i2) {};
\fill[red] (aaa.165) circle (1pt);
De esta manera, la función que asigna el ángulo a la $i_2$
etiqueta es continua (módulo la precisión limitada de la representación de punto flotante), pero como se menciona en los comentarios, se puede hacer la función aún más regular usando la circle
forma para ambos nodos:
\node[name=aaa, circle, draw,
label={[circle, draw, label distance=0mm, anchor=345] 165:$i_2$}]
at (i2) {};
\fill[red] (aaa.165) circle (1pt);
Nota: label distance
se sigue de acuerdo con la dirección determinada por 〈ángulo〉 en las opciones del nodo principal, no con la dirección indicada en anchor
la label
opción. Por alguna razón que no sé, parece que la distancia entre ambas anclas de interés es ladoblede lo indicado con la label distance
opción:
\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);
Respuesta2
Demasiado tiempo para un comentario.
Se puede observar una variación continua para niveles más altos 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}