迭代換行符分隔的列表

迭代換行符分隔的列表

就我的目的而言,每行給出一個元素(用 ASCII 分隔)的清單會很方便\n。我想迭代這樣一個列表。像這樣的東西:

\begin{itemize}

\foreachperline{
foo
   bar, baz
abcdef \emph{test}
}{\item TEST#1END}

\end{itemize}

這會產生:

  • 測試fooEND

  • 測試吧,bazEND

  • 測試表定義測試結尾

我希望\foreachperline完全按照上面的方式工作,忽略第一個和最後一個換行符,如果這會變得混亂,下面的也可以

\foreachperline{foo
   bar, baz
abcdef \emph{test}}{\item TEST#1END}

明確標記行尾也是可以接受的(優於選項 2,但不優於選項 1),如下所示

\foreachperline{
foo\\
   bar, baz\\
abcdef \emph{test}\\
}{\item TEST#1END}

請注意,其中沒有空格,TEST#1END但根據行的內容,輸出中存在空格(請參閱該bar行)。

#1用作佔位符並不是必需的。像這樣的事情也沒關係。

\foreachperline{
foo
bar, baz
abcdef \emph{test}
}{\item TEST\placeholder{}END}

語法不一定是單一宏。像這樣的事情也沒關係。

\forthingy \i \in {...}{\item TEST\i{}END}

我該如何編寫\foreachperline或功能相當的東西?

答案1

使用換行符作為分隔符號是會搬起石頭砸自己的腳的:大多數編輯器對於如何組織使用者的輸入都有自己的想法。

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\foreachperline}{m}
 {
  \cs_set_protected:Nn \__spraff_per_line_do:n { #1 }
  \group_begin:
  \char_set_catcode_other:n { 13 }
  \char_set_catcode_active:n { 32 }
  \char_set_active_eq:nN { 32 } \c_space_token
  \__spraff_per_line_go:n
 }

\cs_new_protected:Nn \__spraff_per_line_go:n
 {
  \seq_set_split:Nfn \l__spraff_per_line_input_seq { \char_generate:nn { 13 } { 12 } } { #1 }
  \seq_pop_left:NN \l__spraff_per_line_input_seq \l_tmpa_tl
  \seq_pop_right:NN \l__spraff_per_line_input_seq \l_tmpa_tl
  \seq_map_function:NN \l__spraff_per_line_input_seq \__spraff_per_line_do:n
  \group_end:
 }

\seq_new:N \l__spraff_per_line_input_seq
\cs_generate_variant:Nn \seq_set_split:Nnn { Nf }
\ExplSyntaxOff

\begin{document}

\begin{itemize}

\foreachperline{\item TEST#1END}{
foo
   bar, baz
abcdef \emph{test}
}

\end{itemize}

\end{document}

在此輸入影像描述

沒有將三個空格壓縮為一個?好吧,您知道 TeX 會忽略行首的空格,因此您要么聽不到它們,要么不能像往常一樣對待它們。

哦,甚至不要嘗試將其作為另一個命令的參數;特別是,沒有嵌套。

相關內容