%3F.png)
Ich möchte ein Makro erstellen, nämlich \newpoint{<point name>}{<point style>}
, das Makros wie erstellt \Point<point name>{<x coord>}{<y coord>}{<label>}
.
Ich habe gesehenWie definiert man ein Makro, um ein neues Makro mit einem als Argument übergebenen Namen zu erstellen?Das ist die Hälfte, da nicht gezeigt wird, wie das erstellte Makro Argumente empfängt.
Ich habe es versucht:
\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};}%
}
Aber es hat anscheinend nicht funktioniert Use of \csname doesn't match it's definition
und ehrlich gesagt ... Ich weiß nicht mehr, was ich tue.
Hier ist mein M(N)WIR:
\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}
Antwort1
Wie @daleif bemerkte, setzen Sie es \expandafter
vor \def
. Und um zu erhalten, \thepointA
müssen Sie \csname ... \endcsname
dort verwenden. Ich denke, das ist, was Sie wollen:
\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};}%
}
Und hier ist eine Lösung ohne echten Zähler für jeden Aufruf von \newpoint
, basierend auf der Lösung mit einem Pseudozähler von @egreg, aber mit einer Erhöhung des Pseudozählers bei jedem \point<name>
Aufruf des Makros.
\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};}%
}
Antwort2
Ich sehe keine Notwendigkeit, einen neuen Zähler zuzuweisen, es sei denn, Sie möchten damit rechnen.
\csname
Der wichtigste Punkt ist jedoch, dass Sie es richtig verwenden müssen :
\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}