Tikz foreach no funciona con \input o \directlua

Tikz foreach no funciona con \input o \directlua

Cuando intento cargar datos para tikzel \foreachuso de \input, o más tarde, \directluanoté que no están divididos.

    \foreach \a / \n in {\directlua{tex.sprint("a/b")}}
      {\a}

¿Puedo (y cómo) forzar que se analice correctamente?

resultados eningrese la descripción de la imagen aquí

Respuesta1

Tienes que expandirte \directluaantes \foreachde escanear el argumento. Esto se podría hacer con la \expandedprimitiva:

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

ingrese la descripción de la imagen aquí

Respuesta3

Puede utilizar el parche que se proporciona a continuación para ofrecer una expand listopció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}

información relacionada