![Список, анализирующий символ пробела ascii](https://rvso.com/image/305767/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%2C%20%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D0%B9%20%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%20%D0%BF%D1%80%D0%BE%D0%B1%D0%B5%D0%BB%D0%B0%20ascii.png)
Я использую функцию анализа списков из etoolbox, и у меня возник странный случай, когда мне нужен список, разделенный пробелами.
\usepackage{etoolbox}
\DeclareListParser*{\symbolListParser}{<symbol for space character>}
\newcommand{\processSymbolList}[1]{
\symbolListParser{}{#1}
}
Я даже не уверен, с чего начать поиски. Я некоторое время ковырялся в документации о списках, документации о пространстве и документации о символах ASCII, но безрезультатно.
так что если бы кто-нибудь мог мне подсказать, как это сделать, где искать или что это невозможно, я был бы очень признателен.
ОБНОВЛЯТЬ:Я нашелэтотно я искал что-то более чистое, как того хотел автор поста
ОБНОВЛЕНИЕ2:Спасибо Tobi за ответ. Я принял его. Ниже представлена более общая версия spacelist, которая ведет себя больше как синтаксический анализатор списков.
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{ \spacelist }{ mm }{
\seq_set_split:Nnn \l_tmpa_seq { ~ } { #2 }
\seq_map_inline:Nn \l_tmpa_seq {
#1{##1}
}
}
\ExplSyntaxOff
% to use you would write it like:
\spacelist{\fbox}{Boxes and Spaces in a List}
решение1
Вот подход, использующийexpl3
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{ \spacelist }{ m }{
\seq_set_split:Nnn \l_tmpa_seq { ~ } { #1 }
\seq_map_inline:Nn \l_tmpa_seq {
\fbox { ##1 }
}
}
\ExplSyntaxOff
\begin{document}
List: \spacelist{Boxes and Spaces in a List}
\end{document}
В коде используется так называемыйпоследовательностикоторый генерируется путем разделения Аргумента #1
на \spacelist
пробелы, которые находятся ~
в новом синтаксисе*, в то время как обычные пробелы игнорируются. Блестки хранятся в локальной временной переменной с именем \l_tempa_seq
и с помощью \seq_map_inline
мы можем перебирать все элементы последовательности. Текущий элемент задан как код аргумента #1
, здесь он есть, ##1
потому что отображение вложено в определение.
Вы можете заменить \fbox
деталь в соответствии с вашими потребностями…
*новый синтаксисозначает синтаксис, введенный в LaTeX3, который в настоящее время доступен как expl3
упакованный, который загружается xparse
. Чтобы узнать больше, см. руководство expl3
или source3
.
решение2
Пакет listofitems
может предоставить его как в обработанной, так и в детокенизированной форме:
\documentclass{article}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage{listofitems}
\newcommand\spacelist[2][]{
\setsepchar{ }%
\readlist\mylist{#2}%
\showitems#1\mylist%
}
\begin{document}
List: \spacelist{Boxes and \textbf{Spaces} in a List}
Tokens: \spacelist[*]{Boxes and \textbf{Spaces} in a List}
\end{document}
решение3
Вы можете написать в двух строках макросов TeX подход без использования пакетов для достижения вашей цели.
\documentclass{article}
\catcode`z 3
\makeatletter
\newcommand\spacelist[1]{\spacelist@boxit #1 {z} }%
\long\def\spacelist@boxit #1 {\ifx z#1\relax\else
\fbox{#1}\expandafter\spacelist@boxit\fi}
\catcode`z 11
\makeatother
\begin{document}
List: \spacelist{Boxes and Spaces in a List}
\end{document}
Признание вины: метод уязвим, если проанализированный список содержит \else
или \fi
токены.
Вот более надежный способ, но с простыми средствами. Но аргумент не должен содержать каткод из 3 букв Z...
\documentclass{article}
\usepackage[T1]{fontenc}
\catcode`Z 3
\makeatletter
\newcommand\spacelist[1]{\spacelist@getone{}#1 Z }%
\long\def\spacelist@getone #1 {\spacelist@check #1.Z\spacelist@check{#1}}%
\long\def\spacelist@check #1Z#2\spacelist@check#3%
{\if\relax\detokenize{#1}\relax
\expandafter\@gobbletwo % abort parse
\else
%
% #3 contains the searched for item, but with an empty brace pair
% added, which serves to prevent brace removal in processing
% so I am showing here how to remove it with \expandafter/\@gobble
% initial braces are not lost.
%
\fbox{\detokenize\expandafter{\@gobble#3}}%
\fi
\spacelist@getone{}}%
\catcode`Z 11
\makeatother
\begin{document}
List: \spacelist{Boxes {and Spaces} in a {List with \if, \else, \end tokens}}
\end{document}