Ответ 1
Используя ссылку Роберто, я пришел к этому решению:
\makeatletter
% Functional foreach construct
% #1 - Function to call on each comma-separated item in #3
% #2 - Parameter to pass to function in #1 as first parameter
% #3 - Comma-separated list of items to pass as second parameter to function #1
\def\foreach#1#2#3{%
\@[email protected]{#1}{#2}#3,\@[email protected]%
}
% Internal helper function - Eats one input
\def\@swallow#1{}
% Internal helper function - Checks the next character after #1 and #2 and
% continues loop iteration if \@[email protected] is not found
\def\@[email protected]#1#2{%
\@ifnextchar\@[email protected]%
{\@swallow}%
{\@foreach{#1}{#2}}%
}
% Internal helper function - Calls #1{#2}{#3} and recurses
% The magic of splitting the third parameter occurs in the pattern matching of the \def
\def\@foreach#1#2#3,#4\@[email protected]{%
#1{#2}{#3}%
\@[email protected]{#1}{#2}#4\@[email protected]%
}
\makeatother
Пример использования:
% Example-function used in foreach, which takes two params and builds hrefs
\def\makehref#1#2{\href{#1/#2}{#2}}
% Using foreach by passing #1=function, #2=constant parameter, #3=comma-separated list
\foreach{\makehref}{http://stackoverflow.com}{2409851,2408268}
% Will in effect do
\href{http://stackoverflow.com/2409851}{2409851}\href{http://stackoverflow.com/2408268}{2408268}