Ich möchte gerne einen Befehl schreiben, der eine Art dictionary in der Form {key1: {x1, y1}, key2: {x2, y2}, ...} als Argument bekommt und daraus die Koordinatenlist {x, y} extrahiert um diese dann entweder über einen .list handler oder eine \foreach Kontruktion zu verarbeiten. Zu diesem Zweck wollte ich die einzelnen Elemente mit xstring in Key und Koordinatenliste auftrennen. Leider functioniert diese Vorgehensweise nicht. Ich wüsste gerne, woran es scheitert und wie man es stattdessen angehen sollte.

Hier noch mein Minimal Not Working Example:

\documentclass{standalone}

\usepackage{tikz}
\usepackage{xstring}

\def\coord{\StrBehind{key:{1, 2}}{:}}

\begin{document}

\begin{tikzpicture}
  \foreach \x in {\coord}
  {
    \draw (\x, 0) circle [radius=1cm];
  }
\end{tikzpicture}

\end{document}

gefragt 10 Sep '13, 16:54

carlton87's gravatar image

carlton87
2541711
Akzeptiert-Rate: 66%

bearbeitet 10 Sep '13, 17:35

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k3815


Die Macros von xstring sind nicht expandierbar, weswegen du das Resultat mit dem optionalen Argument am besten in \coord schreibst:

\StrBehing{key:1, 2}{:}[\coord]

Ferner habe ich die { } um \coord in der foreach-Schleife entfernt, damit \coord als Liste gelesen wird und nicht als Element der Liste.

\documentclass[tikz]{standalone}
\usepackage{xstring}
\StrBehind{key:{1, 2}}{:}[\coord]
\begin{document}
\begin{tikzpicture}
  \draw (0,0) -- (1,2);
  \foreach \x in \coord
    \draw (\x, 0) circle [radius=1cm];
\end{tikzpicture}
\end{document}

Wenn du die Syntax {key1: {x1, y1}, key2: {x2, y2}, ...} fest ist, würde ich das tatsächlich mit einer /.list machen (dann muss aber zwingend ein Leerzeichen nachdem : folgen):

\documentclass[tikz]{standalone}
\begin{document}
\begin{tikzpicture}
  \tikzset{myForeach/.code args={#1: #2}{\draw (#2, 0) circle [radius=1cm];}}
  \tikzset{myForeach/.list={key1: {0, 1}, key2: {2, 3}, key3: {4, 1}}}
\end{tikzpicture}
\end{document}
Permanenter link

beantwortet 10 Sep '13, 17:33

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k3815
Akzeptiert-Rate: 53%

Danke für die schnelle Antwort. Die Möglichkeit der Verarbeitung des "Dictionaries" über .code args sieht tatsächlich sehr vielversprechend aus. Beim ersten Teil der Lösung bekomme ich leider nicht das gleiche Ergebnis wie wenn ich {1, 2} statt \coord mit \foreach verwende. Bei \coord zeichnet er nur einen Kreis und den an der Koordinate (1, 2). Irgendwas stimmt da nicht.

(10 Sep '13, 18:03) carlton87

@carlton Ich war mir nicht sicher, ob ich dich bezüglich x, y richtig verstanden habe, da ich dachte, dass du tatsächlich x- und y-Koordinaten meinst (die 0 wäre dann die z-Koordinate). Also: entferne { und } um 1, 2. Wobei ich dann immer noch nicht genau weiß, was das für das andere Beispiel bedeutet ...

(10 Sep '13, 18:13) Qrrbrbirlbel

Entschuldigung, wenn das nicht klar aus meiner Frage hervorgegangen ist. Das mit dem dictionary war nur die Motivation für meine Frage und hat tatsächlich nur wenig mit dem MNWE zu tun. Im MNWE will ich einfach nur aus einem String bestehend aus einem Key der durch ein ":" von einer Liste getrennt ist die Liste in ein macro extrahieren um diese Liste dann in einem \foreach Loop verwenden zu können. Die Listenelemente haben dabei erstmal keine Bedeutung und der Beispiel-Loop war nur zur Illustration.

(10 Sep '13, 18:25) carlton87

Ich habe mal ein Vorgehen ausprobiert, in dem ich die Liste in ( und ) einschließe, also {key: (1, 2)}, und dann die Liste mit \StrBehind{key: (1, 2)}{:}[\temp] gefolgt von \StrBetween{\temp}{(}{)}[\coord] extrahiere. Eine explizite Schachtelung von xstring Befehlen scheint ja nicht möglich zu sein. Wäre dieses Vorgehen vernünftig oder mache ich da etwas, was zu Problemen führen kann?

(10 Sep '13, 18:35) carlton87

Der eigentliche Sinn des ganzen ist der folgende: Ich habe eine längere Pfadkonstruktion, die ich mit pgf Befehlen durchführe, weshalb ein Haufen \pgfpoints{<x>}{<y>} enthalten sind, welche ich in ein Makro bannen möchte. Diesem Makro würde ich die Koordinaten für die pgfpoints Befehle gerne in der Form {<x>, <y>} oder (<x>, <y>) geben. Diese Koordinatenlisten will ich dann später mit \pgfkeys verarbeiten und die x und y Koordinaten jeweils unter dem passenden key in Makros schreiben lassen, die ich dann in einem \newcommand benutzen kann.

(10 Sep '13, 18:43) carlton87
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×731
×24
×21
×3

gestellte Frage: 10 Sep '13, 16:54

Frage wurde gesehen: 9,434 Mal

zuletzt geändert: 10 Sep '13, 18:44