
O que eu quero fazer
Quero criar um comando \planfigur{<edges>}{<angles>}
que desenhe um triângulo usando TikZ
. \planfigur
deve 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.
Eu uso expl3
e xparse
. Eu já li (É razoável esperar uma versão compatível com expl3 do TikZ/PGF no futuro?), que há problemas no uso expl3
e tikz
em 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 expl3
o código para um novo comando, onde posso usar \tl_if_in:nnT
para 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_str
em vez :
das coordenadas do TikZ.
A solução original antes \c_colon_str
estava 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_tl
em vez :
das coordenadas do TikZ.
A propósito: sua lista de tokens \__edu_planfigur_temp
não possui o final recomendado para uma lista de tokens: _tl
. Também falta o início recomendado \l
ou \g
que 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 ( _tl
para uma lista de tokens, _int
para 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