O que eu quero fazer

O que eu quero fazer

O que eu quero fazer

Quero criar um comando \planfigur{<edges>}{<angles>}que desenhe um triângulo usando TikZ. \planfigurdeve ter 2 argumentos obrigatórios, que me permitem especificar arestas e/ou ângulos (onde a = alfa, b = beta e c = gama) do triângulo, que são desenhados em vermelho em vez de preto.

Por exemplo. \planfigur{ab}{bc}desenha um triângulo preto, onde as arestas aeb e os ângulos beta e gama são vermelhos.

figura do plano

Eu uso expl3e xparse. Eu já li (É razoável esperar uma versão compatível com expl3 do TikZ/PGF no futuro?), que há problemas no uso expl3e tikzem conjunto (o que faz sentido).

Então eu brinquei e tentei ser mais esperto TikZ. Tive a seguinte ideia, que infelizmente não funciona (1:0 para TikZ:-)). A abordagem é mover todo expl3o código para um novo comando, onde posso usar \tl_if_in:nnTpara verificar os argumentos.

Código

\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}

Erro

! Erro pgf do pacote: nenhuma forma chamada 0:1 é conhecida.

Veja a documentação do pacote pgf para explicação. Digite H para ajuda imediata. ...
l.70 \planfigur{ac}{a}

Responder1

Uma das coisas \ExplSyntaxOné fornecer o código de categoria de dois pontos 11 (letra) para que possa ser usado como parte de nomes de macros. Nas coordenadas, TikZ, entretanto, espera dois pontos com o código de categoria 12 (outro).

A maneira mais fácil: você pode usar as coordenadas predefinidas \c_colon_strem vez :das coordenadas do TikZ.

A solução original antes \c_colon_strestava disponível:

Uma solução que funciona é definir uma lista de tokens que contenha apenas um :com código de categoria 12

\tl_const:Nx \c_edu_colon_tl { \token_to_str:N : } 

e então use a referida lista de tokens \c_edu_colon_tlem vez :das coordenadas do TikZ.


A propósito: sua lista de tokens \__edu_planfigur_tempnão possui o final recomendado para uma lista de tokens: _tl. Também falta o início recomendado \lou \gque indica se é local ou global. Eu renomearia para \l__edu_planfigur_temp_tl.

Em expl3 variáveis ​​geralmente devem começar com \l(local), \g(global) ou \c(constante) e terminar com o tipo de variável ( _tlpara uma lista de tokens, _intpara um número inteiro e assim por diante).

Responder2

Mais duas possibilidades

\newcommand*\tikzangle[2]{#1:#2}
\ExplSyntaxOn
\draw (0,0) -- (\tikzangle{20}{2cm});
\ExplSyntaxOff

e um mais prático

\begingroup
\lccode`\X=`\:
\lowercase{\endgroup
  \gdef\tikzangle(#1X#2){#1:#2}}
\ExplSyntaxOn
\draw (0,0) -- \tikzangle(20:2cm);
\ExplSyntaxOff

Para adicionar o mais geral, “mais fácil de ver” do que o de cgnieder

\def\othercolon{:}
\ExplSyntaxOn
\draw (0,0) -- (20\othercolon2cm);
\ExplSyntaxOff

informação relacionada