在尝试为 foreach 循环提供一个宏来循环时,我发现宏在 foreach 循环中不起作用我可以使用它\pgfplotsforeachungrouped
,它确实能够循环遍历我的宏。
但是,宏:它返回我的列表两次。以下是我所谈论的 MWE:
\documentclass{article}
\usepackage{pgfplots}
\newcommand{\xlabelsol}{0/0,1/1,2/2}
\pgfplotsset{compat=1.18}
\begin{document}
\pgfplotsforeachungrouped \x/\label in {\xlabelsol}{%
\x/\label \\
}
\end{document}
MWE 的结果如下:
我确实需要在循环中使用宏来处理列表,因为我正在尝试使用模板自动创建 pdf 文件,用于我正在开展的项目。此外,解决方案需要与 XeLaTeX 兼容
我尝试查找如何解决此问题,但似乎找不到解决方案。
答案1
\foreach
首先,对于由(子)包提供的原始包pgffor
,其语法是
\foreach \x/\label in {0/0,1/1,2/2} {<loop body>}
% or
\foreach \x/\label in \xlabelsol {<loop body>}
但从来没有
\foreach \x/\label in {\xlabelsol} {<loop body>} % wrong syntax
同样,在最简单的情况下,
<list>
它要么是用花括号括起来的逗号分隔的值列表,要么是包含此类值列表的宏的名称。
然后,\pgfplotsforeachungrouped
frompgfplots
比 更简单\foreach
,以至于它不能处理存储在宏中的列表,例如
% not supported in pgfplots v1.18.1
\pgfplotsforeachungrouped \x/\label in \xlabelsol {<loop body>}
最后,这里有一个补丁\pgfplotsforeachungrouped
:
\documentclass{article}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\makeatletter
\long\def\pgfplotsforeachungrouped@#1/#2in{%
\pgfutil@ifnextchar\bgroup{%
\pgfplotsforeachungrouped@@{#1}{#2}%
}{%
% \pgfplots@error{Found unexpected characters: expected 'in '.}%
\pgfplotsforeachungrouped@@@{#1}{#2}%
}%
}
\long\def\pgfplotsforeachungrouped@@@#1#2#3{%
\expanded{\unexpanded{\pgfplotsforeachungrouped@@{#1}{#2}}{\unexpanded\expandafter{#3}}}%
}
\makeatother
\begin{document}
\setlength\parindent{0pt}
\newcommand{\xlabelsol}{0/0,1/1,2/2}
\foreach \x/\y in \xlabelsol {%
(\x)(\y) \\
}
\pgfplotsforeachungrouped \x/\y in \xlabelsol {%
(\x)(\y) \\
}
\end{document}
输出是两个副本
(0)(0)
(1)(1)
(2)(2)
答案2
在循环开始之前,命令\xlabelsol
需要展开。因此,您可以执行以下操作:
\documentclass[border=10pt]{standalone}
\usepackage{pgfplots}
\pgfplotsset{compat=1.18}
\newcommand{\xlabelsol}{0/0, 1/1, 2/2}
\begin{document}
\edef\myloop{%
\noexpand\pgfplotsforeachungrouped \noexpand\x/\noexpand\label
in {\xlabelsol}{%
\noexpand\x/\noexpand\label \space
}%
}\myloop
\end{document}
将会输出: