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 \foreachperline
funcionara 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#1END
pero sí en la salida de acuerdo con el contenido de las líneas (consulte la bar
línea).
No es imprescindible utilizarlo #1
como 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 \foreachperline
o 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}
¿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.