Die Ausrichtung eines geneigten Knotens bei Vorhandensein von „auf dem Kopf stehen lassen“

Die Ausrichtung eines geneigten Knotens bei Vorhandensein von „auf dem Kopf stehen lassen“

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

Ein Knoten auf einer Linie

Wenn wir allow upside downdie Optionsliste des Knotens erweitern, ist das resultierende Bild

Derselbe Knoten, nur auf dem Kopf

Warum hat TikZ beschlossen, die zweite so auszurichten, ywie 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, yist 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 slopedeine einfache (x1-x0)und Berechnung durchgeführt.(y1-y0)

Wenn allow upside downaktiviert 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).

                                Die Kanten eines Textfelds können natürlich als links, rechts, oben oder unten klassifiziert werden.

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.

                                                  Ein TikZ-Liniensegment ist ein 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 downOption 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.

                                             Ausrichtung eines Textfelds bei Vorhandensein von <code>auf dem Kopf stehen lassen</code>

Wenn die allow upside downOption 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.

                                              Ausrichtung einer Textbox ohne <code>auf dem Kopf stehend zulassen</code>

verwandte Informationen