我一直在使用 etoolbox 的列表解析功能,并且我有一个奇怪的用例,我想要一个以空格分隔的列表。
\usepackage{etoolbox}
\DeclareListParser*{\symbolListParser}{<symbol for space character>}
\newcommand{\processSymbolList}[1]{
\symbolListParser{}{#1}
}
我甚至不知道从哪里开始查找。我搜索了一段时间,查看了有关列表的文档、有关空间的文档和有关 ascii 字符的文档,但无济于事。
因此如果有人能告诉我该怎么做、在哪里查找或者这是不可能的,我将不胜感激。
更新:我确实找到了这但我在寻找一些更干净的东西,就像 OP 想要的那样
更新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
标记,则该方法是脆弱的。
这里有一个更强大的方法,仍然使用简单的手段。但参数不应包含 catcode 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}