这个想法是用列表来定义圆形或三角形之类的对象。我做了这个:
\documentclass{article}
\usepackage{xparse,tikz}
\usetikzlibrary{through}
\ExplSyntaxOn
\NewDocumentCommand{\newList}{m}
{\seq_new:c { l_am_list_#1_seq }}
\NewDocumentCommand{\addToList}{mm}
{\seq_put_right:cn { l_am_list_#1_seq } { #2 }}
\NewDocumentCommand{\getFromList}{mm}
{\seq_item:cn { l_am_list_#1_seq } { #2 }}
\NewDocumentCommand{\drawcircle}{m}
{\node [draw] at (\getFromList{#1}{1}) [circle~through={(\getFromList{#1}{2})}] {};}
\ExplSyntaxOff
\begin{document}
\newList{C_1}
\addToList{C_1}{A}
\addToList{C_1}{B}
\newList{C_2}
\addToList{C_2}{B}
\addToList{C_2}{C}
\begin{tikzpicture}
\coordinate (A) at (0,0);
\coordinate (B) at (2,2);
\coordinate (C) at (0,-3);
\drawcircle{C_1}
\drawcircle{C_2}
\end{tikzpicture}
\end{document}
也许我的想法不太好。列表是正确的工具吗?
答案1
为了使用\getFromList
这种方式,必须可扩展。根据具体实施,这可能实现,也可能不实现。就您而言,这是可能的,因为您\getFromList
仅使用\seq_item:Nn
和隐式\csname ... \endcsname
,1是可扩展的。\seq_item:Nn
由于其文档中的星号,它本身也是可扩展的(请参阅文档约定在界面3.pdf,2020-04-06 版本第 4 页):
因此,您只需\getFromList
使用\NewExpandableDocumentCommand
(\NewDocumentCommand
即可使其成为\protected
宏;因此,它不会在内部\edef
和朋友中扩展)声明您的命令。
\documentclass{article}
\usepackage{xparse,tikz}
\usetikzlibrary{through}
\ExplSyntaxOn
\NewDocumentCommand{\newList}{m}
{
\seq_new:c { l_am_list_#1_seq }
}
\NewDocumentCommand{\addToList}{mm}
{
\seq_put_right:cn { l_am_list_#1_seq } {#2}
}
\NewExpandableDocumentCommand{\getFromList}{mm}
{
\seq_item:cn { l_am_list_#1_seq } {#2}
}
\NewDocumentCommand{\drawcircle}{m}
{
\node [draw] at (\getFromList{#1}{1})
[circle~through={(\getFromList{#1}{2})}] {};
}
\ExplSyntaxOff
\begin{document}
\newList{C_1}
\addToList{C_1}{A}
\addToList{C_1}{B}
\newList{C_2}
\addToList{C_2}{B}
\addToList{C_2}{C}
\begin{tikzpicture}
\coordinate (A) at (0,0);
\coordinate (B) at (2,2);
\coordinate (C) at (0,-3);
\drawcircle{C_1}
\drawcircle{C_2}
\end{tikzpicture}
\end{document}
脚注
- 由于
c
参数类型。