我想做的事
我想创建\planfigur{<edges>}{<angles>}
一个使用绘制三角形的命令TikZ
。\planfigur
应该有 2 个强制参数,让我指定三角形的边和/或角度(其中 a = alpha、b = beta 和 c = gamma),它们以红色而不是黑色绘制。
例如\planfigur{ab}{bc}
绘制一个黑色三角形,其中边 a 和 b 以及角 beta 和 gamma 为红色。
我使用expl3
和xparse
。我已经阅读过(未来预期 TikZ/PGF 会推出与 expl3 兼容的版本是否合理?expl3
),将和一起使用存在问题tikz
(这是有道理的)。
所以我尝试了一下,并试图超越TikZ
。我有以下想法,但不幸的是它不起作用(1:0 TikZ
:-))。方法是将所有expl3
代码移动到一个新命令中,我可以在其中\tl_if_in:nnT
检查参数。
代码
\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}
错误
!包 pgf 错误:没有已知的名为 0:1 的形状。
请参阅 pgf 包文档以了解解释。输入 H 可立即获得帮助。...
l.70 \planfigur{ac}{a}
答案1
其中一个功能\ExplSyntaxOn
是为冒号赋予类别代码 11(字母),以便将其用作宏名称的一部分。然而,在坐标系中,TikZ 需要类别代码为 12(其他)的冒号。
最简单的方法:您可以使用预定义的坐标\c_colon_str
而不是:
TikZ 的坐标。
之前原有的解决方案\c_colon_str
是:
一个可行的解决方案是定义一个仅包含:
类别代码为 12 的标记列表
\tl_const:Nx \c_edu_colon_tl { \token_to_str:N : }
然后使用所述标记列表\c_edu_colon_tl
而不是:
TikZ 的坐标。
顺便说一句:您的令牌列表\__edu_planfigur_temp
缺少令牌列表的推荐结尾:_tl
。它还缺少推荐的开头\l
或\g
表示它是本地的还是全局的。我会将其重命名为\l__edu_planfigur_temp_tl
。
在 expl3 中,变量通常应该以\l
(local)、\g
(global) 或\c
(constant) 开头,并以变量类型结尾(_tl
对于标记列表、_int
对于整数等等)。
答案2
另外两种可能性
\newcommand*\tikzangle[2]{#1:#2}
…
\ExplSyntaxOn
\draw (0,0) -- (\tikzangle{20}{2cm});
\ExplSyntaxOff
以及更实际的一个
\begingroup
\lccode`\X=`\:
\lowercase{\endgroup
\gdef\tikzangle(#1X#2){#1:#2}}
\ExplSyntaxOn
\draw (0,0) -- \tikzangle(20:2cm);
\ExplSyntaxOff
再补充一个更普遍的说法,“比克尼德的更容易看到”
\def\othercolon{:}
\ExplSyntaxOn
\draw (0,0) -- (20\othercolon2cm);
\ExplSyntaxOff