如何反转用于 tikz foreach 循环的列表

如何反转用于 tikz foreach 循环的列表

鉴于

\def\stuff{a,b,c}

我希望能够做到

\foreach \x in {c,b,a} {...}

无需手动反转列表\stuff。例如,是否有某种\invert宏可以让我编写

\foreach \x in \invert{\stuff} {...}

答案1

手动解决方案,在第一个循环中构建反向列表\foreach

\documentclass{article}
\usepackage{pgffor}

\begin{document}

\let\mylist\empty
\foreach\x in {1,...,4} {
  \ifx\mylist\empty
    \xdef\mylist{\x}%
  \else
    \xdef\mylist{\x,\mylist}%
  \fi
}
\foreach\x in \mylist {
  [\x]
}

\end{document}

结果

答案2

您可以使用控制序列来获取保存列表的xparse好方法,也可以将其反转:\foreach

\documentclass{article}
\usepackage{pgffor,xparse}

\ExplSyntaxOn

\NewDocumentCommand{\Foreach}{ s m m m }
 {
  \IfBooleanTF{#1}
   {
    \equaeghe_reverseforeach:Non #2 { #3 } { #4 }
   }
   {
    \equaeghe_foreach:Non #2 { #3 } { #4 }
   }
 }
\cs_new_protected:Npn \equaeghe_foreach:Nnn #1 #2 #3
 {
  \foreach #1 in { #2 } { #3 }
 }
\cs_new_protected:Npn \equaeghe_reverseforeach:Nnn #1 #2 #3
 {
  \seq_set_split:Nnn \l__equaeghe_list_seq { , } { #2 }
  \seq_reverse:N \l__equaeghe_list_seq
  \tl_set:Nx \l__equaeghe_reverselist_tl
   { \seq_use:Nnnn \l__equaeghe_list_seq { , } { , } { , } }
  \equaeghe_foreach:NVn #1 \l__equaeghe_reverselist_tl { #3 }
 }
\cs_generate_variant:Nn \equaeghe_reverseforeach:Nnn { No }
\cs_generate_variant:Nn \equaeghe_foreach:Nnn { NV } 
\cs_generate_variant:Nn \equaeghe_foreach:Nnn { No }

\tl_new:N \l__equaeghe_reverselist_tl
\seq_new:N \l__equaeghe_list_seq

\ExplSyntaxOff


\begin{document}

\Foreach\x{a,b,c}{\x}

\Foreach*\x{a,b,c}{\x}

\Foreach\x{a,...,g}{\x}

\Foreach*\x{a,...,g}{\x}

\def\stuff{a,b,c}

\Foreach\x{\stuff}{\x}

\Foreach*\x{\stuff}{\x}

\end{document}

*-version 反转了列表。

在此处输入图片描述

答案3

这是另一种方法。我假设你的列表是一个宏;它不一定是。循环\foreach会给你转换后的列表

\mytranslist -> \do{4}\do{3}\do{2}\do{1}

然后,您可以将其定义\do为您想要的任何运算符/处理器。例如,为了打印列表,我将其定义\do为产生格式[x]

\documentclass{article}
\usepackage{pgffor}
\begin{document}    
\def\mylist{1,...,4}
\def\do#1{%
  \xdef\mytranslist{\noexpand\do{#1}%
    \ifdefined\mytranslist\unexpanded\expandafter{\mytranslist}\fi
  }%
}
\let\mytranslist\undefined
\foreach \x in \mylist {\do{\x}}
% To print the list:
\def\do#1{[#1]}
\mytranslist
\end{document}

在此处输入图片描述

使用最新版本的循环套餐,你需要更少的房产:

\documentclass{article}
\usepackage{loops}[2012/10/10]
\begin{document}
\def\mylist{1,...,4}
\foreachfox [list is a macro, reverse list] \mylist {[#1]}
\end{document}

相关内容