我想做的事

我想做的事

我想做的事

我想建立一個\planfigur{<edges>}{<angles>}使用 繪製三角形的指令TikZ\planfigur應該有 2 個強制參數,這讓我可以指定三角形的邊和/或角度(其中 a = alpha、b = beta 和 c = gamma),它們以紅色而不是黑色繪製。

例如\planfigur{ab}{bc}繪製一個黑色三角形,其中邊 a 和 b 以及角 beta 和 gamma 為紅色。

規劃圖

我用expl3xparse。我已經讀過(期待未來發布與 expl3 相容的 TikZ/PGF 版本是否合理?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(局部)、\g(全域)或\c(常數)開頭,並以變數類型結尾(_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

添加更通用的一個,比 cgnieder 的“更容易看到”

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

相關內容