这肯定是一个 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
。
但在这里我看到其他答案根据输入处理单独的代码输出,所以我也做了同样的事情。