有人能解释一下为什么\ifinlistcs
当我尝试使用\foreach
来提供每个测试元素时 总是错误的吗?当然,我可以使用,\dolistcsloop
因为这是处理 列表结构的推荐方法etoolbox
,但我有我的理由(见下文)。
平均能量损失
\documentclass{article}
\usepackage{etoolbox}
\usepackage{pgffor}
\begin{document}
\listcsgadd{myList}{elem0}
\listcsgadd{myList}{elem1}
\listcsgadd{myList}{elem2}
\listcsgadd{myList}{elem3}
% this doesn't work
\foreach \x in {elem0, elem..., elem4}{%
\ifinlistcs{\x}{myList}{\x{} exists in list}{\x{} doesn't exist in list}\\
}
% this works
\renewcommand*{\do}[1]{%
\ifinlistcs{#1}{myList}{#1 exists in list}{#1 doesn't exist in list}\\
}
\dolistcsloop{myList}
\end{document}
为什么不\dolistcsloop
?
我实际上想嵌套两个\dolistcsloop
以遍历两个列表。不幸的是,我相信这意味着我必须嵌套两个,\renewcommand*{\do}[1]{}
我认为这行不通(至少在我短暂尝试时没有)。所以我想使用pgffor
's\foreach
作为解决方法,我将其用于\dolistcsloop
外部列表和\foreach
内部列表。
最终,我尝试迭代这种类型的数据记录结构我对其进行了轻微修改,以适应每个数据记录的附加列表结构(例如,任务列表,其中每个任务都有一个里程碑列表)。如果我可以\foreach
使用\ifinlistcs
,那么我将有一个可行的解决方案来实现我想要做的事情(这也是为什么我想将其作为问题的重点)。
但是如果有其他方法可以创建类似的数据记录结构(即数据记录列表,每个数据记录都有多个数据字段-值对,并且一些数据字段是列表)并且可以完全迭代,那么我也愿意接受这样的解决方案。
答案1
您需要在对其第一个参数进行操作\x
之前进行扩展。\ifinlistcs
\documentclass{article}
\usepackage{etoolbox}
\usepackage{pgffor}
\begin{document}
\listcsgadd{myList}{elem0}
\listcsgadd{myList}{elem1}
\listcsgadd{myList}{elem2}
\listcsgadd{myList}{elem3}
% this works
\foreach \x in {elem0, elem..., elem4}{%
\expandafter\ifinlistcs\expandafter{\x}{myList}
{\x{} exists in list}{\x{} doesn't exist in list}\par
}
% this works
\renewcommand*{\do}[1]{%
\ifinlistcs{#1}{myList}{#1 exists in list}{#1 doesn't exist in list}\par
}
\dolistcsloop{myList}
\end{document}