내가 하고 싶은 일

내가 하고 싶은 일

내가 하고 싶은 일

\planfigur{<edges>}{<angles>}를 사용하여 삼각형을 그리는 명령을 만들고 싶습니다 TikZ. \planfigur검은색 대신 빨간색으로 그려지는 삼각형의 모서리 및/또는 각도(여기서 a = 알파, b = 베타 및 c = 감마)를 지정할 수 있는 2개의 필수 인수가 있어야 합니다.

예를 들어 \planfigur{ab}{bc}모서리 a와 b, 각도 베타와 감마가 빨간색인 검은색 삼각형을 그립니다.

계획

나는 expl3및 를 사용합니다 xparse. 나는 이미 읽었습니다 (향후 TikZ/PGF의 expl3 호환 릴리스를 기대하는 것이 합리적입니까?expl3), 및 을 함께 사용하는 데 문제가 있다는 것입니다 tikz(말이 됩니다).

그래서 나는 놀면서 한 수 앞서려고 노력했습니다 TikZ. 나는 다음과 같은 아이디어를 가지고 있었는데 불행히도 작동하지 않습니다( TikZ:-)의 경우 1:0). 접근 방식은 모든 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(기타)의 콜론이 필요합니다.

가장 쉬운 방법: TikZ' 좌표 \c_colon_str대신 미리 정의된 좌표를 사용할 수 있습니다 .:

이전에는 원래 솔루션을 \c_colon_str사용할 수 있었습니다.

:작동하는 한 가지 솔루션은 카테고리 코드 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(로컬), \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

관련 정보