Ampliación de la macro "\coord" en el comando "let" de TikZ

Ampliación de la macro "\coord" en el comando "let" de TikZ

Por favor considere este código:

\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\def\coord(#1){coordinate(#1)}
\begin{document}
\begin{tikzpicture}
    \node[draw](A) at (0,0) {A};
    \node[draw](B) at (3,3) {B};
    % this works
    \draw let \p1=(A), \p2=(B) in (A) -- (\x1, \y2) coordinate(C);
    % this fails
    % \draw let \p1=(A), \p2=(B) in (A) -- (\x1, \y2) \coord(C);
    \node [right] at (C) {\pgfversion};
\end{tikzpicture}
\end{document}

ingrese la descripción de la imagen aquí

Falla la linea comentada --- parece que en la ruta no se expande letla macro. \coord¿Se espera esto?

PD. Utilizo esto porque uso el siguiente código:

\def\normcoord(#1){coordinate(#1)}
\def\showcoord(#1){node[circle, red, draw, inner sep=1pt,pin={[red, overlay, inner sep=0.5pt, font=\tiny, pin distance=0.1cm, pin edge={red, overlay,}]45:#1}](#1){}}
\let\coord=\showcoord

para cambiar entre nodos "marcados" y "no marcados" mientras construyo dibujos.

Respuesta1

Simplemente tuviste mala suerte porque elegiste llamar a tu macro \coord, que ya tiene un significado. Nos permite recordar cómo se definió una coordenada. Entonces, si usa, digamos, \mycoorden lugar de \coord, su código funciona como se esperaba. También agregué algo que muestra lo que \coordhace. Puede considerarlo primo de , \ny , que también tienen significados especiales en la sintaxis. Mientras que le permite "establecer" el punto y mostrar sus coordenadas de pantalla y la cadena mediante la cual se definió la coordenada. Más detalladamente, las macros disponibles son (tomada de )\p\x\ylet ... in\p\x\y\coordtikzlibrarycalc.code.tex

  \let\p=\tikz@cc@dop%
  \let\x=\tikz@cc@dox%
  \let\y=\tikz@cc@doy%
  \let\n=\tikz@cc@don%
  \let\rawx=\tikz@cc@dotempx%
  \let\rawy=\tikz@cc@dotempy%
  \let\rawz=\tikz@cc@dotempz%
  \let\coord=\tikz@cc@docoord%

A partir de ahora, también contiene y \rawx, que son los componentes de las coordenadas que se utilizaron para definir la coordenada.\rawy\rawz

\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}
\def\mycoord(#1){coordinate(#1)}
\begin{document}
\begin{tikzpicture}
    \node[draw](A) at (0,0) {A};
    \node[draw](B) at (3,3) {B};
    % this works
    \draw let \p1=(A), \p2=(B) in (A) -- (\x1, \y2) coordinate(C);
    % this also works
    \draw let \p1=(A), \p2=(B) in (A) -- (\x1, \y2) \mycoord(C);
    \node [right] at (C) {\pgfversion};
    \path let \p{A}=(A),\p{B}=(B),\p{C}=(C) in
    (0,3) node[anchor=south west,align=left] {Let us show how\\ 
    we were defined:\\$A=\coord{A}$\\
    $B=\coord{B}$\\ $C=\coord{C}$\\};
\end{tikzpicture}
\end{document}

ingrese la descripción de la imagen aquí

Permítanme mencionar también que \coord, o herramientas relacionadas, es una herramienta indispensable en los cálculos 3D ya que las coordenadas de la pantalla son siempre solo proyecciones, es decir, entre otras cosas, se pierde el tercer componente. Hasta qué punto esto se utilizará de manera significativa depende de los desarrollos futuros del Ti.kZ. El principal problema es que, a partir de ahora, no queda registrado en qué fotograma se definió la coordenada.

Como Henri Menke me lo pidió, menciono que decidió eliminar \coord, \rawx, \rawyy \rawz. En mi humilde opinión, este movimiento es innecesario y rompe los códigos de trabajo. Pero es posible que esta cuestión no surja en el futuro.

Sin embargo, ésta no es una situación especial. Más bien, por ejemplo, normalmente llamo variables de bucle \X, \Yetc., simplemente porque la sintaxis de calc usa y redefine \xy \y(y \xtambién es el parámetro de trazado predeterminado). Es decir, \xy \ytambién se sobrescriben sin previo aviso, y los usuarios generalmente aprenden a evitar colisiones nombrando sus macros de manera diferente. A veces, incluso los comandos más básicos (por ejemplo, \xi) se sobrescriben, pero siempre que sepamos que esto sucede, siempre podemos encontrar una manera de resolverlo. Sólo hay un número finito de nombres de macros. Cada \foreachbucle sobrescribe sus variables de bucle sin previo aviso.

Respuesta2

En PGF 3.1.4 cometí el error de introducir nuevos comandos a nivel de usuario sin documentarlos. Estos comandos se definen dentro de la letoperación y sobrescriben incondicionalmente una posible definición global. Estas macros locales son

\rawx
\rawy
\rawz
\coord

Fue pensado como un experimento, que ahora se ha demostrado que ha fracasado en muchos casos. Por lo tanto, en la próxima versión de PGF 3.1.5 eliminaré estos comandos nuevamente. Puede restaurar el comportamiento correcto de la letoperación anulando la definición en su preámbulo después de cargar la calcbiblioteca.

\documentclass[border=10pt]{standalone}
\usepackage{tikz}
\usetikzlibrary{calc}

\makeatletter
\def\tikz@let@command et{%
  \let\p=\tikz@cc@dop%
  \let\x=\tikz@cc@dox%
  \let\y=\tikz@cc@doy%
  \let\n=\tikz@cc@don%
  \pgfutil@ifnextchar i{\tikz@cc@stop@let}{\tikz@cc@handle@line}%
}%
\makeatother

\def\coord(#1){coordinate(#1)}
\begin{document}
\begin{tikzpicture}
    \node[draw](A) at (0,0) {A};
    \node[draw](B) at (3,3) {B};
    % this works
    \draw let \p1=(A), \p2=(B) in (A) -- (\x1, \y2) coordinate(C);
    % this fails
    \draw let \p1=(A), \p2=(B) in (A) -- (\x1, \y2) \coord(C);
    \node [right] at (C) {\pgfversion};
\end{tikzpicture}
\end{document}

información relacionada