¿Cómo crear una macro que cree otras macros (que tome argumentos)?

¿Cómo crear una macro que cree otras macros (que tome argumentos)?

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 definitiony 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 \expandafterantes \def. Y para conseguirlo \thepointAhay que utilizarlo \csname ... \endcsnameallí. 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 \csnamede 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}

información relacionada