![Lista de análisis del carácter de espacio ascii](https://rvso.com/image/305767/Lista%20de%20an%C3%A1lisis%20del%20car%C3%A1cter%20de%20espacio%20ascii.png)
He estado usando la funcionalidad de análisis de listas de etoolbox y tengo un caso de uso extraño en el que quiero una lista separada por espacios.
\usepackage{etoolbox}
\DeclareListParser*{\symbolListParser}{<symbol for space character>}
\newcommand{\processSymbolList}[1]{
\symbolListParser{}{#1}
}
No estoy seguro de por dónde empezar a buscar. He husmeado durante un tiempo buscando documentación sobre listas, documentación sobre espacio y documentación sobre caracteres ascii sin éxito.
Entonces, si alguien pudiera decirme cómo hacerlo, dónde buscar o si no es posible, se lo agradecería mucho.
ACTUALIZAR:encontréestepero estaba buscando algo un poco más limpio como lo que quería el OP
ACTUALIZACIÓN2:Gracias a Tobi por la respuesta. Lo he aceptado. a continuación se muestra una versión más general de spacelist que se comporta más como el analizador de listas
\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}
Respuesta1
He aquí un enfoque que utilizaexpl3
\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}
El código utiliza los llamadossecuenciasque se genera dividiendo el Argumento #1
de \spacelist
en espacios, que están ~
en la nueva sintaxis*, mientras que los espacios normales se ignoran. Las lentejuelas se almacenan en una variable local temporalmente denominada \l_tempa_seq
y con ella \seq_map_inline
podemos iterar a través de todos los elementos de la secuencia. El elemento actual se proporciona como código de argumento #1
, aquí se ##1
debe a que el mapeo está anidado dentro de una definición.
Puede reemplazar la \fbox
pieza para que se ajuste a sus necesidades...
*nueva sintaxissignifica la sintaxis introducida con LaTeX3 que actualmente está disponible como expl3
paquete, que se carga mediante xparse
. Para saber más consulta el manual de expl3
o source3
.
Respuesta2
El listofitems
paquete puede proporcionarlo, ya sea en forma renderizada o detokenizada:
\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}
Respuesta3
Puede escribir en dos líneas de macros TeX un enfoque sin paquete para su 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}
Admisión de culpa: el método es frágil si la lista analizada contiene \else
tokens \fi
.
Aquí hay una forma más sólida aún con medios simples. Pero el argumento no debe contener catcode 3 letras 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}