Pgf foreach 未分组显示列表两次

Pgf foreach 未分组显示列表两次

在尝试为 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>它要么是用花括号括起来的逗号分隔的值列表,要么是包含此类值列表的宏的名称。

https://tikz.dev/pgffor#\foreach

然后,\pgfplotsforeachungroupedfrompgfplots比 更简单\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}

将会输出:

在此处输入图片描述

相关内容