使用 \SplitList 在新行上拆分

使用 \SplitList 在新行上拆分

我应该传递给\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 会自动将换行符转换为空格(并将任何空格序列折叠为单个空格)。要避免这种情况,您需要在读取输入之前更改换行符的“类别代码”。我们可以使用+vxparse 的(长)逐字参数类型,而不是自己做这件事。这将收集 的参数\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}

相关内容