Como criar uma macro que crie outras macros (que receba argumentos)?

Como criar uma macro que crie outras macros (que receba argumentos)?

Quero criar uma macro, ou seja \newpoint{<point name>}{<point style>}, que crie macros como \Point<point name>{<x coord>}{<y coord>}{<label>}.

eu tenho vistoComo definir uma macro para criar uma nova macro com um nome passado como argumento?que está na metade pois não mostra como fazer a macro criada receber argumentos.

Tentei:

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

Mas não funcionou, aparentemente Use of \csname doesn't match it's definitione sinceramente... não sei mais o que estou fazendo.

Aqui está meu M(N)NÓS:

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

Responder1

Como observou @daleif, coloque \expandafterantes de \def. E para conseguir \thepointAvocê tem que usar \csname ... \endcsnamelá. Eu acho que é isso que você quer:

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

E aqui está uma solução sem contador real para cada chamada de \newpoint, baseada na solução com pseudo-contador de @egreg, mas com incremento do pseudo-contador, cada vez que a \point<name>macro é chamada.

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

Responder2

Não vejo necessidade de alocar um novo contador, a menos que você queira fazer aritmética com ele.

O ponto principal, porém, é que você precisa usar \csnameda maneira certa:

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

informação relacionada