我想做的事

我想做的事

我想做的事

我想创建\planfigur{<edges>}{<angles>}一个使用绘制三角形的命令TikZ\planfigur应该有 2 个强制参数,让我指定三角形的边和/或角度(其中 a = alpha、b = beta 和 c = gamma),它们以红色而不是黑色绘制。

例如\planfigur{ab}{bc}绘制一个黑色三角形,其中边 a 和 b 以及角 beta 和 gamma 为红色。

平面图

我使用expl3xparse。我已经阅读过(未来预期 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

相关内容