我的问题类似于ASdeL 的问题,除了我正在针对预定义集测试循环变量。似乎那里的所有解决方案都不适合我,因为 \imgidx 在比较之前没有扩展。我该怎么做?
\documentclass{article}
\usepackage{pgffor}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \IfStringInList {mmmm}
{ \clist_if_in:nnTF {#2} {#1} {#3} {#4} }
\ExplSyntaxOff
\begin{document}
\def \imgperrow {8}
\foreach \x in {0, ..., 4}
{
\pgfmathtruncatemacro{\ymax}{\imgperrow}
\foreach \y in {1, ..., \ymax}
{
\pgfmathtruncatemacro {\imgidx}{\x*\imgperrow + \y}
{\IfStringInList {\imgidx}{1,2,3,4}{img A}{img B}}
}
}
\end{document}
在这个例子中,我应该将前四个显示为“img A”,但它们都显示为“img B”。
感谢您的帮助。
答案1
您说得对,您需要扩展\imgidx
。因为您要传递一个变量作为参数,所以只需更改\clist_if_in:nnTF
为\clist_if_in:nVTF
,它以命令而不是带括号的标记列表作为其第二个参数。您可能还想重命名为
\NewDocumentCommand \IfStringValueInList {mmmm}
{ \clist_if_in:nVTF {#2} #1 {#3} {#4} }
执行测试的代码也会发生相应的变化。
除非有请求,否则 clist 函数不会扩展它们的参数,所以这里的V
意思是“在进行测试之前提取输入变量的值并将其用作参数”。
顺便说一句,我不确定这在 PGF 环境中是否很重要,但请注意,您需要添加注释符号,以避免在文本上下文中插入不需要的空格:
\foreach \x in {0, ..., 4}
{%
\pgfmathtruncatemacro{\ymax}{\imgperrow}%
\foreach \y in {1, ..., \ymax}
{%
\pgfmathtruncatemacro {\imgidx}{\x*\imgperrow + \y}%
{\IfStringValueInList \imgidx{1,2,3,4}{A}{B}}%
}%
}