たとえば、コマンドに渡される 3 番目の引数を取得したい場合は、 を使用すればよいことがわかりました#3
。質問は、この引数が配列の場合、 for ループなしで配列の要素を読み取るにはどうすればよいかということです。
たとえば、{1,2,3} が 3 番目の引数として渡された場合、その 2 番目の要素をどのように読み取ればよいでしょうか?
注: 常に一定の長さのコンマ区切りの配列が取得されると想定します。
答え1
\documentclass{article}
\def\firstinlist#1,#2,#3\stoplist{#1}
\def\secondinlist#1,#2,#3\stoplist{#2}
\def\thirdinlist#1,#2,#3\stoplist{#3}
\newcommand{\foo}[1]{%
The list has\\
\firstinlist#1\stoplist\\
\secondinlist#1\stoplist\\
\thirdinlist#1\stoplist}
\begin{document}
\noindent\foo{1,2,3}
\end{document}
ループが内部マクロによって実行されるより単純な定義は、xparse
LaTeX3で次のように表される。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\getlistitem}{mm}
{
\clist_item:nn { #2 } { #1 }
}
\ExplSyntaxOff
\newcommand{\foo}[1]{%
The list has\\
\getlistitem{1}{#1}\\
\getlistitem{2}{#1}\\
\getlistitem{3}{#1}}
\begin{document}
\noindent\foo{1,2,3}
\end{document}
答え2
お客様のご要望に沿うと思われる内容は次のとおりです:
\documentclass{article}
\usepackage{etoolbox}% http://ctan.org/pkg/etoolbox
\newcounter{itemnum}
\newcommand{\mymacroA}[3]{%
\setcounter{itemnum}{0}% Start counting from first item
\gdef\seconditem{\relax}%
\renewcommand*{\do}[1]{%
\stepcounter{itemnum}%
\ifnum\value{itemnum}=2\relax
\gdef\seconditem{##1}%
\fi%
}%
\docsvlist{#3}%
}
\makeatletter
\def\extractsecond#1,#2,#3{#2}%
\newcommand{\mymacroB}[3]{%
\gdef\seconditem{\extractsecond#3}%
}
\makeatother
\begin{document}
\mymacroA{a}{b}{1,2,3,4,5}%
\seconditem
\mymacroA{a}{b}{6,1}%
\seconditem
\mymacroA{a}{b}{123}%
\seconditem
\mymacroA{a}{b}{a,\textbf{b},c}%
\seconditem
\mymacroB{a}{b}{1,2,3}%
\seconditem
\mymacroB{a}{b}{6,1,9}%
\seconditem
\mymacroB{a}{b}{a,\textbf{b},c}%
\seconditem
\end{document}
1つ目は、etoolbox
のリスト処理機能。したがって、\mymacroA
指定されたリストを走査し、2 番目の項目を選択して に格納します\seconditem
。
2 番目の実装では、この固定定義に基づいて、類似した固定リストを想定し<first>,<second>,<third>
、2 番目を選択します。マクロのパラメーター テキストを指定できるため、正確にパッチを適用できます。