aritmética tikz con números y longitudes

aritmética tikz con números y longitudes

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:

ingrese la descripción de la imagen aquí

Sin embargo, cuando reemplazo

  \def\length{1};

por

  \def\length{1cm};

el resultado es inesperado:

ingrese la descripción de la imagen aquí

¿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 xy ysin dimensiones, entonces el punto pestará 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-3dplotadjuntar unidades para definir el sistema rotado sistemas coordinados.)

Si usted tiene

 \path (x,y) coordinate (p);

donde xy yllevar unidades, entonces el punto pestará a xla derecha y yhacia 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 1cma 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 alleva unidades y bno, entonces TikZ adjuntará unidades pta b. Así, por ejemplo, en

 \path (1cm+1,2) coordinate (p);

ptendrá una xcoordenada de 1cm+1pt, mientras que en

 \path (1+1,2) coordinate (p);

tendrá una xcoordenada de 2 veces el x unit vector.

Para ilustrar esto, comparo las coordenadas de su MWE con aquellas en las que agregué ptlas 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}

ingrese la descripción de la imagen aquí

información relacionada