以下程式碼不起作用:
\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
then 中。
然而,測試命令不提供這種語法,我也猜測它沒有意義。但是,我仍然希望進行一些調整以使我的範例正常工作。
請告訴我,是否可以進行調整\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