我的序言中有以下代码:
\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}}}
没有帮助。但是,如果我手动扩展对的调用IfSubStr
,mymacro
即
\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
命令传递函数的返回值。