
Betrachten Sie das folgende LaTeX-Manuskript.
\documentclass[tikz,convert]{standalone}
\begin{document}
\begin{tikzpicture}
\draw (1,0) -- (0,1) node[midway,sloped] {$y$};
\end{tikzpicture}
\end{document}
Das resultierende Bild ist
Wenn wir allow upside down
die Optionsliste des Knotens erweitern, ist das resultierende Bild
Warum hat TikZ beschlossen, die zweite so auszurichten, y
wie es getan hat? Warum ist sie nicht so ausgerichtet wie die erste? Schließlich heißt die Option lediglicherlaubtauf den Kopf gestellt, nichterforderlichauf den Kopf gestellt? Wenn die Reihenfolge der Koordinaten vertauscht wird, y
ist die zweite Koordinatenachse tatsächlich genauso ausgerichtet wie die erste.
Was ist derRegeldie TikZ verwendet, um die Ausrichtung zu bestimmen y
, sodass ich, wenn ich sie kenne, im Voraus vorhersagen kann, wie das Ergebnis aussehen wird?
Antwort1
Dies ist in Abschnitt 103.2.2 für die manuelle Version TikZ v3.0.1a beschrieben \pgftransformlineattime
. Grob erklärt der Linienfall (der gekrümmte Fall ist ähnlich):
Der erste Teil hat nichts mit diesem Verhalten zu tun, nämlich dem Konzept, dass Timer 0 der Startpunkt und 1 der Endpunkt ist. Nach etwas schwarzer Magie ist also pos=0.5
(von midway
) verarbeitet und wir wissen, wo der Punkt der Knotenplatzierung sein würde. Wenn aktiviert ist, wird sloped
eine einfache (x1-x0)
und Berechnung durchgeführt.(y1-y0)
Wenn allow upside down
aktiviert ist, (x1-x0)
wird es aktiviert. Wenn die x-Differenz negativ ist, wird das Vorzeichen des Endpunkts umgedreht, andernfalls passiert nichts und es wird ein normalisierter Vektor verwendet, der auf den Endpunkt zeigt, und eine Koordinatentransformation wird eingerichtet. Dann befolgt der Knoten diese Transformation.
Für Interessierte ist hier die Codeversion der obigen groben Geschichte.
\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%
}
Antwort2
Im Gegensatz zu den Kanten eines allgemeinen Rechtecks kann jede Kante eines nicht leeren Textfelds eindeutig als die linke, rechte, obere oder untere Kante des Textfelds klassifiziert werden, wie es durch den Fluss des im Textfeld enthaltenen Textes auf natürliche Weise bedingt ist (unter der Annahme eines Textes mit einheitlicher Richtung, im Gegensatz zu einem Text, der beispielsweise sowohl Englisch als auch Hebräisch enthält).
Nicht-entartete Liniensegmente in TikZ sind gerichtet: Sie haben einen eindeutig bestimmten Startpunkt und einen eindeutig bestimmten Endpunkt und damit eine eindeutig bestimmte Richtung, nämlich vom Startpunkt zum Endpunkt. Daher bestimmt ein TikZ-Liniensegment natürlich einen Vektor.
Wenn sich ein Knoten am Ende eines Liniensegments befindet sloped
, verläuft sein Text parallel zum Liniensegment: Die Ober- und Unterkante des vom Knoten umschlossenen Textfelds verlaufen parallel zum Liniensegment.
Wenn zusätzlich die allow upside down
Option angegeben wird, wird das Textfeld so ausgerichtet, dass der natürliche Textfluss von links nach rechts (bei einer von links nach rechts geschriebenen Sprache wie Englisch) in Richtung des Liniensegments erfolgt. Mit anderen Worten zeigt der durch das Liniensegment bestimmte Vektor vom linken Rand des Textfelds zum rechten Rand des Textfelds.
Wenn die allow upside down
Option nicht angegeben ist, wird das Textfeld so ausgerichtet, dass die Unterseite des Textes zur Unterseite des TikZ-Bildes zeigt. Vorausgesetzt, dass weder auf das TikZ-Bild noch auf den Knoten eine explizite Drehung angewendet wurde, bedeutet dies, dass ein imaginärer Strahl, der von der Mitte des Textfelds ausgeht und die Unterseite des Textfelds im rechten Winkel kreuzt, letztendlich auch die Unterkante der Seite kreuzt.