
Respuesta1
Tienes que expandirte \directlua
antes \foreach
de escanear el argumento. Esto se podría hacer con la \expanded
primitiva:
\documentclass[]{article}
\usepackage[]{tikz}
\begin{document}
\expanded{\unexpanded{\foreach \a / \n in }{\directlua{tex.sprint("a/b")}}}
{\a\ and \n}
\end{document}
Respuesta2
Esto es lo que uso cuando quiero foreach
sobre el contenido de un archivo (no estoy seguro, pero probablemente lo haya copiado deLeer los datos para iterar con \foreach desde un archivo):
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{pgffor}
\begin{filecontents}[overwrite]{mylist.txt}
a/b, 1/2,
c/d
\end{filecontents}
\usepackage{catchfile}
\newcommand\loaddata[1]{\CatchFileDef\loadeddata{#1}{\endlinechar=-1}}
\begin{document}
\loaddata{mylist.txt}
\foreach \one/\two in \loadeddata {\one--\two\par}
\end{document}
Respuesta3
Puede utilizar el parche que se proporciona a continuación para ofrecer una expand list
opción para ampliar completamente la lista antes de su uso.
\documentclass{article}
\usepackage{pgffor}
\begin{document}
\foreach [expand list=true] \a / \n in {\directlua{tex.sprint("a/b")}} {
\a
}
\end{document}
diff --git a/tex/generic/pgf/utilities/pgffor.code.tex b/tex/generic/pgf/utilities/pgffor.code.tex
index cdb77b31..65b62b8c 100644
--- a/tex/generic/pgf/utilities/pgffor.code.tex
+++ b/tex/generic/pgf/utilities/pgffor.code.tex
@@ -79,10 +79,13 @@
\fi%
}
+\def\pgffor@expand@list@true{\let\pgffor@expand@list\edef}
+\def\pgffor@expand@list@false{\let\pgffor@expand@list\def}
\def\pgffor@macro@list#1{%
\expandafter\pgffor@normal@list\expandafter{#1}}
\def\pgffor@normal@list#1{%
- \def\pgffor@values{#1, \pgffor@stop,}%
+ \pgffor@expand@list\pgffor@values{#1}%
+ \expandafter\def\expandafter\pgffor@values\expandafter{\pgffor@values, \pgffor@stop,}%
\ifx\pgffor@values\pgffor@emptyvalues
\def\pgffor@values{\pgffor@stop,}%
\fi%
@@ -619,6 +622,9 @@
count/.code=\pgffor@count@parse#1\pgffor@stop,
parse/.is if=pgffor@assign@parse,
parse/.default=false,
+ expand list/.is if=pgffor@expand@list@,
+ expand list/.default=true,
+ expand list=false,
}
\def\pgffor@assign@parse#1{%
En lugar de parchear su instalación de PGF (que de todos modos será anulada por la próxima actualización), también puede incluir las definiciones necesarias directamente en su documento.
\documentclass{article}
\usepackage{pgffor}
\makeatletter
\def\pgffor@expand@list@true{\let\pgffor@expand@list\edef}
\def\pgffor@expand@list@false{\let\pgffor@expand@list\def}
\def\pgffor@normal@list#1{%
\pgffor@expand@list\pgffor@values{#1}%
\expandafter\def\expandafter\pgffor@values\expandafter{\pgffor@values, \pgffor@stop,}%
\ifx\pgffor@values\pgffor@emptyvalues
\def\pgffor@values{\pgffor@stop,}%
\fi%
\let\pgffor@body=\pgfutil@empty%
\global\pgffor@continuetrue%
\pgffor@collectbody}
\makeatother
\pgfqkeys{/pgf/foreach}{
expand list/.is if=pgffor@expand@list@,
expand list/.default=true,
expand list=false,
}
\begin{document}
\foreach [expand list=true] \a / \n in {\directlua{tex.sprint("a/b")}} {
\a
}
\end{document}