私がしたいこと

私がしたいこと

私がしたいこと

\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

関連情報