Considere este ejemplo:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\def\starty{3}
\def\length{1};
\coordinate(a1) at (1, \starty);
\coordinate(b1) at ($(a1) + (0, -\length)$);
\coordinate(a2) at (2, \starty - \length);
\coordinate(b2) at ($(a2) + (0, \length)$);
\draw[red, ->](a1) -- (b1);
\draw[red, ->](b2) -- (a2);
\draw (0, 0) -- (3, 0);
\draw (0, 0) -- (0, 3);
\end{tikzpicture}
\end{document}
El resultado son 2 flechas desplazadas horizontalmente como debería ser de una simple inspección aritmética:
Sin embargo, cuando reemplazo
\def\length{1};
por
\def\length{1cm};
el resultado es inesperado:
¿Qué está causando la discrepancia y cómo debo solucionar este ejemplo?
Respuesta1
El problema es que agregas/combinas expresiones con y sin unidades. TikZ distingue entre expresiones con y sin unidades. recomiendo leeresta respuesta. Si usted tiene
\path (x,y) coordinate (p);
con x
y y
sin dimensiones, entonces el punto p
estará en x*(x unit vector)+y*(y unit vector)
. Los valores iniciales de estos vectores unitarios son (1cm,0)
y (0,1cm)
, respectivamente, pero puedes cambiarlos, por ejemplo con x=(1cm,0.2cm)
. (Estos cambios son complicados si no proporciona unidades porque si uno usa x={({cos(20)},{(sin(20)})},y={({cos(20+90)},{(sin(20+90)})}
, entonces no obtiene solo un sistema de coordenadas rotado. Más bien, cuando y=...
se analiza, ya usa el redefinido x unit vector
. Es por eso que paquetes como tikz-3dplot
adjuntar unidades para definir el sistema rotado sistemas coordinados.)
Si usted tiene
\path (x,y) coordinate (p);
donde x
y y
llevar unidades, entonces el punto p
estará a x
la derecha y y
hacia arriba (transformaciones de módulo como rotaciones, por supuesto). Para los valores iniciales de los vectores unitarios.
\path (1,2) coordinate (p);
y
\path (1cm,2cm) coordinate (p);
producen los mismos resultados, pero en general no es así. También puedes tener una coordenada con unidades y la otra sin, por ejemplo
\path (1cm,2) coordinate (p);
conducirá a un punto 1cm
a la derecha y se desplazará el doble de y unit vector
.
Ahora, volviendo a tu pregunta, si presentas a TikZ una mezcla
\path (a+b,y) coordinate (p);
donde a
lleva unidades y b
no, entonces TikZ adjuntará unidades pt
a b
. Así, por ejemplo, en
\path (1cm+1,2) coordinate (p);
p
tendrá una x
coordenada de 1cm+1pt
, mientras que en
\path (1+1,2) coordinate (p);
tendrá una x
coordenada de 2 veces el x unit vector
.
Para ilustrar esto, comparo las coordenadas de su MWE con aquellas en las que agregué pt
las expresiones adimensionales y muestro que coinciden.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\subsection*{No units}
\begin{tikzpicture}
\def\starty{3}
\def\length{1};
\coordinate(a1) at (1, \starty);
\coordinate(b1) at ($(a1) + (0, -\length)$);
\coordinate(a2) at (2, \starty - \length);
\coordinate(b2) at ($(a2) + (0, \length)$);
\draw[red, ->](a1) -- (b1);
\draw[red, ->](b2) -- (a2);
\draw (0, 0) -- (3, 0);
\draw (0, 0) -- (0, 3);
\end{tikzpicture}
\subsection*{Mix of expressions with and without units}
\begin{tikzpicture}
\def\starty{3}
\def\length{1cm};
\coordinate(a1) at (1, \starty);
\coordinate(b1) at ($(a1) + (0, -\length)$);
\coordinate(a2) at (2, \starty - \length);
\coordinate(b2) at ($(a2) + (0, \length)$);
\draw[red, ->](a1) -- (b1);
\draw[red, ->](b2) -- (a2);
\draw (0, 0) -- (3, 0);
\draw (0, 0) -- (0, 3);
\draw[<->,blue] (2,3pt-1cm) -- ++ (1,0) -- (2,3pt);
\end{tikzpicture}
\end{document}