TikZ 宏以整数列表作为参数

TikZ 宏以整数列表作为参数

我想编写一个宏,将列表作为其部分参数,并想知道如何最好地访问这些列表的各个条目。

例如,我想要类似的东西

\newcommand\mycommand[4]{
\pgfmathsetmacro \n {{#1}}
\pgfmathsetmacro \k {{#2}}

\foreach \i in {\k,...,\n} {
 \draw (#3[\i],0) -- (#4[\i]) {};
}
}

这将采取如下参数

\mycommand{10}{3}{1,2,5}{6,9,10}

我需要分别访问这两个列表,因此使用成对列表似乎不是一个选择。基本上,我的问题是如何使部分 #3[\i] 工作,它应该返回列表中的项目编号 i,这是函数的第三个参数。

答案1

这是对我和原帖者之间的评论的后续。

由于没有提供完整的代码,而且我根本不知道tikz,所以我得到了我的另一个答案\foreach 问题并展示如何将readarray包的\getargC宏中的参数插入到\draw\node宏中,使用循环索引作为参数。

鉴于先前的调用\getargsC{15 43 35 21 1},使用该代码的特定部分是

\foreach \y in {1,2,...,\the\numexpr\CylGrad-1}
    {\draw[semithick] (0,\y/\CylGrad)
        arc (270:260:1 and \CylRatio) ;
    \draw[semithick] (0,\y/\CylGrad)
        arc (270:280:1 and \CylRatio) (0.2,\y/\CylGrad)
        node[right,yslant=\CylRatio](\y){\footnotesize \myarg{\y}};% <--\myarg used here
    \node at (0,\y/\CylGrad){\myarg{\numexpr\y+1}};}; % <--\myarg used here
\fi

这是完整的 MWE。

\documentclass[tikz]{standalone}
\usepackage{readarray}
\def\myarg#1{\csname arg\romannumeral#1\endcsname}

\pgfkeys{/tikz/.cd,
  CylCol/.store in=\CylCol,
  CylCol=gray,
  CylFillCol/.store in=\CylFillCol,
  CylFillCol=blue,
  CylFill/.store in=\CylFill,
  CylFill=0,
  CylRatio/.store in=\CylRatio,
  CylRatio=.08,  
  CylGrad/.store in=\CylGrad,
  CylGrad=5,
  CylSecondGrad/.store in=\CylSecondGrad,
  CylSecondGrad=0,
   }

\newcommand{\TikzCylindre}[1][]{%
    \begin{scope}[#1]
    % Grisé des surfaces du cylindre.
    \shade[left color=\CylCol!30, right color=\CylCol!5]%
         (-1,1)--(-1,0) arc (180:360:1 and \CylRatio) --(1,0) -- (1,1);
    \shade[left color=\CylCol!5, right color=\CylCol!30]%
        (0,1) ellipse (1 and \CylRatio);
    \draw[\CylCol!50] (1,0) arc (0:180:1 and \CylRatio)--(-1,0) ;

    % Remplissage du cylindre
    \shade[left color=\CylFillCol!40, right color=\CylFillCol!10]%
         (-1,\CylFill)--(-1,0) arc (180:360:1 and \CylRatio) --(1,0) -- (1,\CylFill);
    \fill[color=\CylFillCol!25] (0,\CylFill) ellipse (1 and \CylRatio);
    \draw[\CylFillCol!50!black!50] (1,0) arc (0:180:1 and \CylRatio)--(-1,0) ;
    \draw[\CylFillCol!50!black!50] (0,\CylFill) ellipse (1 and \CylRatio) ;

    % dessin des bords du cylindre
    \draw[semithick] (-1,1)--(-1,0) arc (180:360:1 and \CylRatio)--(1,0)--(1,1);
    \draw[semithick] (0,1) ellipse (1 and \CylRatio);   

        \begin{scope}[shift={(0,-\CylRatio)}]
        \ifnum\CylGrad>0
        \foreach \y in {1,2,...,\the\numexpr\CylGrad-1}
            {\draw[semithick] (0,\y/\CylGrad)
                arc (270:260:1 and \CylRatio) ;
            \draw[semithick] (0,\y/\CylGrad)
                arc (270:280:1 and \CylRatio) (0.2,\y/\CylGrad)
                node[right,yslant=\CylRatio](\y){\footnotesize \myarg{\y}};% <--\myarg used here
            \node at (0,\y/\CylGrad){\myarg{\numexpr\y+1}};}; % <--\myarg used here
        \fi

        \ifnum\CylSecondGrad>0
        \foreach \y in {1,2,...,\the\numexpr\CylSecondGrad}
        {\draw(0,\y/\CylSecondGrad) arc (270:265:1 and \CylRatio) ;
        \draw (0,\y/\CylSecondGrad) arc (270:275:1 and \CylRatio) ;
        };
        \fi
        \end{scope} ;

    \end{scope}
    }

\begin{document}

\getargsC{15 43 35 21 1}
\begin{tikzpicture}

    \TikzCylindre[x=1.5cm,y=4cm,CylFill=.8,CylSecondGrad=10] ;

\end{tikzpicture}

\end{document}

在此处输入图片描述

相关内容