Tikz foreach는 \ input 또는 \ directlua에서 작동하지 않습니다.

Nov 12 2020

나는에 대한 데이터를로드하기 위해 노력하고있어 때 tikz\foreach사용 \input, 또는 이후에 \directluaI가 splited되지 않은 것으로 나타났습니다.

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

올바르게 구문 분석되도록 강제 할 수 있습니까 (그리고 어떻게)?

결과

답변

3 Skillmon Nov 12 2020 at 23:00

인수 \directlua\foreach스캔 하기 전에 확장 해야 합니다. 이것은 \expanded기본 요소 로 수행 할 수 있습니다 .

\documentclass[]{article}

\usepackage[]{tikz}

\begin{document}
\expanded{\unexpanded{\foreach \a / \n in }{\directlua{tex.sprint("a/b")}}}
  {\a\ and \n}

\end{document}
2 Rmano Nov 13 2020 at 00:49

이것은 내가 foreach파일 내용을 원할 때 사용하는 것입니다 (확실하지 않지만 데이터 읽기에서 복사 하여 파일에서 \ foreach로 반복 ).

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

2 HenriMenke Nov 14 2020 at 01:00

아래 제공된 패치를 사용하여 expand list사용하기 전에 목록을 완전히 확장 하는 옵션을 제공 할 수 있습니다.

\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{%

PGF 설치를 패치하는 대신 (어쨌든 다음 업데이트에서 무시 됨) 문서에 필요한 정의를 직접 포함 할 수도 있습니다.

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