
Was ich machen will; was ich vorhabe zu tun
Ich möchte einen Befehl erstellen \planfigur{<edges>}{<angles>}
, der ein Dreieck zeichnet TikZ
. \planfigur
Er sollte zwei obligatorische Argumente haben, mit denen ich die Kanten und/oder Winkel (wobei a = Alpha, b = Beta und c = Gamma) des Dreiecks angeben kann, die in Rot statt in Schwarz gezeichnet werden.
Zeichnet z. B. \planfigur{ab}{bc}
ein schwarzes Dreieck, wobei die Kanten a und b und die Winkel beta und gamma rot sind.
Ich benutze expl3
und xparse
. Ich habe bereits gelesen (Ist es vernünftig, in Zukunft mit einer expl3-kompatiblen Version von TikZ/PGF zu rechnen?), dass es Probleme bei der gemeinsamen Verwendung von expl3
und gibt tikz
(was Sinn macht).
Also habe ich ein bisschen herumgespielt und versucht, auszutricksen TikZ
. Dabei kam mir folgende Idee, die leider nicht funktioniert (1:0 für TikZ
:-)). Der Ansatz ist, den gesamten Code in einen neuen Befehl zu verschieben expl3
, mit dem ich die Argumente überprüfen kann \tl_if_in:nnT
.
Code
\documentclass{article}
\usepackage{expl3, xparse}
\usepackage{tikz}
\usetikzlibrary{calc}
\ExplSyntaxOn
\tl_new:N \__edu_planfigur_temp
\DeclareDocumentCommand \planfigurLines { m } {
\tl_clear:N \__edu_planfigur_temp
\tl_if_in:nnT {#1} {a} {
\tl_put_right:Nn \__edu_planfigur_temp {\draw (b) -- (c);}
}
\tl_if_in:nnT {#1} {b} {
\tl_put_right:Nn \__edu_planfigur_temp {\draw (a) -- (c);}
}
\tl_if_in:nnT {#1} {c} {
\tl_put_right:Nn \__edu_planfigur_temp {\draw (a) -- (b);}
}
\tl_use:N \__edu_planfigur_temp
}
\DeclareExpandableDocumentCommand \planfigurAngles { m } {
\tl_if_in:nnT {#1} {a} {
\tl_put_right:Nn \__edu_planfigur_temp {\draw ($(a) + (0:1)$) arc (0:40:1) ($(a) + (20:0.7)$) node {$\alpha$};}
}
\tl_if_in:nnT {#1} {b} {
\tl_put_right:Nn \__edu_planfigur_temp {\draw ($(b) + (120:1)$) arc (120:180:1) ($(b) + (150:0.7)$) node {$\beta$};}
}
\tl_if_in:nnT {#1} {c} {
\tl_put_right:Nn \__edu_planfigur_temp {\draw ($(c) + (220:1)$) arc (220:300:1) ($(c) + (260:0.65)$) node {$\gamma$};}
}
\tl_use:N \__edu_planfigur_temp
}
\ExplSyntaxOff
\DeclareExpandableDocumentCommand \planfigur { m m } {
\begin{tikzpicture}[scale=0.65, line join=round, thick]
\coordinate (a) at (0,0);
\coordinate (b) at (5,0);
\coordinate (c) at (3.37, 2.83);
\draw (a) -- node[below] {$c$} (b) -- node[above right] {$a$} (c) -- node[above left] {$b$} (a) -- cycle;
\draw (a) node[left] {$A$};
\draw (b) node[right] {$B$};
\draw (c) node[above] {$C$};
\begin{scope}[color=red, fill=red!25, very thick]
\planfigurLines{#1}
\planfigurAngles{#2}
\end{scope}
\end{tikzpicture}
}
\begin{document}
\planfigur{ac}{a}
\end{document}
Fehler
! Paket-pgf-Fehler: Keine Form mit dem Namen 0:1 bekannt.
Eine Erklärung finden Sie in der Dokumentation zum pgf-Paket. Geben Sie H ein, um sofort Hilfe zu erhalten. ...
l.70 \planfigur{ac}{a}
Antwort1
Eine der Maßnahmen \ExplSyntaxOn
besteht darin, dem Doppelpunkt den Kategoriecode 11 (Buchstabe) zuzuweisen, damit er als Teil von Makronamen verwendet werden kann. In Koordinaten erwartet TikZ jedoch einen Doppelpunkt mit dem Kategoriecode 12 (anderes).
Der einfachste Weg: Sie können die vordefinierten \c_colon_str
anstelle :
der in TikZ angegebenen Koordinaten verwenden.
Ursprüngliche Lösung, die vorher \c_colon_str
verfügbar war:
Eine Lösung, die funktioniert, ist die Definition einer Tokenliste, die nur ein :
mit dem Kategoriecode 12 enthält.
\tl_const:Nx \c_edu_colon_tl { \token_to_str:N : }
und verwenden Sie dann die besagte Token-Liste \c_edu_colon_tl
anstelle :
der Koordinaten von TikZ.
Übrigens: Ihrer Tokenliste \__edu_planfigur_temp
fehlt das empfohlene Ende für eine Tokenliste: _tl
. Außerdem fehlt der empfohlene Anfang \l
oder \g
, der angibt, ob es sich um eine lokale oder globale Liste handelt. Ich würde sie in umbenennen \l__edu_planfigur_temp_tl
.
In expl3 sollten Variablen im Allgemeinen entweder mit \l
(lokal), \g
(global) oder \c
(konstant) beginnen und mit dem Variablentyp enden ( _tl
für eine Tokenliste, _int
für eine Ganzzahl usw.).
Antwort2
Zwei weitere Möglichkeiten
\newcommand*\tikzangle[2]{#1:#2}
…
\ExplSyntaxOn
\draw (0,0) -- (\tikzangle{20}{2cm});
\ExplSyntaxOff
und eine praktischere
\begingroup
\lccode`\X=`\:
\lowercase{\endgroup
\gdef\tikzangle(#1X#2){#1:#2}}
\ExplSyntaxOn
\draw (0,0) -- \tikzangle(20:2cm);
\ExplSyntaxOff
Um noch die allgemeinere Aussage hinzuzufügen: „leichter zu sehen“ als cgnieders
\def\othercolon{:}
\ExplSyntaxOn
\draw (0,0) -- (20\othercolon2cm);
\ExplSyntaxOff