测试计数器的值是否属于给定的值列表

测试计数器的值是否属于给定的值列表

这肯定是一个 LateX 101 问题,所以我请求你的帮助

我想根据定理计数器的值做出选择。

我使用该xifthen包(特别是\isin测试第一个字符串是否是第二个字符串的一部分的函数)和以下函数:

\newcommand{\test}[2]{\ifthenelse{\isin{|#1|}{#2}}{Yes}{No}}

例如:

\test{17}{|15|17|19|} returns Yes

\test{18}{|15|17|19|} returns No

但是如何\test用计数器的当前值替换第一个参数?

答案1

或者使用包xstring,其中内置了各种简洁的测试:

\documentclass{article}

\usepackage{xstring}

\newcounter{sausage}
\setcounter{sausage}{18}

\begin{document}

\IfSubStr{|17|18|19|}{|\arabic{sausage}|}{true}{false}
\IfSubStr{|17|15|19|}{|\arabic{sausage}|}{true}{false}

\end{document}

答案2

\documentclass{article}
\usepackage{xifthen}
\newcounter{mycounter}
\setcounter{mycounter}{17}
\newcommand{\test}[2]{\ifthenelse{\isin{|#1|}{#2}}{Yes}{No}}
\begin{document}
\test{17}{|15|17|19|} returns Yes

\test{18}{|15|17|19|} returns No

\edef\tmp{\themycounter}
\expandafter\test\expandafter{\tmp}{|15|17|19|} returns Yes
\end{document}

这种方法可以直接纳入宏中:

\documentclass{article}
\usepackage{xifthen}
\newcounter{mycounter}
\setcounter{mycounter}{17}
\newcommand{\test}[2]{%
  \edef\tmp{#1}%
  \ifthenelse{\expandafter\isin\expandafter{\expandafter|\tmp|}{#2}}{Yes}{No}%
}
\begin{document}
\test{17}{|15|17|19|} returns Yes

\test{18}{|15|17|19|} returns No

\test{\themycounter}{|15|17|19|} returns Yes
\end{document}

对于完全不同的方法,我在这里使用listofitems包来解析参数,#2使用扩展参数|#1|作为分隔符。如果我在结果数组列表中得到多于 1 个元素,那么可以得出结论,分隔符是在 中找到的#2

\documentclass{article}
\usepackage{listofitems}
\newcounter{mycounter}
\newcommand{\test}[2]{%
  \edef\tmp{#1}%
  \expandafter\setsepchar\expandafter{\expandafter{\expandafter|\tmp|}}%
  \readlist\tmparray{#2}
  \ifnum\tmparraylen>1\relax Yes\else No\fi%
}
\begin{document}
\test{17}{|15|17|19|} returns Yes

\test{18}{|15|17|19|} returns No

\setcounter{mycounter}{17}
\test{\themycounter}{|15|17|19|} returns Yes
\end{document}

答案3

您可以使用 pdfTeX,如果在 中找到 ,\pdfmatch{<strA>}{<strB>}则返回 1。标点符号的模式匹配需要小心。这是可扩展的:<strA><strB>

在此处输入图片描述

\documentclass{article}

\newcommand{\test}[2]{\ifnum\pdfmatch{[|]#1[|]}{#2}=1 Yes\else No\fi}

\begin{document}

\verb!\test{17}{|15|17|19|}! returns: \test{17}{|15|17|19|}

\verb!\test{18}{|15|17|19|}! returns: \test{18}{|15|17|19|}

\newcounter{test}

\setcounter{test}{17}%
\verb!\test{\thetest}{|15|17|19|}! returns: \test{\thetest}{|15|17|19|}

\setcounter{test}{18}%
\verb!\test{\thetest}{|15|17|19|}! returns: \test{\thetest}{|15|17|19|}

\end{document}

上面的模式匹配之所以有效,\thetest是因为\thetest扩展为\arabic{test}(默认情况下)。如果不是这种情况,您可以\arabic{test}直接使用。

答案4

无需封装,易于扩展的方法。

\numexpr仅用于允许输入表达式。并且我\detokenize仅用于显示输入。否则,这些 e-TeX 扩展是不需要的。

\documentclass{article}

\makeatletter
% borrowed from xintkernel.sty
\long\def\dothis #1#2\orthat #3{\fi #1}%
\let\orthat \@firstofone
\makeatother

\newcommand*{\test}[1]{The test of \texttt{\detokenize{#1}} gives:
  \ifnum\numexpr#1=15 \dothis{Yes (15)}\fi
  \ifnum\numexpr#1=17 \dothis{Yes (17)}\fi
  \ifnum\numexpr#1=19 \dothis{Yes (19)}\fi
  \orthat{NO!}%
}%

\newcommand{\fifteen}{15}

\newcounter{mycounter}

\begin{document}

\test{17}

\test{\fifteen}

\setcounter{mycounter}{19}
\test{\value{mycounter}}

\setcounter{mycounter}{42}
\test{\value{mycounter}}

\test{43}

\test{11+4+4}

\end{document}

在此处输入图片描述

这里我不处理在表单中显示一组允许的值,|15|17|19|但当然可以为此生成宏。使用,分隔符,然后可以通过以下方式(可扩展)完成新工具实用程序(或者当然是 LaTeX3)。

\dothis/\orthat方法(从 复制过来xintkernel.sty)中,测试条件,一旦条件为肯定,\dothis则执行相应的代码,然后跳过所有剩余的测试。如果所有此类测试都失败,则\orthat执行代码。当然,这(所有\ifnum以 结尾的测试\orthat{FOO})是可扩展的代码。在这里,我添加了\test额外的宏内容,以便在 mwe 中更好地显示结果。

如果问题只是测试给定的输入是否在给定的列表中,那么老式的方法\if1\ifnum .... etc...可以将许多方法组合在一起\ifnum而不需要复杂的\expandafter\fi\fi...\fi

但在这里我看到其他答案根据输入处理单独的代码输出,所以我也做了同样的事情。

相关内容