我应该传递给\SplitList
它什么来让它在新行上拆分字符串?我试过\n
和\r
,但都不起作用。
我使用的代码是
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand {\dothings}
{ > { \SplitList { \r } } m }
{ \tl_map_inline:nn {#1} { \fbox{##1} } }
\ExplSyntaxOff
\begin{document}
\dothings{
Takes several words as argument
Stuff
meow
meow
}
\end{document}
答案1
通常情况下,TeX 会自动将换行符转换为空格(并将任何空格序列折叠为单个空格)。要避免这种情况,您需要在读取输入之前更改换行符的“类别代码”。我们可以使用+v
xparse 的(长)逐字参数类型,而不是自己做这件事。这将收集 的参数\dothings
作为字符,既不解释命令也不解释特殊字符。之后,我们在每个 处进行拆分^^M
(为了提供 作为 的参数\SplitList
,我使用\iow_char:N \^^M
,它会扩展为该字符)。
因此,在文档主体中,#1
表示一个标记列表,其项目是输入的每一行。我们循环遍历所有行。省略空行。然后执行您想要执行的操作,例如,\fbox
使用\tl_rescan:nn { }
从原始字符(我们收集的字符,不关心命令和特殊字符)返回到标记(命令和特殊字符以及普通字符)。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\dothings}
{ > { \exp_args:Nx \SplitList { \iow_char:N \^^M } } +v }
{
\tl_map_inline:nn {#1}
{
\tl_if_blank:nF { ##1 } % ignore blank lines (first and last)
{
\tl_rescan:nn { } { \fbox{##1} }
% or \fbox { \tl_rescan:nn { } {##1} }
}
}
}
\ExplSyntaxOff
\begin{document}
\dothings{
Takes several words as argument
Stuff
meow
meow
}
\end{document}