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]。結果字串儲存在\Resultthen 中。

然而,測試命令不提供這種語法,我也猜測它沒有意義。但是,我仍然希望進行一些調整以使我的範例正常工作。

請告訴我,是否可以進行調整\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

相關內容