![tikz арифметика с числами и длинами](https://rvso.com/image/405379/tikz%20%D0%B0%D1%80%D0%B8%D1%84%D0%BC%D0%B5%D1%82%D0%B8%D0%BA%D0%B0%20%D1%81%20%D1%87%D0%B8%D1%81%D0%BB%D0%B0%D0%BC%D0%B8%20%D0%B8%20%D0%B4%D0%BB%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8.png)
Рассмотрим такой пример:
\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}