鉴于
\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}