%3F.png)
Quiero crear una macro, es decir \newpoint{<point name>}{<point style>}
, que cree macros como \Point<point name>{<x coord>}{<y coord>}{<label>}
.
He visto¿Cómo definir una macro para crear una nueva macro con un nombre pasado como argumento?que está a la mitad ya que no muestra cómo hacer que la macro creada reciba argumentos.
Lo intenté:
\newcommand*{\newpoint}[2]{%
\tikzset{#1/.style={#2}}%
\newcounter{point#1}\setcounter{point#1}{0}%
\def\csname Point#1\endcsname (##1,##2)|##3;{%
\stepcounter{point#1}\fill[#1] (##1,##2) circle (2pt) node[above](#1-\thepoint#1){##3};}%
}
Pero no funcionó, aparentemente Use of \csname doesn't match it's definition
y honestamente... Ya no sé qué estoy haciendo.
Aquí está mi M(norte)NOSOTROS:
\documentclass[tikz, border=2mm]{standalone}
\newcommand*{\newpoint}[2]{%
\tikzset{#1/.style={#2}}%
\newcounter{point#1}\setcounter{point#1}{0}%
\def\csname Point#1\endcsname (##1,##2)|##3;{%
\stepcounter{point#1}\fill[#1] (##1,##2) circle (2pt) node[above](#1-\thepoint#1){##3};}%
}
\newpoint{A}{red}
\begin{document}
\begin{tikzpicture}
\PointA(1,2)|A;
\end{tikzpicture}
\end{document}
Respuesta1
Como comentó @daleif, ponlo \expandafter
antes \def
. Y para conseguirlo \thepointA
hay que utilizarlo \csname ... \endcsname
allí. Supongo que esto es lo que quieres:
\newcommand*{\newpoint}[2]{%
\tikzset{#1/.style={#2}}%
\newcounter{point#1}\setcounter{point#1}{0}%
\expandafter\def\csname Point#1\endcsname (##1,##2)|##3;{%
\stepcounter{point#1}\fill[#1] (##1,##2) circle (2pt) node[above](#1-\csname thepoint#1\endcsname){##3};}%
}
Y aquí hay una solución sin un contador real para cada llamada de \newpoint
, basada en la solución con un pseudocontador de @egreg, pero con un incremento del pseudocontador, cada vez que \point<name>
se llama a la macro.
\newcounter{pointnumber}
\newcommand\StepPointNumber[1]{%
\setcounter{pointnumber}{\csname number@point#1\endcsname}%
\stepcounter{pointnumber}
\expandafter\xdef\csname number@point#1\endcsname{\thepointnumber}%
\expandafter\show\csname number@point#1\endcsname
}
\newcommand*{\newpoint}[2]{%
\tikzset{#1/.style={#2}}%
\expandafter\def\csname number@point#1\endcsname{0}%
\expandafter\def\csname Point#1\endcsname (##1,##2)|##3;{%
\StepPointNumber{#1}%
\fill[#1] (##1,##2) circle (2pt) node[above](#1-\csname number@point#1\endcsname){##3-\csname number@point#1\endcsname};}%
}
Respuesta2
No veo la necesidad de asignar un nuevo contador, a menos que quieras hacer aritmética con él.
Sin embargo, el punto principal es que debes utilizarlo \csname
de la manera correcta:
\documentclass[tikz, border=2mm]{standalone}
\newcommand*{\newpoint}[2]{%
\tikzset{#1/.style={#2}}%
\expandafter\def\csname number@point#1\endcsname{0}%
\expandafter\def\csname Point#1\endcsname (##1,##2)|##3;{%
\fill[#1] (##1,##2) circle (2pt) node[above](#1-\csname number@point#1\endcsname){##3};}%
}
\newpoint{A}{red}
\begin{document}
\begin{tikzpicture}
\PointA(1,2)|A;
\end{tikzpicture}
\end{document}