Перейти к главному содержимому

LaTeX mbox на список

Есть: строка, разделенная запятыми.

Надо: завернуть каждый элемент отдельно в функцию (например, в \mbox) и собрать строку обратно, возможно с другими разделителями.

\ExplSyntaxOn

\NewDocumentCommand{\MBoxingList}{O{,\ }m}
{
  \seq_clear_new:N \l__in_seq
  \seq_set_from_clist:Nn \l__in_seq {#2}
  \seq_set_map:NNn \l__in_seq \l__in_seq {\mbox{##1}}
  \seq_use:Nn \l__in_seq {#1}
%  \quad\seq_count:N \l__in_seq
}

\ExplSyntaxOff

Использовать так: `\expanded{\MBoxingList[, ]{123, 123, 5234, 6543}}

Как вариант определить через \NewExpandableDocumentCommand, но тогда вызывать без \expanded и могут быть сюрпризы если исходная строка передается не явно, а определена командой.

P.S. Вроде и работает, но с этим expansion что-нибудь да не нравится. В общем, глаз да глаз.

P.P.S. Можно попробовать через пакет listofitems.

P.P.P.S Есть какое-то решение на классическом синтаксисе:

\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

%% Функция для использования
\def\makembox#1#2{\mbox{#2}, }