Ergebnis aus l3regex wird nicht korrekt von pgfkeys verarbeitet

Redefinition von Makros, Definition eigener Befehle sowie neuer Umgebungen


derschrecklichesven
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Mo 18. Jan 2021, 15:48

Ergebnis aus l3regex wird nicht korrekt von pgfkeys verarbeitet

Beitrag von derschrecklichesven »

Hallo liebe Leute,
das Problem scheint eher speziell zu sein. Vielleicht kann mir doch jemand helfen. Ich möchte Elemente der Ergebnissequenz z.B. eines Splits an pgfkeys weiterleiten -- entweder an ein eigenes pgfkeys oder über einen optionalen Parameter. Beispielsweise:

\ExplSyntaxOn
\def\quader#1(#2,#3,#4),(#5,#6,#7);{%
	\regex_split:nnNTF { [\[\]] } {#1} \l_seq%
		{ \seq_pop:NN \l_seq \dummy \seq_pop:NN \l_seq \argument } { \def\argument{} }
	\draw[dashed,\argument] (#2,#3,#4) --+ (#5,0,0);
	\draw[dashed,\argument] (#2,#3,#4) --+ (0,#6,0);
	\draw[dashed,\argument] (#2,#3,#4) --+ (0,0,#7);
	\draw[\argument] (#2+#5,#3,#4) --+ (0,#6,0);
	\draw[\argument] (#2+#5,#3,#4) --+ (0,0,#7);
	\draw[\argument] (#2,#3+#6,#4) --+ (#5,0,0);
	\draw[\argument] (#2,#3+#6,#4) --+ (0,0,#7);
	\draw[\argument] (#2,#3,#4+#7) --+ (#5,0,0);
	\draw[\argument] (#2,#3,#4+#7) --+ (0,#6,0);
	\draw[\argument] (#2+#5,#3+#6,#4+#7) --+ (-#5,0,0);
	\draw[\argument] (#2+#5,#3+#6,#4+#7) --+ (0,-#6,0);
	\draw[\argument] (#2+#5,#3+#6,#4+#7) --+ (0,0,-#7);
}
\ExplSyntaxOff

Aufzurufen durch

\quader[green!70!black] (0,0,0),(1,-3,2);

zeichnet in ein 3d-Koordinatensystem einen Quader mit dem Eckpunkt (0,0,0) und einer Diagonale (1,-3,2). Funktioniert auch soweit. Nur wenn ich mehr als ein optionales Argument angebe, werden diese nicht als zwei keys betrachet, sondern als einer mit einem Komma mittendrin. Ein Aufruf von

\quader[green!70!black,thick] (0,0,0),(1,-3,2);

führt zu der Meldung: Package xcolor Error: Undefined color `black,thick'. ...der[green!70!black,thick] (0,0,0),(1,-3,2);

Ich bin ein wenig ratlos, kann mir aber vorstellen, dass es sich um irgendein Expansionsproblem handelt. Ein Herumexperimentieren daran meinerseits blieb aber leider erfolglos.

Das prinzipielle Vorgehen mit dem def möchte ich gerne beibehalten, da es sich als sehr praktisch erwiesen hat, so kann ich Befehle definieren die z.B. in der Form $\punkt A(1,2;3;4)$ aufzurufen sind und zu $A(\,1{,}2\,|\,3\,|\,4\,)$ expandieren.

Viele Grüße,
Sven


Benutzeravatar
cgnieder
Forum-Meister
Forum-Meister
Beiträge: 730
Registriert: Fr 22. Okt 2010, 18:37
Wohnort: Herrenberg
Kontaktdaten:

Re: Ergebnis aus l3regex wird nicht korrekt von pgfkeys verarbeitet

Beitrag von cgnieder »

Ich verstehe nicht ganz, weshalb du \regex_split:nnN brauchst. (Du solltest Dir übrigens in interface3.pdf mal anlesen, wie man Funktionen und Variablen richtig benennt und verwendet. Deine Mischung von epl3 mit klassischem TeX wirkt recht willkürlich…). Ich würde das ganze viel einfacher angehen:

\documentclass{article}
\usepackage{tikz}

\newcommand\svenquader[7]{
  \draw [dashed,#1] (#2,#3,#4) --+ (#5,0,0);
  \draw [dashed,#1] (#2,#3,#4) --+ (0,#6,0);
  \draw [dashed,#1] (#2,#3,#4) --+ (0,0,#7);
  \draw [#1] (#2+#5,#3,#4) --+ (0,#6,0);
  \draw [#1] (#2+#5,#3,#4) --+ (0,0,#7);
  \draw [#1] (#2,#3+#6,#4) --+ (#5,0,0);
  \draw [#1] (#2,#3+#6,#4) --+ (0,0,#7);
  \draw [#1] (#2,#3,#4+#7) --+ (#5,0,0);
  \draw [#1] (#2,#3,#4+#7) --+ (0,#6,0);
  \draw [#1] (#2+#5,#3+#6,#4+#7) --+ (-#5,0,0);
  \draw [#1] (#2+#5,#3+#6,#4+#7) --+ (0,-#6,0);
  \draw [#1] (#2+#5,#3+#6,#4+#7) --+ (0,0,-#7);
}
\NewDocumentCommand\quader
  {O{}>{\SplitArgument{2}{,}}r()>{\SplitArgument{2}{,}}r()}
  {\svenquader{#1}#2#3}

\begin{document}

\begin{tikzpicture}
  \quader[green!70!black](0,0,0)(1,-3,2)
\end{tikzpicture}
\begin{tikzpicture}
  \quader[red,thick](0,0,0)(1,-3,2)
\end{tikzpicture}


\end{document}
test.png
test.png (2.83 KiB) 10346 mal betrachtet
Clemens
Paketauthor

derschrecklichesven
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Mo 18. Jan 2021, 15:48

Re: Ergebnis aus l3regex wird nicht korrekt von pgfkeys verarbeitet

Beitrag von derschrecklichesven »

Hallo Clemens,

ich bedanke mich für deine Antwort. Deine Antwort gefällt mir in ihre Kürze und Eleganz sehr gut. Ich muss zugeben, dass ich die Funktionsweise von expl3 nicht wirklich durchdrungen habe und mein Mischmasch einfach bloß durch "Probieren, bis es klappt" entstanden ist. Meine Basis waren die Dokumentationen expl.pdf und l3regex.pdf, aus denen ich versucht habe, mir das Nötige herauszuziehen. Die Info zu interface3.pdf hilft mir fast noch mehr als dein Code, das ist genau das Dokument, was ich bislang vergeblich gesucht habe.

Ich erahne, wie der DocumentCommand-Quader funktioniert, so ganz durchdrungen habe ich es allerdings noch nicht. Aber das kann ich ja jetzt herausfinden. Vielen herzlichen Dank!

Viele Grüße,
Sven


Benutzeravatar
cgnieder
Forum-Meister
Forum-Meister
Beiträge: 730
Registriert: Fr 22. Okt 2010, 18:37
Wohnort: Herrenberg
Kontaktdaten:

Re: Ergebnis aus l3regex wird nicht korrekt von pgfkeys verarbeitet

Beitrag von cgnieder »

Es gibt noch mehr interessante Dokumente: https://ctan.org/pkg/l3kernel

Für das Verstehen der Argumentbildung von \NewDocumentCommand solltest du dir die Doku zu xparse ansehen: https://ctan.org/pkg/l3packages

Clemens
Paketauthor

derschrecklichesven
Forum-Newbie
Forum-Newbie
Beiträge: 4
Registriert: Mo 18. Jan 2021, 15:48

Re: Ergebnis aus l3regex wird nicht korrekt von pgfkeys verarbeitet

Beitrag von derschrecklichesven »

Ohja, das hilft auch. Danke! Und vor allem, einfach mal mich mal zwingen, etwas konsequenter die Dinge direkt mit latex3 umzusetzen. Vieles ist halt Gewohnheit.


Antworten