使用列表定义对象的最佳方法

使用列表定义对象的最佳方法

这个想法是用列表来定义圆形或三角形之类的对象。我做了这个:

\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 ... \endcsname1是可扩展的。\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}

在此处输入图片描述


脚注

  1. 由于c参数类型。

相关内容