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}