xstring 的测试命令(IfStrEq、IfSubStr 等)的嵌套

xstring 的测试命令(IfStrEq、IfSubStr 等)的嵌套

以下代码不起作用:

\documentclass{article}

\usepackage{xstring}

\newcommand\checkempty[1]{
    \IfStrEq{#1}{}{%
        Empty
    }{%
        NonEmpty
    }
}

\begin{document}
    \checkempty{\IfStrEq{justadummyvalue}{justadummyvalue}{somevalue}{}}
\end{document}

[编辑:我期望的\checkempty{\IfStrEq{a}{a}{val}{}}NonEmpty。但是,\checkempty{\IfStrEq{a}{b}{val}{}}结果将是Empty。]

但是我遇到了一些错误,例如

Argument of \@xs@expand@and@assign has an extra }. \firstif{a}{b}{c} (followed by: )    document.tex    /test   line 19 Texlipse Build Error

最后还有这个

TeX capacity exceeded, sorry [input stack size=65000]. \firstif{a}{b}{c} (followed by: )    document.tex    /test   line 19 Texlipse Build Error

基本上,我能猜出问题所在。\IfStrEq无法展开(或者无论这种现象到底叫什么)并且无法嵌套。因此,中的大多数命令都xstring提供了类似 的语法\StrLeft{xstring}{4}[\Result]。结果字符串存储在 中\Result

但是,测试命令不提供此语法,而且我猜想这没什么意义。不过,我还是希望有一些调整可以让我的示例正常工作。

请告诉我,是否有可以放入的调整\checkempty。我需要确定(通过if命令(此处\checkempty)内的任何情况)传递的参数(扩展)是否为空。[编辑:外部IfStrEq应先扩展!]如果没有调整,我就不能使用IfStrEq,对吗?

过去我使用过该xifthen软件包。这真是太痛苦了,我无法处理一些扩​​展问题。有了xstring它,IfSubStr一切都运行良好,除了我在示例中展示的情况 :(

答案1

xstring软件包提供了额外的(即高级)选项来控制参数的扩展。这实际上并不适合初学者,对参数如何扩展有很好的理解是十分受欢迎的。

在你的情况下,可以调整代码进行编译:

\documentclass{article}

\usepackage{xstring}

\newcommand\checkempty[1]{
    \normalexpandarg
    \exploregroups
    \IfStrEq{#1}{}{%
        Empty
    }{%
        NonEmpty
    }
}

\begin{document}
    \checkempty{\IfStrEq{justadummyvalue}{justadummyvalue}{somevalue}{}}
\end{document}

请注意 声明中的两行新代码\checkempty。第一行\normalexpandarg确保传递给 的参数(要比较的字符串)\IfStrEq不会完全展开,默认情况下会这样(xstring默认设置为fullexpandarg)。但是,如果您的参数包含括号,则调用的xstring命令将不会在该组内查找。由于您要检查传递给命令的参数是否为空,因此仍应进行此检查,因此有此行\exploregroups。(如果您不想使用此功能,只需省略该行。)您可以随时使用 恢复默认行为\noexploregroups

这些切换可以在您的代码中的任何位置使用,并且可以通过范围设为本地。

希望有所帮助。:)

答案2

为了完整起见,我将提到 LaTeX3 使用\pdfstrcmp原语(或与 等价的原语XeTeXLuaTeX来可扩展地比较字符串。请注意,对xstring字符串的定义很奇怪(我现在不想研究),因此如果您使用高级功能,可能无法直接翻译成 LaTeX3 术语。

\documentclass{article}

\usepackage{expl3}
\ExplSyntaxOn
\cs_set_eq:NN \IfStrEq \str_if_eq:nnTF
\ExplSyntaxOff

\newcommand\checkempty[1]{
    \IfStrEq{#1}{}{%
        Empty
    }{%
        NonEmpty
    }
}

\begin{document}
    \checkempty{\IfStrEq{justadummyvalue}{justadummyvalue}{somevalue}{}}
\end{document}

经过一番思考后进行编辑:实际上,在上面的代码中我将其定义\IfStrEq为的副本\str_if_eq:nnTF,但最好引入一个新命令\expandableIfStrEq(或其他命令),因为\IfStrEq会给出其他可能性(取决于星号的存在)。

相关内容