aritmética tikz com números e comprimentos

aritmética tikz com números e comprimentos

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:

insira a descrição da imagem aqui

No entanto, quando eu substituo

  \def\length{1};

por

  \def\length{1cm};

o resultado é inesperado:

insira a descrição da imagem aqui

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 xe yadimensional, então o ponto pestará 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-3dplotanexar unidades para definir o girado Sistemas coordenados.)

Se você tem

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

onde xe ytransportam unidades, então o ponto pestará xà direita e ypara 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 acarrega unidades e bnão carrega, então TikZ anexará unidades pta b. Assim, por exemplo, em

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

pterá uma xcoordenada de 1cm+1pt, enquanto em

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

terá uma xcoordenada 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}

insira a descrição da imagem aqui

informação relacionada