iterar sobre una lista separada por nueva línea

iterar sobre una lista separada por nueva línea

Para mis propósitos, es conveniente tener una lista con un elemento en cada línea (separado por ASCII \n). Quiero repetir esa lista. Algo como esto:

\begin{itemize}

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

\end{itemize}

Esto produciría:

  • PRUEBAfooEND

  • barra de PRUEBA, bazEND

  • PRUEBAabcdefpruebaFIN

Preferiría que \foreachperlinefuncionara exactamente como arriba, ignorando la primera y la última línea nueva, pero si eso se va a complicar, lo siguiente también estaría bien.

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

También sería aceptable (preferible a la opción 2 pero no preferible a la opción 1) marcar explícitamente los finales de las líneas, algo como esto

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

Tenga en cuenta que no hay espacios, TEST#1ENDpero sí en la salida de acuerdo con el contenido de las líneas (consulte la barlínea).

No es imprescindible utilizarlo #1como marcador de posición. Algo como esto también estaría bien.

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

No es imprescindible que la sintaxis sea una única macro. Algo como esto también estaría bien.

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

¿Cómo escribo \foreachperlineo algo funcionalmente equivalente?

Respuesta1

Te dispararás a ti mismo usando nuevas líneas como delimitadores: la mayoría de los editores tienen sus propias ideas sobre cómo organizar las entradas de los usuarios.

\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}

ingrese la descripción de la imagen aquí

¿No hay compresión de los tres espacios a uno? Bueno, ya sabes que TeX ignora los espacios al principio de las líneas, por lo que o no los obtienes o no se pueden tratar como de costumbre.

Oh, ni siquiera intentes alimentar esto como argumento para otro comando; en particular, sin anidación.

información relacionada