A orientação de um nó inclinado na presença de `permitir inversão`

A orientação de um nó inclinado na presença de `permitir inversão`

Considere o seguinte manuscrito LaTeX.

\documentclass[tikz,convert]{standalone}
\begin{document}
  \begin{tikzpicture}
    \draw (1,0) -- (0,1) node[midway,sloped] {$y$};
  \end{tikzpicture}
\end{document}

A imagem resultante é

Um nó em uma linha

Se adicionarmos allow upside downà lista de opções do nó, a imagem resultante será

O mesmo nó, de cabeça para baixo

Por que TikZ decidiu orientar o segundo ydaquela maneira? Por que não é orientado como o primeiro? Afinal, a opção é chamada apenaspermitidode cabeça para baixo, nãoobrigatóriode cabeça para baixo? Na verdade, se a ordem das coordenadas for alterada, a segunda yserá orientada da mesma forma que a primeira.

O que éregraque o TikZ usa para determinar como orientar o y, para que, sabendo disso, eu possa prever com antecedência como será o resultado?

Responder1

Isso está relacionado \pgftransformlineattimena Seção 103.2.2 para a versão manual do TikZ v3.0.1a. Explicado aproximadamente o caso da linha (o caso curvo é semelhante):

A primeira parte não está relacionada a este comportamento, que é o conceito do temporizador 0 ser o ponto inicial e 1 ser o ponto final. Então, depois de um pouco de magia negra, o pos=0.5(from midway) é tratado e sabemos onde seria o ponto de colocação do nó. Se slopedestiver ativado, um cálculo simples (x1-x0)será (y1-y0)executado.

Se allow upside downestiver habilitado, então (x1-x0)estará marcado. Se a diferença x for negativa, o sinal do ponto final é invertido, caso contrário nada acontece e um vetor normalizado apontando para o ponto final é usado e uma transformação de coordenadas é configurada. Então o nó obedece a essa transformação.

Para os interessados, aqui está a versão em código da história aproximada acima.

\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%
}

Responder2

Ao contrário das bordas de um retângulo genérico, cada borda de uma caixa de texto não vazia pode ser classificada exclusivamente como esquerda, direita, superior ou inferior da caixa de texto, conforme induzido naturalmente pelo fluxo do texto contido em a caixa de texto (assumindo um texto de direcionalidade única, em oposição a um texto contendo, digamos, inglês e hebraico).

                                As bordas de uma caixa de texto podem ser classificadas naturalmente como esquerda, direita, superior ou inferior.

Segmentos de linha não degenerados em TikZ são direcionados: eles têm um ponto inicial determinado exclusivamente e um ponto final determinado exclusivamente e, portanto, uma direção determinada exclusivamente, ou seja, do ponto inicial ao ponto final. Conseqüentemente, um segmento de linha TikZ determina naturalmente um vetor.

                                                  Um segmento de linha TikZ é um vetor.

Quando um nó no final de um segmento de linha é sloped, seu texto corre paralelo ao segmento de linha: as bordas superior e inferior da caixa de texto encapsulada pelo nó são paralelas ao segmento de linha.

Se adicionalmente a allow upside downopção for especificada, a caixa de texto será orientada de forma que o fluxo natural da esquerda para a direita do texto (assumindo um idioma da esquerda para a direita como o inglês) ocorra na direção do segmento de linha. Em outras palavras, o vetor determinado pelo segmento de linha aponta da borda esquerda da caixa de texto para a borda direita da caixa de texto.

                                             Orientação de uma caixa de texto na presença de <code>permitir de cabeça para baixo</code>

Se a allow upside downopção não for especificada, a caixa de texto será orientada de forma que a parte inferior do texto fique voltada para a parte inferior da imagem TikZ. Supondo que nenhuma rotação explícita foi aplicada à imagem TikZ ou ao nó, isso significa que um raio imaginário que emana do centro da caixa de texto e cruza a parte inferior da caixa de texto em um ângulo reto também acabará cruzando a borda inferior da página .

                                              Orientação de uma caixa de texto sem <code>permitir de cabeça para baixo</code>

informação relacionada