Tikz foreach ไม่ทำงานกับ \ input หรือ \ directlua

Nov 12 2020

เมื่อฉันพยายามที่จะโหลดข้อมูลสำหรับtikz's \foreachใช้\inputหรือต่อมา\directluaผมสังเกตเห็นว่ามันไม่ได้เป็น 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}