Quantcast
Channel: Fragen von carlton87
Viewing all articles
Browse latest Browse all 6

pgfkeys: Wie nutze ich eine mit xstring generierte Liste in einem .list handler?

$
0
0

Das hier ist eine Nachfolgefrage zu dieser hier. Aufbauend auf Qrrbrbirlbels Antwort, hab ich etwas rumprobiert und wollte versuchen ein "dictionary" der Form {key1: (x1, y1), key2: (x2, y2),... mit Hilfe von pgfkeys so zu verarbeiten, dass ich die einzelnen x und y Koordinaten in eigene macros extrahiere um sie später nutzen zu können.

\documentclass{standalone}

\usepackage[svgnames]{xcolor}
\usepackage{tikz}
\usepackage{xstring}

\newcounter{coordcounter}
\setcounter{coordcounter}{23}

\pgfkeys{
  util/coord extractor/.style={
    util/@coord extractor/.list={#1}
  },
  util/@coord extractor/.code args={#1: #2}{
    \def\tempcoordkey{#1}
    \StrBetween{#2}{(}{)}[\coord]
    \pgfkeys{
      util/@@coord extractor/.list={\coord},
      bonds/counter/set={coordcounter}{23}
    }
  },
  util/@@coord extractor/.code={
    \pgfkeys{
      /bonds/counter/step={coordcounter}, 
      \savedpath/\tempcoordkey/\alph{coordcounter}={#1}
    }
  },
  bonds/counter/set/.code 2 args={\setcounter{#1}{#2}},
  bonds/counter/step/.code={\stepcounter{#1}},
  bonds/bond points/start/x/.store in={\startx},
  bonds/bond points/start/y/.store in={\starty},
  bonds/bond points/mid/x/.store in={\midx},
  bonds/bond points/mid/y/.store in={\midy},
  bonds/bond points/end/x/.store in={\endx},
  bonds/bond points/end/y/.store in={\endy},
  bonds/bond points/.code={
    \def\savedpath{/bonds/bond points}
    \pgfkeys{
      util/coord extractor={#1}
    }
  }
}

\begin{document}

\begin{tikzpicture}
  \pgfkeys{/bonds/bond points={start: (1, 2), mid: (3, 4), end: (5, 6)}}
  \draw (\startx, \starty) circle [radius=1cm];
  \draw (\midx, \midy) circle [radius=2cm];
\end{tikzpicture}

\end{document}

Während ich ein ähnliches Beispiel, bei dem die Koordinaten von { statt ( umhüllt sind und bei dem ich entsprechend auch keinen \StrBetween Befehl benötigt habe um die Koordinaten in eine Listenform zu bringen, zum Laufen bekommen habe, kann ich hier jedoch nicht verstehen, wo das Problem liegt. Ich habe stundenlang rumprobiert, ohne Erfolg. Auch aus der Fehlermeldung werde ich nicht schlauer. Wo ist das Problem bei der Benutzung von \StrBetween{#2}{(}{)}[\coord] um mir eine Liste für den .list handler zu erzeugen - ein Test des so erzeugten Makros \coord in einem \foreach Loop hat nämlich funktioniert und ich dachte beim .list handler werkelt eben ein solcher \foreach Loop im Hintergrund.


Viewing all articles
Browse latest Browse all 6


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>