
我想做的事
我想建立一個\planfigur{<edges>}{<angles>}
使用 繪製三角形的指令TikZ
。\planfigur
應該有 2 個強制參數,這讓我可以指定三角形的邊和/或角度(其中 a = alpha、b = beta 和 c = gamma),它們以紅色而不是黑色繪製。
例如\planfigur{ab}{bc}
繪製一個黑色三角形,其中邊 a 和 b 以及角 beta 和 gamma 為紅色。
我用expl3
和xparse
。我已經讀過(期待未來發布與 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