Ich habe die Listenanalysefunktion von etoolbox verwendet und habe einen seltsamen Anwendungsfall, in dem ich eine durch Leerzeichen getrennte Liste möchte.
\usepackage{etoolbox}
\DeclareListParser*{\symbolListParser}{<symbol for space character>}
\newcommand{\processSymbolList}[1]{
\symbolListParser{}{#1}
}
Ich bin mir nicht sicher, wo ich überhaupt mit der Suche beginnen soll. Ich habe eine Weile in der Dokumentation zu Listen, in der Dokumentation zu Speicherplatz und in der Dokumentation zu ASCII-Zeichen herumgestöbert, aber ohne Erfolg.
Ich wäre also sehr dankbar, wenn mir jemand sagen könnte, wie das geht, wo ich suchen muss oder dass es nicht möglich ist.
AKTUALISIEREN:Ich fandDasaber ich suchte nach etwas Saubererem, so wie das, was der OP wollte
UPDATE2:Danke an Tobi für die Antwort. Ich habe sie akzeptiert. Unten ist eine allgemeinere Version von Spacelist, die sich mehr wie der Listenparser verhält
\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}
Antwort1
Hier ist ein Ansatz mitexpl3
\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}
Der Code verwendet sog.Sequenzen#1
welches durch Aufteilen des Arguments von \spacelist
Leerzeichen erzeugt wird , die ~
in der neuen Syntax* stehen, während normale Leerzeichen ignoriert werden. Die Pailletten werden in einer lokalen, temporären Variable namens gespeichert \l_tempa_seq
und mit \seq_map_inline
können wir durch alle Elemente der Sequenz iterieren. Das aktuelle Element wird als Argumentcode angegeben #1
, hier ist es, ##1
weil die Zuordnung in einer Definition verschachtelt ist.
Sie können das \fbox
Teil entsprechend Ihren Anforderungen austauschen …
*neue Syntaxbedeutet die mit LaTeX3 eingeführte Syntax, die derzeit als expl3
gepackte Version verfügbar ist und von geladen wird xparse
. Weitere Informationen finden Sie im Handbuch von expl3
oder source3
.
Antwort2
Das listofitems
Paket kann es entweder in gerenderter oder detokenisierter Form bereitstellen:
\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}
Antwort3
Sie können in zwei Zeilen TeX-Makros einen paketfreien Ansatz für Ihr Ziel schreiben.
\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}
Schuldeingeständnis: Die Methode ist instabil, wenn die analysierte Liste \else
oder \fi
Token enthält.
Hier ist ein robusterer Weg mit einfachen Mitteln. Das Argument sollte jedoch nicht den Catcode 3 Buchstaben Z enthalten ...
\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}