我想编写一个宏,将列表作为其部分参数,并想知道如何最好地访问这些列表的各个条目。
例如,我想要类似的东西
\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}