
Рассмотрим следующую рукопись LaTeX.
\documentclass[tikz,convert]{standalone}
\begin{document}
\begin{tikzpicture}
\draw (1,0) -- (0,1) node[midway,sloped] {$y$};
\end{tikzpicture}
\end{document}
Полученное изображение:
Если мы добавим allow upside down
к списку параметров узла, то получим следующее изображение:
Почему TikZ решил ориентироваться на вторуюy
именно так? Почему она не ориентирована как первая? В конце концов, опция называется простодопустимыйвверх ногами, а ненеобходимыйвверх ногами? Действительно, если поменять порядок координат, то вторая y
будет ориентирована так же, как и первая.
Чтоправилокоторый TikZ использует для определения того, как ориентировать y
, так что, зная это, я могу заранее предсказать, как будет выглядеть результат?
решение1
Это относится к \pgftransformlineattime
разделу 103.2.2 для версии руководства TikZ v3.0.1a. Примерно объяснил случай линии (случай с кривыми аналогичен):
Первая часть не связана с этим поведением, которое представляет собой концепцию таймера 0 как начальной точки, а 1 как конечной точки. Таким образом, после некоторой черной магии pos=0.5
(from midway
) обрабатывается, и мы знаем, где будет точка размещения узла. Если sloped
включено, то выполняется простое вычисление (x1-x0)
и .(y1-y0)
Если allow upside down
включено, то (x1-x0)
проверяется. Если x-разность отрицательна, знак конечной точки меняется на противоположный, в противном случае ничего не происходит, и используется нормализованный вектор, указывающий на конечную точку, и задается преобразование координат. Затем узел подчиняется этому преобразованию.
Для интересующихся вот кодовая версия черновой версии вышеприведенной истории.
\def\pgftransformlineattime#1#2#3{%
\pgf@process{#2}%
\pgf@xb=\pgf@x% xb/yb = start point
\pgf@yb=\pgf@y%
\pgf@process{#3}%
\pgf@xc=\pgf@x% xc/yc = end point
\pgf@yc=\pgf@y%
\pgftransformshift{\pgfpointlineattime{#1}{\pgfqpoint{\pgf@xb}{\pgf@yb}}{\pgfqpoint{\pgf@xc}{\pgf@yc}}}%
\ifpgfresetnontranslationattime%
\pgftransformresetnontranslations%
\fi%
\ifpgfslopedattime%
\advance\pgf@xc by-\pgf@xb%
\advance\pgf@yc by-\pgf@yb%
\ifpgfallowupsidedownattime%
\else%
\ifdim\pgf@xc<0pt%
\pgf@xc=-\pgf@xc%
\pgf@yc=-\pgf@yc%
\fi%
\fi%
\pgf@x=\pgf@xc%
\pgf@y=\pgf@yc%
\pgfpointnormalised{}% x/y = normalised vector
\pgf@ya=-\pgf@y%
\pgftransformcm%
{\pgf@sys@tonumber{\pgf@x}}{\pgf@sys@tonumber{\pgf@y}}%
{\pgf@sys@tonumber{\pgf@ya}}{\pgf@sys@tonumber{\pgf@x}}{\pgfpointorigin}%
\fi%
}
решение2
В отличие от краев обычного прямоугольника, каждый край непустого текстового поля может быть однозначно классифицирован как левый, правый, верхний или нижний край текстового поля, что естественным образом обусловлено направлением текста, содержащегося в текстовом поле (предполагая, что текст имеет одно направление, в отличие от текста, содержащего, скажем, как английский, так и иврит).
Невырожденные отрезки в TikZ направлены: они имеют однозначно определенную начальную точку и однозначно определенную конечную точку, и, следовательно, однозначно определенное направление, а именно от начальной точки к конечной точке. Следовательно, отрезок линии TikZ естественным образом определяет вектор.
Когда узел в конце отрезка линии равен sloped
, его текст располагается параллельно отрезку линии: верхний и нижний края текстового поля, заключенного в узле, параллельны отрезку линии.
Если дополнительно allow upside down
указана опция, текстовое поле ориентируется таким образом, что естественный поток текста слева направо (предполагая, что язык с направлением слева направо, например, английский) происходит в направлении сегмента линии. Другими словами, вектор, определяемый сегментом линии, указывает от левого края текстового поля к правому краю текстового поля.
Если allow upside down
опция не указана, текстовое поле ориентировано так, что нижняя часть текста обращена к нижней части изображения TikZ. Предполагая, что явное вращение не было применено ни к изображению TikZ, ни к узлу, это означает, что воображаемый луч, исходящий из центра текстового поля и пересекающий нижнюю часть текстового поля под прямым углом, в конечном итоге также пересечет нижний край страницы.