Цикл по списку с разделителем, отличным от запятой

Цикл по списку с разделителем, отличным от запятой

Я пытаюсь выполнить итерацию по списку, разделителем которого не является запятая. Причина, по которой запятые не используются в качестве разделителей, заключается в том, что они являются частью полезной нагрузки. Есть ли способ выполнить итерацию по списку, разделителем которого является точка с запятой (или любой другой разделитель)?

До сих пор я пытался

\documentclass{article}

\makeatletter
\newcommand{\ls}[1]{\@for\tmp:=#1 \do{\tmp}}
\makeatother

\begin{document}

\ls{(a,b);(c,d)}

\end{document}

Поэтому я хотел бы выполнить цикл по кортежам, разделенным точкой с запятой, т. е. (a,b) и (c,d).

Редактировать: Я также пытался найти какую-нибудь документацию по \@for, но не смог ее найти.

решение1

Имеет etoolboxмного интересных функций, включая создание парсеров списков. См. также версию без звездочек.

\documentclass[a4paper]{memoir}
\usepackage{etoolbox}
\begin{document}
\newcommand\handler[1]{item: #1\par}
\DeclareListParser*\forsemicolonlist{;}
\forsemicolonlist\handler{(a,b);(c,d);(e,f)}
\end{document}

решение2

Например, вы можете использовать этот код:

\def\ls#1{\lsA#1;;}
\def\lsA#1;{\ifx;#1;\else \dosomething{#1}\expandafter\lsA\fi}
\def\dosomething#1{\message{I am doing something with #1}}

\ls{(a,b);(c,d);(e,f)}

Связанный контент