Was ich machen will; was ich vorhabe zu tun

Was ich machen will; was ich vorhabe zu tun

Was ich machen will; was ich vorhabe zu tun

Ich möchte einen Befehl erstellen \planfigur{<edges>}{<angles>}, der ein Dreieck zeichnet TikZ. \planfigurEr 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.

planfigur

Ich benutze expl3und 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 expl3und 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 \ExplSyntaxOnbesteht 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_stranstelle :der in TikZ angegebenen Koordinaten verwenden.

Ursprüngliche Lösung, die vorher \c_colon_strverfü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_tlanstelle :der Koordinaten von TikZ.


Übrigens: Ihrer Tokenliste \__edu_planfigur_tempfehlt das empfohlene Ende für eine Tokenliste: _tl. Außerdem fehlt der empfohlene Anfang \loder \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 ( _tlfür eine Tokenliste, _intfü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

verwandte Informationen