Разделить параметры через запятую в LaTeX

Я пытаюсь создать команду, похожую на LaTeX \cite{}, которая принимает список таких параметров, разделенных запятыми.

\cite{Wall91, Schwartz93}

Я хотел бы передать каждый элемент в списке, разделенном запятыми, который параметр представляет другой команде, и вернуть конкатенацию отдельных результатов. Я представляю, что это будет примерно так:

\newcommand{\mycite}[1]{%
  \@for\var:=\split{#1} do{%
    \processCitation{\var}%
  }%
}

Литература по манипуляциям со строками, переменным и циклам в LaTeX была бы отличной!

Также: есть ли способ снова объединить отдельные результаты с помощью запятых?

Спасибо!


person Christopher Oezbek    schedule 08.03.2010    source источник


Ответы (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{%
  \@test@foreach{#1}{#2}#3,\@end@token%
}

% 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 \@end@token is not found 
\def\@test@foreach#1#2{%
  \@ifnextchar\@end@token%
    {\@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\@end@token{%
  #1{#2}{#3}%
  \@test@foreach{#1}{#2}#4\@end@token%
}

\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}
person Christopher Oezbek    schedule 09.03.2010
comment
И как это использовать? Не могли бы вы привести пример? - person AVB; 09.03.2010
comment
Спасибо за пример! +1 за вопрос и ответ на оба. Не могли бы вы взглянуть сюда: stackoverflow.com/questions/2389081 Может быть, у вас возникнет идея. - person AVB; 09.03.2010
comment
Без проблем. Спасибо за голос. Посмотрите на решение, которое я дал в вашем посте! - person Christopher Oezbek; 09.03.2010
comment
Это прекрасно работает. Однако он не работает для передачи строк, содержащих символы подчеркивания, которые не являются текстом (например, ссылки с символами подчеркивания). Я думаю, я не должен этого делать? - person vy32; 27.12.2020