考虑以下 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
为什么 TikZ 决定以这样的方式允许倒过来,不是必需的颠倒过来了?事实上,如果调换坐标的顺序,第二个坐标的y
方向与第一个坐标的方向相同。
是什么规则TikZ 使用来确定如何定位y
,以便了解它,我可以提前预测结果会是什么样子?
答案1
这与手册版本 TikZ v3.0.1a 的第 103.2.2 节相关\pgftransformlineattime
。粗略解释了直线的情况(曲线的情况类似):
第一部分与此行为无关,即计时器 0 为起点,1 为终点的概念。因此,经过一些黑魔法之后,pos=0.5
(来自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 图片或节点应用任何显式旋转,这意味着从文本框中心发出并以直角穿过文本框底部的假想射线最终也将穿过页面的底部边缘。