tikz арифметика с числами и длинами

tikz арифметика с числами и длинами

Рассмотрим такой пример:

\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}

Результатом являются 2 горизонтально смещенные стрелки, как и должно быть после простого арифметического расчета:

введите описание изображения здесь

Однако, когда я заменяю

  \def\length{1};

к

  \def\length{1cm};

результат неожиданный:

введите описание изображения здесь

Что является причиной несоответствия и как исправить этот пример?

решение1

Проблема в том, что вы добавляете/комбинируете выражения с единицами измерения и без них. TiкZ различает выражения с единицами и без них. Рекомендую прочитатьэтот ответ. Если у вас есть

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

с xи yбезразмерными, то точка pбудет в x*(x unit vector)+y*(y unit vector). Начальные значения этих единичных векторов равны (1cm,0)и (0,1cm), соответственно, но вы можете изменить их, например, с помощью x=(1cm,0.2cm). (Эти изменения сложны, если вы не указываете единицы измерения, потому что если использовать x={({cos(20)},{(sin(20)})},y={({cos(20+90)},{(sin(20+90)})}, то мы получим не просто повернутую систему координат. Вместо этого, когда y=...разбирается, он уже использует переопределенный x unit vector. Вот почему пакеты, такие как tikz-3dplotприсоединение единиц измерения, определяют повернутые системы координат.)

Если у вас есть

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

где xи yпереносим единицы, то точка pбудет xсправа и yвверх (модульные преобразования, такие как вращения, конечно). Для начальных значений единичных векторов

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

и

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

дают те же результаты, но в общем случае нет. Вы также можете иметь одну координату с единицами, а другую без, например

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

приведет к точке 1cmсправа и сместится на величину, равную 2 y unit vector.

Теперь, возвращаясь к вашему вопросу, если вы представляете ТикZ-микс

 \path (a+b,y) coordinate (p);

где aперевозит единицы иb не несет, то TiкZ прикрепит единицы ptк b. Так, например, в

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

pбудет иметь xкоординату 1cm+1pt, в то время как в

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

он будет иметь xкоординату в 2 раза больше x unit vector.

Чтобы проиллюстрировать это, я сравниваю координаты вашего ММЭ с теми, которые я добавил ptк безразмерным выражениям, и показываю, что они совпадают.

\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}

введите описание изображения здесь

Связанный контент