En matemáticas

En matemáticas

Debo señalar que ya estoy familiarizado con TikZ y estoy buscando respuestas técnicas, como si TikZ no fuera lo suficientemente técnico.

Esta pregunta se refiere a la siguiente pregunta, ¿cuál es la diferencia entre estas cosas?

  • \def\pointA{\pgfpoint{0cm}{0cm}}
  • \coordinate (A) at (current page.north east);
  • \coordinate (A) at (1,1);
  • (current page.north east)
  • \node [anchor=east] {}<-- ¿un ancla? :-pag(solo demostrando la superposición de términos)
  • \pgfpointanchor<-- pero esto realmente debe ser un ancla, ¿o es un punto? :-pag

Creo que me falta comprensión y está interfiriendo con mis intentos que se muestran a continuación.

En matemáticas

ApuntoSe define como:

Un punto es una posición o ubicación exacta sobre una superficie plana. Es importante entender que un punto no es una cosa, sino un lugar.

AcoordinarSe define como:

Las coordenadas son un conjunto ordenado de números que definen la posición de un punto.

Un ancla es:

ingrese la descripción de la imagen aquí

Me gustaría aclarar esto con ejemplos prácticos.

Definamos una coordenada:

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

Hay muchas coordenadas implícitas (¿deberían llamarse coordenadas, puntos, anclas o algo más?) como:

  • (página actual.noroeste)
  • (página actual.norte)
  • (página actual.noreste)
  • (página actual.este)
  • (página actual.sureste)
  • (página actual.sur)
  • (página actual.suroeste)
  • (página actual.centro)

Digamos que quiero calcular la distancia vertical entre dos cosas (elijo la palabra "cosas" a propósito) Y almacenar esta variable para usarla fuera del alcance actual.

por ejemplo, las dos cosas son (página actual.noreste) y (centro derecho)

Para hacer aritmética conozco las siguientes opciones (¿son todas?):

  1. Podría utilizar \pgfmathparsepara evaluar la aritmética.

  2. Podría usar la \path let \p1=sintaxis.

Usando la opción 1, puedo configurar \pgfxa, \pgfyapara \pgfxy \pgfypara los cálculos y adquirir el resultado con \pgfmathresult.

Luego puedo definir una longitud única (global), por ejemplo \setlength{\mylength}{2cm}. Luego puedo usarlo \mylengthpara recuperarlo. Esto no me permitirá escribir todo en una macro independiente, porque \setlengthsólo se puede definir una vez. Una alternativa es usar \global\let\mylength{2cm}, que me parece mejor para el trabajo (corríjame si me equivoco. ¿Esto tiene implicaciones en el valor+unidad/dimensión)?

Poniendolo todo junto

He aquí un experimento queno compilabasado en un par de respuestas:

\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 actualizado 2016-02-25Laboral

Después del análisis y la nueva comprensión de la respuesta de Percusse, se me ocurrió algo más.

Recordar:

  • (current page)es implícito
  • Anchor .center está implícito en TikZ pero no en PGF\pgfpointanchor{<ref>}{<anchor e.g. center>}

Utilicé xparsela sintaxis para la macro porque es más fácil de leer.

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

Respuesta1

Creo que la confusión proviene del hecho de que TikZ trabaja con referencias, no con objetos. Cuando ase menciona cierto nombre de nodo . Por lo general, se supone que el usuario probablemente se refiere a su coordenada central. O en el caso de dibujar cosas entre dos cosas, si una de ellas es un nodo, entonces calcula mágicamente el punto en su borde para que el usuario no se dé cuenta.

Pero todo esto se hace internamente. Y nada está relacionado con nodos ni nada más. Un nodo tiene un nombre al que puede hacer referencia y lugares predefinidos donde entiende.

Ninguno de estos está almacenado. Simplemente se comprueba su existencia o simplemente se ejecutan. En otras palabras, si escribe shape=duck, entonces no revisa todos los nombres de formas posibles, simplemente realiza una verificación de existencia de ese tipo (estoy usando nombres sin sentido para las macros reales)

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

Los anclajes son el mismo trato, si dices anchor=heel, solicita ese nombre a través de algunos \pgf@sh@#1@anchor@#2y así sucesivamente.

Ahora bien, ¿de dónde vienen estos? Se definen en la declaración de forma vía \savedanchory \anchorasí sucesivamente.

Así que están ahí y meticulosamente organizados para que cuando los consultes, todo, desde el ancho del cuadro de texto hasta la ruta de la forma, esté codificado a mano. Por eso es un trabajo muy tedioso definir nuevas formas. Y cuando te refieres a ellos, están organizados de tal manera que la posición del ancla está escrita (¡globalmente!) dentro de los registros de longitud.\pgf@<x,y>

En pocas palabras, cuando te refieres a un ancla de nodo, en realidad hay un procedimiento bastante complicado para obtener una coordenada de él.

Además, existe una diferencia entre una coordenada que es \pgf@<x,y>y un nodo de tipo coordenada que es\coordinate .

Finalmente, cuando te refieres a un nodo, TikZ intenta ayudarte asumiendo que te refieres a su ancla central para que puedas ahorrar algunas pulsaciones de teclas, pero ocasionalmente necesitas realizar una cirugía más fina, como mediciones de distancia.

No puede salirse con la suya con nombres de referencias. Necesitas coordenadas reales (nuevamente no \coordinates). Como comentó Mark Wibrow, hay que entender de alguna manera el contexto y eso se hace para \pgf@processresponder a estas preguntas: ¿es una coordenada literal (1,1), es un nombre de nodo, es un ancla de nodo, etc. Entonces puedes usar el resultado?\pgf@<x,y> registros resultantes?

Entonces podrás hacer lo que quieras con ellos. Su letsintaxis de ejemplo también hace un trabajo increíble para simplificar esto, pero sigue haciendo lo que ha descrito. En realidad, tu pregunta es básicamente por qué existe TikZ además de PGF. Es una interfaz muy bien diseñada para una sintaxis de PGF muy detallada pero poderosa.

Respuesta2

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

Úselo sólo si está familiarizado con PGF (La base de TikZ). De todos modos, no importa lo que \pgfpointhaga en TeX; este comando nunca existe solo. Generalmente es parte de la sintaxis, por ejemplo

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

le da un nombre a un punto. No es importante cuáles son las coordenadas x e y reales. Sabemos dónde (A)está y eso es todo lo que necesitamos saber.

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

Similar al anterior. Por lo general, nombramos puntos para (A) reducir la longitud/complejidad del código y (B) mejorar la legibilidad. Por ejemplo

(current page.north east)

Entre paréntesis, emite unmover aacción. Es muy parecido a si, sosteniendo un bolígrafo, mueves tu mano al siguiente lugar donde quieres dibujar algo. Por ejemplo

Este código hace TikZ mueve su lápiz por todo el lienzo y declara nodos/coordenadas.

\node [anchor=east] {}

coloque un nodo "cerca" de la posición actual del lápiz. Por "cerca" me refiero a que el ancla que le des debe coincidir con la posición del bolígrafo. Es muy parecido a como tú, en un barco, puedes echar el ancla a donde quieras y ese ancla luego arreglará el barco.


parte practica

  • necesitas \makeatletter.
  • probablemente quieras \pgfmathsetlengthen lugar de \pgfmathsetmacroso \pgfmathparse.
    • pero recuerda, todas las dimensiones deben declararse antes de su uso.
  • tenga cuidado cuando utilice el nodo (current page). Generalmente necesitas [overlay].
  • necesitas estar dentro de un tikzpictureentorno para recuperar cualquier cosa que hayas creado en un tikzpictureentorno.
    • Si no realiza el trabajo en el mismo tikzpictureentorno, necesita [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}

Respuesta3

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

    Esto es básicamente lo mismo que\coordinate (A) at (0,0);

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

    Aquí simplemente estás nombrando la esquina superior derecha de la página como A. No tiene sentido en el sentido de que la ubicación ya tiene nombre, pero puede ser útil no tener que escribir todo eso y simplemente escribir A.

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

    Las coordenadas en TikZ son básicamente nodos con coordinateforma, no requieren título y, lo que es más importante, no tienen sep. Entonces es un punto. Aún así, escribir \node[coordinate] (a) at (0,0) {};equivale a\coordinate (a) at (0,0);

    Ver tambiénTikZ: ¿diferencia entre \node y \coordinate?

  4. (current page.north east)

    Esto indica la esquina superior derecha de la "página" actual. Normalmente sería una página A4, pero puede tener cualquier dimensión. En este caso, la página no necesariamente es una hoja de papel normal, pero puede ser cualquier área designada.

  5. \node [anchor=east] {}<-- ¿un ancla?

    No, esto no es un ancla. Es un nodo cuyo posicionamiento se determina colocando el ancla diseñada en la coordenada. Así \node [anchor=east] at (4,0) {};colocaremos el nodo teniendo el eastancla coincidiendo con la coordenada (4,0).

Respuesta4

No sé cómo editar mi antigua respuesta. Simplemente escribiré uno nuevo.

en tikZ hay muchas maneras de especificar puntos.

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

  • Proporcione un nombre de nodo predefinido y un nombre de ancla.
    Por ejemplo (current page.south east), (current bounding box.north west).

  • Proporcione un nombre de nodo predefinido.
    Por ejemplo (current page). Esto es equivalente a(current page.center)

  • Dar predefinido coordinate.
    Por ejemplo \coordinate(X)at(1,2);\path(X);. A coordinatees en realidad un nodo, cuyos anclajes "desaparecen": (X), (X.center), (X.south)y (X.34)todos dan el mismo resultado.

Sus contrapartes PGF son

  • \pgfpointxy, \pgfpointxyz, \pgfpointpolar, etcétera
  • \pgfpointanchor{#1}{#2}
  • \pgfpointanchor{#1}{center}
  • \pgfpointanchor{#1}{center}

Ahora ve que en la definición de \getdistance, solo se puede completar un nombre de nodo y el ancla centerse elige como obligatoria. Por lo tanto

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

no se compila porque current page.north eastya no es un nodo. Pero

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

compila porque (A)es el nombre de un nodo.

Depende de usted qué tipo de entrada\getdistance puede manejar. Por ejemplo en TikZ, \tikz@parse@nodepuede manejar tanto (X)como (Y.Z). pero no (1,2). De manera más general , \tikz@@scan@@no@calculatory manejar (X), (Y.Z)y (1,2). Incluso de manera más general \tikz@@@scan@@absolutepuede manejar ($ (current page.north east) + (0,-10cm) $). Tienes que elegir uno.

información relacionada