![xstring 的测试命令(IfStrEq、IfSubStr 等)的嵌套](https://linux22.com/image/254327/xstring%20%E7%9A%84%E6%B5%8B%E8%AF%95%E5%91%BD%E4%BB%A4%EF%BC%88IfStrEq%E3%80%81IfSubStr%20%E7%AD%89%EF%BC%89%E7%9A%84%E5%B5%8C%E5%A5%97.png)
以下代码不起作用:
\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
原语(或与 等价的原语XeTeX
)LuaTeX
来可扩展地比较字符串。请注意,对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
会给出其他可能性(取决于星号的存在)。