在一个更大的背景,我需要检查一个整数参数是否包含在一组数字中。我决定将集合编码为字符串;元素用 分隔!
。我不知道这是否是最好的方法,但发生了一件奇怪的事情:
\documentclass{article}
\usepackage{pgffor,xifthen}
\newcommand{\ifin}[1]{
\ifthenelse{\isin{!#1!}{!1!3!}}{T}{F}%
}
\begin{document}
\ifin{1}\ifin{2}\ifin{3}\ifin{4}
\foreach \n in {1,...,4} {%
\ifin{\n}%
}
\end{document}
预期输出为
TFTF
TFTF
但实际输出是
TFTF
FFFF
请注意,pdflatex
不会报告任何错误或警告。
我怀疑这是一个更普遍的问题(\isin
检查字符串是否是其他字符串的子字符串;它可能会失败,因为参数是数字)但我找不到这方面的资料。我怎样才能实现所需的行为?
答案1
这是一个扩展问题:令牌\n
不在您的列表中,您会同意的。
你必须沟通明确地您想要检查的价值而\n
不是名称\n
:
\foreach \n in {1,...,4} {%
\expandafter\ifin\expandafter{\n}%
}
另一种方法是使用\edef
(如\edef\temp{\noexpand\ifin{\n}}\temp
)。
看http://pgfplots.sourceforge.net/TeX-programming-notes.pdf有关扩展控制的详细信息。
\if*
注意:如果命令在某些宏的深处使用,例如 ,我并不感到惊讶。这是由 TeX 的标记器引起的;该名称干扰了 TeX 处理布尔变量的方式。我建议使用不同的前缀(例如\raphaelifin
)。