Tikz foreach는 \input 또는 \directlua와 함께 작동하지 않습니다.

Tikz foreach는 \input 또는 \directlua와 함께 작동하지 않습니다.

tikz에서 을(를) \foreach사용하여 \input나중에 을(를) 사용 하여 데이터를 로드하려고 할 때 \directlua데이터가 분할되지 않은 것을 발견했습니다.

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

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

결과여기에 이미지 설명을 입력하세요

답변1

인수를 스캔하기 \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

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}

여기에 이미지 설명을 입력하세요

답변3

아래 제공된 패치를 사용하면 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}

관련 정보