![aritmética tikz com números e comprimentos](https://rvso.com/image/405379/aritm%C3%A9tica%20tikz%20com%20n%C3%BAmeros%20e%20comprimentos.png)
Considere este exemplo:
\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}
O resultado são 2 setas deslocadas horizontalmente, como deveria ser em uma simples inspeção aritmética:
No entanto, quando eu substituo
\def\length{1};
por
\def\length{1cm};
o resultado é inesperado:
O que está causando a discrepância e como devo corrigir este exemplo?
Responder1
O problema é que você adiciona/combina expressões com e sem unidades. TikZ distingue entre expressões com e sem unidades. Eu recomendo a leituraesta resposta. Se você tem
\path (x,y) coordinate (p);
com x
e y
adimensional, então o ponto p
estará em x*(x unit vector)+y*(y unit vector)
. Os valores iniciais desses vetores unitários são (1cm,0)
e (0,1cm)
, respectivamente, mas você pode alterá-los, por exemplo, com x=(1cm,0.2cm)
. (Essas mudanças são complicadas se você não fornecer unidades porque se usarmos x={({cos(20)},{(sin(20)})},y={({cos(20+90)},{(sin(20+90)})}
, então não obteremos apenas um sistema de coordenadas girado. Em vez disso, quando y=...
é analisado, ele já usa o redefinido x unit vector
. É por isso que pacotes como tikz-3dplot
anexar unidades para definir o girado Sistemas coordenados.)
Se você tem
\path (x,y) coordinate (p);
onde x
e y
transportam unidades, então o ponto p
estará x
à direita e y
para cima (transformações de módulo como rotações, é claro). Para os valores iniciais dos vetores unitários
\path (1,2) coordinate (p);
e
\path (1cm,2cm) coordinate (p);
produzem os mesmos resultados, mas em geral não. Você também pode ter uma coordenada com unidades e outra sem, por exemplo
\path (1cm,2) coordinate (p);
levará a um ponto 1cm
à direita e deslocado duas vezes y unit vector
.
Agora, voltando à sua pergunta, se você apresentar TikZ uma mistura
\path (a+b,y) coordinate (p);
onde a
carrega unidades e b
não carrega, então TikZ anexará unidades pt
a b
. Assim, por exemplo, em
\path (1cm+1,2) coordinate (p);
p
terá uma x
coordenada de 1cm+1pt
, enquanto em
\path (1+1,2) coordinate (p);
terá uma x
coordenada de 2 vezes o x unit vector
.
Para ilustrar isso, comparo as coordenadas do seu MWE com aquelas nas quais anexei pt
às expressões adimensionais e mostro que elas correspondem.
\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}