Na matemática

Na matemática

Devo ressaltar que já estou familiarizado com o TikZ e estou procurando respostas técnicas, como se o TikZ não fosse técnico o suficiente.

Esta questão se resume à seguinte questão, qual é a diferença entre essas coisas:

  • \def\pointA{\pgfpoint{0cm}{0cm}}
  • \coordinate (A) at (current page.north east);
  • \coordinate (A) at (1,1);
  • (current page.north east)
  • \node [anchor=east] {}<- uma âncora? :-p(apenas demonstrando sobreposição de termos)
  • \pgfpointanchor<-- mas isso deve ser mesmo uma âncora ou é um ponto? :-p

Acho que falta minha compreensão e isso está interferindo nas minhas tentativas mostradas abaixo.

Na matemática

Aapontaré definido como:

Um ponto é uma posição ou localização exata em uma superfície plana. É importante compreender que um ponto não é uma coisa, mas sim um lugar.

Acoordenadaé definido como:

As coordenadas são um conjunto ordenado de números que definem a posição de um ponto.

Uma âncora é:

insira a descrição da imagem aqui

Gostaria de esclarecer isso com exemplos práticos.

Vamos definir uma coordenada:

\coordinate (rightmid) at ($ (current page.north east) + (0,-18cm) $); % use tikz calc library

Existem muitas coordenadas implícitas (deveriam ser chamadas de coordenadas, pontos ou âncoras ou algo mais?), Como:

  • (página atual.noroeste)
  • (página atual.norte)
  • (página atual.nordeste)
  • (página atual.east)
  • (página atual.sudeste)
  • (página atual.south)
  • (página atual.sudoeste)
  • (página atual.center)

Digamos que eu queira calcular a distância vertical entre duas coisas (estou escolhendo a palavra "coisas" de propósito) E armazenar essa variável para uso fora do escopo atual.

por exemplo, as duas coisas são (página atual.nordeste) e (meio direito)

Para fazer aritmética, conheço as seguintes opções (são todas?):

  1. Eu poderia usar \pgfmathparsepara avaliar a aritmética

  2. Eu poderia usar a \path let \p1=sintaxe.

Usando a opção 1, posso definir \pgfxa, \pgfyapara \pgfxe \pgfypara os cálculos e adquirir o resultado com \pgfmathresult.

Posso então definir um comprimento único (global), por exemplo \setlength{\mylength}{2cm}. Posso então usar \mylengthpara recuperá-lo. Isso não me permitirá escrever tudo em uma macro independente, porque \setlengthsó pode ser definida uma vez. Uma alternativa é usar \global\let\mylength{2cm}, o que me parece melhor para o trabalho (corrija-me se estiver errado. Isso tem implicações no valor+unidade/dimensão)?

Juntando tudo

Aqui está um experimento quenão compilacom base em algumas respostas:

\documentclass{article}
\usepackage{fontspec}
\usepackage{tikz}
\usetikzlibrary{calc}

% A4 Paper
\pdfpagewidth=210mm \pdfpageheight=297mm % for PDF output
\paperwidth=210mm \paperheight=297mm     % for TikZ

\newcommand{\getdistance}[3]{
\makeatletter
% Syntax: <length variable/macro> <coordinate1> <coordinate2>
  \pgfpointdiff{\pgfpointanchor{#2}{center}} % https://tex.stackexchange.com/a/39325/13552
               {\pgfpointanchor{#3}{center}} % https://tex.stackexchange.com/a/39325/13552
  \pgf@xa=\pgf@x
  \pgf@ya=\pgf@y
  \pgfmathparse{veclen(\pgf@xa,\pgf@ya)} 
  \global\let#1\pgfmathresult % <-- I want the pgfmathresult to be a dimension like 510 pt
\makeatother
}

\begin{document}

\begin{tikzpicture}[overlay]
\coordinate (rightmidtest) at ($ (current page.north east) + (0,-10cm) $); % use tikz calc library
\coordinate (rightmid) at ($ (current page.north east) + (0,-18cm) $); % use tikz calc library
\end{tikzpicture}

\getdistance{\globalresult}{rightmidtest}{rightmid}
\getdistance{\globalresult}{current page.north east}{rightmid}
\getdistance % <-- Should expand to last distance measured
\end{document}

Código atualizado em 25/02/2016Trabalhando

Após análise e nova compreensão da resposta de percusse, descobri outra coisa.

Lembrar:

  • (current page)está implícito
  • Anchor .center está implícito no TikZ, mas não no PGF\pgfpointanchor{<ref>}{<anchor e.g. center>}

Usei xparsesintaxe para a macro porque é mais fácil de ler.

\documentclass{article}
\usepackage{fontspec}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{xparse}

\makeatletter
\NewDocumentCommand{\getdistance}{ m m O{center} m O{center} }{%
    %Syntax: {\<macro>} {<ref1>} [<anchor>] {<ref2>} [<anchor>]
    \pgfpointdiff{\pgfpointanchor{#2}{#3}}% https://tex.stackexchange.com/a/39325/13552
                 {\pgfpointanchor{#4}{#5}}% https://tex.stackexchange.com/a/39325/13552
    \pgf@xa=\pgf@x
    \pgf@ya=\pgf@y
    \pgfmathparse{veclen(\pgf@xa,\pgf@ya)} % result as number (floating point)
    %\pgfmathveclen{\pgf@xa}{\pgf@ya} % alternate syntax to pgfmathparse: result as number (floating point)
    %\global\let#1\pgfmathresult pt % does not recognize pt.
    \global\edef#1{\pgfmathresult\ pt}
    %\pgfmathprintnumber{\pgfmathresult}%
  }    
\makeatother    

 \begin{document}
 
\begin{tikzpicture}[remember picture,overlay]
    % (current page) is implicit
    % .center is implicit in TikZ but not in PGF \pgfpointanchor{<ref>}{<anchor e.g. center>}
    \coordinate (referral1) at ($ (current page.north east) + (0,-18cm) $); % use tikz calc library
    \node [minimum height=2cm] (referral2) {};
\end{tikzpicture}
    
\begin{tikzpicture}[remember picture,overlay]
  \getdistance{\globalresultA}{current page}{referral1}
  \getdistance{\globalresultB}{current page}[north east]{referral1}
  \getdistance{\globalresultC}{current page}[north east]{referral2}[north]
  \getdistance{\globalresultD}{current page}[north east]{referral2}[south]
\end{tikzpicture}

\globalresultA

\globalresultB

\globalresultC

\globalresultD
\end{document}

Responder1

Acho que a confusão vem do fato de o TikZ trabalhar com referências e não com objetos. Quando determinado nome de nó aé mencionado. Geralmente assume que o usuário provavelmente se refere à sua coordenada central. Ou no caso de desenhar coisas entre duas coisas, se uma delas for um nó, ele calcula magicamente o ponto em sua borda para que o usuário não perceba.

Mas tudo isso é feito internamente. E nada está relacionado a nós ou então. Um nó tem um nome ao qual você pode se referir e locais predefinidos onde ele é compreendido.

Nada disso é armazenado. Eles são simplesmente verificados quanto à existência ou apenas executados. Em outras palavras, se você escrever shape=duck, ele não passará por todos os nomes de formas possíveis, simplesmente fará uma verificação de existência do tipo (estou usando nomes sem sentido para as macros reais)

\pgfutil@ifdefined\pgf@Shape@#1@...{<if it exists use>}{<if not err>}

Âncoras são a mesma coisa, se você disser anchor=heel, ele pede esse nome por meio de algumas \pgf@sh@#1@anchor@#2e assim por diante.

Agora, de onde vêm isso? Eles são definidos na declaração da forma via \savedanchore \anchorassim por diante.

Portanto, eles estão lá e meticulosamente organizados para que, quando você se referir a eles, tudo, desde a altura da largura da caixa de texto até o caminho da forma, seja dolorosamente codificado à mão. É por isso que é um trabalho muito tedioso definir novas formas. E quando você se refere a eles, eles são organizados de tal forma que a posição da âncora é escrita (globalmente!) Dentro dos registros de comprimento\pgf@<x,y>

De qualquer forma, resumindo a história, quando você se refere a uma âncora de nó, na verdade, há um procedimento bastante complicado para obter uma coordenada dela.

Além disso, há uma diferença entre uma coordenada que é \pgf@<x,y>e um nó do tipo coordenada que é \coordinate.

Finalmente, quando você se refere a um nó, o TikZ tenta ajudá-lo assumindo que você se referia à sua âncora central para que você possa salvar algumas teclas digitadas, mas ocasionalmente você precisa fazer uma cirurgia mais precisa, como medições de distância.

Você não pode escapar impune de nomes de referência. Você precisa de coordenadas reais (novamente, não \coordinate). Como comentou Mark Wibrow, você precisa entender de alguma forma o contexto e isso é feito \pgf@processpara responder a essas perguntas: é uma coordenada literal (1,1), é um nome de nó, é uma âncora de nó, \pgf@<x,y>etc.

Então você pode fazer o que quiser com eles. Sua letsintaxe de exemplo também faz um trabalho incrível para simplificar isso, mas ainda está fazendo o que você descreveu. Na verdade, sua pergunta é basicamente por que o TikZ existe em cima do PGF. É um front-end muito bem projetado para uma sintaxe de PGF muito detalhada, mas poderosa.

Responder2

\def\pointA{\pgfpoint{0cm}{0cm}}

Use isto somente se você estiver familiarizado com PGF (The Foundation of TikZ). De qualquer forma, não importa o que \pgfpointacontece no TeX; este comando nunca existe sozinho. Geralmente faz parte da sintaxe, por exemplo

\coordinate (A) at (current page.north east);

dá um nome a um ponto. Não é importante quais são as coordenadas x e y reais. Sabemos onde (A)está e isso é tudo que precisamos saber.

\coordinate (A) at (1,1);

Semelhante ao anterior. Normalmente nomeamos pontos para (A) reduzir o comprimento/complexidade do código e (B) melhorar a legibilidade. Por exemplo

(current page.north east)

Entre parênteses, emite ummover paraAção. É como se você, segurando uma caneta, movesse a mão para o próximo lugar onde deseja desenhar algo. Por exemplo

Este código faz com que TikZ move sua caneta por toda a tela e declara nós/coordenadas.

\node [anchor=east] {}

coloque um nó "perto" da posição atual da caneta. Por "próximo", quero dizer que a âncora que você dá deve coincidir com a posição da caneta. É como se você, em um barco, pudesse lançar a âncora onde quiser e essa âncora fixará o barco.


parte prática

  • você precisa \makeatletter.
  • você provavelmente deseja \pgfmathsetlengthem vez de \pgfmathsetmacrosou \pgfmathparse.
    • mas lembre-se, todas as dimensões devem ser declaradas antes de seu uso.
  • tenha cuidado ao usar o nó (current page). Geralmente você precisa [overlay].
  • você precisa estar dentro de um tikzpictureambiente para recuperar qualquer coisa que tenha feito em um tikzpictureambiente.
    • se você não estiver fazendo o trabalho no mesmo tikzpictureambiente, você precisa do [remember picture].

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}

\makeatletter
\newcommand{\getdistance}[3]{
% Syntax: <length variable/macro> <coordinate1> <coordinate2>
  \pgfpointdiff{\pgfpointanchor{#2}{center}} % http://tex.stackexchange.com/a/39325/13552
               {\pgfpointanchor{#3}{center}} % http://tex.stackexchange.com/a/39325/13552
  \pgf@xa=\pgf@x
  \pgf@ya=\pgf@y
  \pgfmathparse{veclen(\pgf@xa,\pgf@ya)} 
  \global\let#1\pgfmathresult % <-- I want the pgfmathresult to be a dimension like 510 pt
}

\begin{document}

\begin{tikzpicture}[remember picture,overlay]
\coordinate (rightmidtest) at ($ (current page.north east) + (0,-10cm) $); % use tikz calc library
\coordinate (rightmid) at ($ (current page.north east) + (0,-18cm) $); % use tikz calc library
\end{tikzpicture}

\tikz[remember picture,overlay]{
    \getdistance{\globalresulta}{rightmidtest}{rightmid}
    \getdistance{\globalresultb}{current page}{rightmid}
}

\globalresulta

\globalresultb

\end{document}

Responder3

  1. \def\pointA{\pgfpoint{0cm}{0cm}}

    Isto é basicamente o mesmo que\coordinate (A) at (0,0);

  2. \coordinate (A) at (current page.north east);

    Aqui você está apenas nomeando o canto superior direito da página como A. É inútil no sentido de que o local já está nomeado, mas pode ser útil não precisar digitar tudo isso e apenas escrever A.

  3. \coordinate (A) at (1,1);

    As coordenadas no TikZ são basicamente nós com a coordinateforma, não requerem legenda e, o que é mais importante, não possuem sep. Então é um ponto. Ainda assim, escrever \node[coordinate] (a) at (0,0) {};é igual a\coordinate (a) at (0,0);

    Veja tambémTikZ: diferença entre \node e \coordenada?

  4. (current page.north east)

    Isso indica o canto superior direito da “página” atual. Normalmente seria uma página A4, mas pode ter qualquer dimensão. A página, neste caso, não se destina necessariamente a ser um pedaço de papel normal, mas pode ser qualquer área designada.

  5. \node [anchor=east] {}<- uma âncora?

    Não, isso não é uma âncora. É um nó cujo posicionamento é determinado pela colocação da âncora desenhada na coordenada. Assim \node [anchor=east] at (4,0) {};colocaremos o nó tendo a eastâncora coincidente com a coordenada (4,0).

Responder4

Não sei como editar minha resposta antiga. Vou simplesmente escrever um novo.

Em TikZ existem muitas maneiras de especificar pontos

  • Dê coordenadas numéricas.
    Por exemplo (1,2), (3mm,4in,5pt), (6:7), (axis cs:x=8).

  • Forneça um nome de nó predefinido e um nome de âncora.
    Por exemplo (current page.south east), (current bounding box.north west).

  • Forneça um nome de nó predefinido.
    Por exemplo (current page). Isto é equivalente a(current page.center)

  • Dê predefinido coordinate.
    Por exemplo \coordinate(X)at(1,2);\path(X);. A coordinateé na verdade um nó, cujas âncoras "desaparecem": (X), (X.center), (X.south), e (X.34)todas dão o mesmo resultado.

Suas contrapartes PGF são

  • \pgfpointxy, \pgfpointxyz, \pgfpointpolar, e assim por diante
  • \pgfpointanchor{#1}{#2}
  • \pgfpointanchor{#1}{center}
  • \pgfpointanchor{#1}{center}

Agora você vê que na definição de \getdistance, só é possível preencher o nome de um nó e a âncora centeré escolhida como obrigatória. Portanto

\getdistance{\globalresultb}{current page.north east}{rightmid}

não compila porque current page.north eastnão é mais um nó. Mas

\coordinate (A) at (current page.north east);
\getdistance{\globalresultb}{A}{rightmid}

compila porque (A)é o nome de um nó.

Depende de você que tipo de entrada \getdistancepode suportar. Por exemplo em TikZ, \tikz@parse@nodepode lidar com ambos (X)e (Y.Z). mas não (1,2). De forma mais geral \tikz@@scan@@no@calculator, e manipular (X), (Y.Z)e (1,2). Ainda mais geralmente \tikz@@@scan@@absolutepode lidar com arquivos ($ (current page.north east) + (0,-10cm) $). Você precisa escolher um.

informação relacionada