Tenho usado a funcionalidade de análise de lista do etoolbox e tenho um caso de uso estranho no qual desejo uma lista separada por espaço.
\usepackage{etoolbox}
\DeclareListParser*{\symbolListParser}{<symbol for space character>}
\newcommand{\processSymbolList}[1]{
\symbolListParser{}{#1}
}
Não tenho certeza por onde começar a procurar. Eu vasculhei por um tempo a documentação sobre listas, documentação sobre espaço e documentação sobre caracteres ASCII sem sucesso.
então, se alguém pudesse me dizer como fazer, onde procurar ou que não é possível, eu realmente apreciaria.
ATUALIZAR:eu encontreiessemas eu estava procurando por algo um pouco mais limpo, como o que o OP queria
ATUALIZAÇÃO2:Obrigado a Tobi pela resposta. Eu aceitei. abaixo está uma versão mais geral da lista de espaços que se comporta mais como o analisador de lista
\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}
Responder1
Aqui está uma abordagem usandoexpl3
\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}
O código usa os chamadossequênciasque é gerado pela divisão do argumento #1
dos \spacelist
espaços at, que estão ~
na nova sintaxe*, enquanto os espaços normais são ignorados. As lantejoulas são armazenadas em uma variável local chamada temporariamente \l_tempa_seq
e com \seq_map_inline
elas podemos iterar por todos os itens da sequência. O item atual é fornecido como argumento code #1
, aqui é ##1
porque o mapeamento está aninhado dentro de uma definição.
Você pode substituir a \fbox
peça para atender às suas necessidades ...
*nova sintaxesignifica a sintaxe introduzida no LaTeX3 que está atualmente disponível como expl3
compactada, que é carregada por xparse
. Para saber mais consulte o manual do expl3
ou source3
.
Responder2
O listofitems
pacote pode fornecê-lo, na forma renderizada ou destokenizada:
\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}
Responder3
Você pode escrever em duas linhas de macros TeX uma abordagem sem pacote para seu objetivo.
\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}
Admissão de culpa: o método é frágil se a lista analisada contém \else
ou \fi
tokens.
Aqui está uma maneira mais robusta ainda com meios simples. Mas o argumento não deve conter catcode 3 letra 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}