
내가 하고 싶은 일
\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