Ориентация наклонного узла при наличии `разрешить перевернуть`

Ориентация наклонного узла при наличии `разрешить перевернуть`

Рассмотрим следующую рукопись 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 естественным образом определяет вектор.

                                                  Отрезок линии TikZ представляет собой вектор.

Когда узел в конце отрезка линии равен sloped, его текст располагается параллельно отрезку линии: верхний и нижний края текстового поля, заключенного в узле, параллельны отрезку линии.

Если дополнительно allow upside downуказана опция, текстовое поле ориентируется таким образом, что естественный поток текста слева направо (предполагая, что язык с направлением слева направо, например, английский) происходит в направлении сегмента линии. Другими словами, вектор, определяемый сегментом линии, указывает от левого края текстового поля к правому краю текстового поля.

                                             Ориентация текстового поля при наличии <code>разрешить перевернутый вид</code>

Если allow upside downопция не указана, текстовое поле ориентировано так, что нижняя часть текста обращена к нижней части изображения TikZ. Предполагая, что явное вращение не было применено ни к изображению TikZ, ни к узлу, это означает, что воображаемый луч, исходящий из центра текстового поля и пересекающий нижнюю часть текстового поля под прямым углом, в конечном итоге также пересечет нижний край страницы.

                                              Ориентация текстового поля без <code>разрешает переворачивать</code>

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