![En matemáticas](https://rvso.com/image/328834/En%20matem%C3%A1ticas.png)
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:
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?):
Podría utilizar
\pgfmathparse
para evaluar la aritmética.Podría usar la
\path let \p1=
sintaxis.
Usando la opción 1, puedo configurar \pgfxa
, \pgfya
para \pgfx
y \pgfy
para los cálculos y adquirir el resultado con \pgfmathresult
.
Luego puedo definir una longitud única (global), por ejemplo \setlength{\mylength}{2cm}
. Luego puedo usarlo \mylength
para recuperarlo. Esto no me permitirá escribir todo en una macro independiente, porque \setlength
só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
- ¿Es posible utilizar el ancho de un nodo TikZ para calcular el ancho de otro?
- ¿Cómo puedo convertir una coordenada en un punto pgf y viceversa?
- Coordenadas A, B: calcular |BA| y ángulo entre +x y (BA)
- macro pgf que devuelve un nodo
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é xparse
la 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 a
se 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@#2
y así sucesivamente.
Ahora bien, ¿de dónde vienen estos? Se definen en la declaración de forma vía \savedanchor
y \anchor
así 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 \coordinate
s). Como comentó Mark Wibrow, hay que entender de alguna manera el contexto y eso se hace para \pgf@process
responder 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 let
sintaxis 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 \pgfpoint
haga 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
\pgfmathsetlength
en lugar de\pgfmathsetmacros
o\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
tikzpicture
entorno para recuperar cualquier cosa que hayas creado en untikzpicture
entorno.- Si no realiza el trabajo en el mismo
tikzpicture
entorno, necesita[remember picture]
.
- Si no realiza el trabajo en el mismo
\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
\def\pointA{\pgfpoint{0cm}{0cm}}
Esto es básicamente lo mismo que
\coordinate (A) at (0,0);
\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 escribirA
.\coordinate (A) at (1,1);
Las coordenadas en TikZ son básicamente nodos con
coordinate
forma, no requieren título y, lo que es más importante, no tienensep
. 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?
(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.
\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 eleast
ancla 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);
. Acoordinate
es 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 center
se elige como obligatoria. Por lo tanto
\getdistance{\globalresultb}{current page.north east}{rightmid}
no se compila porque current page.north east
ya 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@node
puede manejar tanto (X)
como (Y.Z)
. pero no (1,2)
. De manera más general , \tikz@@scan@@no@calculator
y manejar (X)
, (Y.Z)
y (1,2)
. Incluso de manera más general \tikz@@@scan@@absolute
puede manejar ($ (current page.north east) + (0,-10cm) $)
. Tienes que elegir uno.