嵌套 IfSubStr 调用的问题

嵌套 IfSubStr 调用的问题

我的序言中有以下代码:

\usepackage{xstring}
\newcommand\myhelpermacro[1]{\IfSubStr{#1}{true}{Text contained the word "cat"}{Text did not contain the word "cat"}}
\newcommand\mymacro[1]{\myhelpermacro{\IfSubStr{#1}{cat}{true}{false}}}

当我稍后尝试mymacro在文档中使用时,如下所示:

\mymacro{cat}

我收到以下错误:

Use of \@xs@IfSubStr@@ doesn't match its definition. \mymacro{cat}

mymacro使用 进行修改\expandafter,如下所示:

\newcommand\mymacro[1]{\expandafter\myhelpermacro{\IfSubStr{#1}{cat}{true}{false}}}

没有帮助。但是,如果我手动扩展对的调用IfSubStrmymacro

\newcommand\mymacro[1]{\myhelpermacro{true}}

代码有效。

这是怎么回事?为什么不手动扩展我的代码就无法工作IfSubStr


编辑1:为了阐明我对代码行为的期望,我期望当我使用例如

\mymacro{caterpillar}

扩展为

\myhelpermacro{\IfSubStr{caterpillar}{cat}{true}{false}}

反过来应该扩展(因为我希望括号内的内容先于括号外的内容扩展,因为括号本来就应该如此,对吧?:))到

\myhelpermacro{true}

进而应扩展为Text contained the word "cat"

但是,当我使用例如

\mymacro{aardvark}

我预计这将扩大到

\myhelpermacro{\IfSubStr{aardvark}{cat}{true}{false}}

进而应扩展为

\myhelpermacro{false}

进而应扩展为Text did not contain the word "cat"


编辑2:阅读后xstring文档(在下面3.2 宏的扩展,可选参数mymacro),我尝试通过将的结果存储IfSubStr在临时变量中来更改的定义,以

\newcommand\mymacro[1]{\IfSubStr{#1}{cat}{true}{false}[\result]\myhelpermacro{\‌​result}}

当我尝试使用时仅收到以下错误消息mymacro

Undefined control sequence. \mymacro{cat}

突然间,LaTeX 似乎认为mymacro根本没有定义。为什么?


编辑3:所以我想要做的是定义两个宏:

第一个宏(myhelpermacro在本例中)采用布尔值并将字符串插入到文档中,该字符串的值取决于布尔值。

第二个宏(mymacro在本例中)接受一个字符串,如果该字符串包含特定的子字符串,则使用布尔值调用第一个宏true,否则它使用布尔值调用第一个宏false

因为我希望能够从文档中调用这两个宏,所以两个宏都需要定义,而且因为我想避免代码重复,所以第二个宏应该调用第一个宏,而不是将字符串插入文档本身。

答案1

functional如果您熟悉其他编程语言(例如Lua或) ,则包、函数组合将按预期工作JavaScript

\documentclass{article}
\usepackage{functional}
\begin{document}

\IgnoreSpacesOn
\PrgNewFunction \mymacro {m} {
  \myhelpermacro{\StrIfInTF{#1}{cat}{\Result{true}}{\Result{false}}}
}
\PrgNewFunction \myhelpermacro {m} {
  \StrIfInTF {#1} {true} {
    \Result{Text ~ contained ~ the ~ word ~ "cat"}
  }{
    \Result{Text ~ did ~ not ~ contain ~ the ~ word ~ "cat"}
  }
}
\IgnoreSpacesOff

\mymacro{caterpillar}

\mymacro{butterfly}

\end{document}

在此处输入图片描述

请注意,使用此包,您需要通过\Result命令传递函数的返回值。

相关内容