测试列表中的成员资格

测试列表中的成员资格

我的问题类似于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}}%
    }%
}

相关内容