
私がしたいこと
\planfigur{<edges>}{<angles>}
を使用して三角形を描画するコマンドを作成したいと思いますTikZ
。\planfigur
には 2 つの必須引数が必要です。これにより、黒色ではなく赤色で描画される三角形のエッジや角度 (a = アルファ、b = ベータ、c = ガンマ) を指定できます。
たとえば、\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
実行することの 1 つは、\ExplSyntaxOn
コロン カテゴリ コード 11 (文字) を指定して、マクロ名の一部として使用できるようにすることです。ただし、座標では、TikZ はカテゴリ コード 12 (その他) のコロンを想定しています。
最も簡単な方法: TikZ の座標\c_colon_str
の代わりに定義済み座標を使用できます。:
以前のオリジナルのソリューションは\c_colon_str
次の通りでした:
:
有効な解決策の1つは、カテゴリコード12のみを含むトークンリストを定義することです。
\tl_const:Nx \c_edu_colon_tl { \token_to_str:N : }
そして、TikZ の座標\c_edu_colon_tl
の代わりに、そのトークン リストを使用します。:
ところで、トークン リスト\__edu_planfigur_temp
には、トークン リストの推奨される終了 がありません: _tl
。また、ローカルかグローバルかを示す推奨される開始 または もありません\l
。\g
これを に名前変更します\l__edu_planfigur_temp_tl
。
expl3 では、変数は通常、\l
(local)、\g
(global)、または\c
(constant) で始まり、変数の型 (_tl
トークン リストの場合は 、_int
整数の場合は など) で終わります。
答え2
さらに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