Der folgende Code funktioniert nicht:
\documentclass{article}
\usepackage{xstring}
\newcommand\checkempty[1]{
\IfStrEq{#1}{}{%
Empty
}{%
NonEmpty
}
}
\begin{document}
\checkempty{\IfStrEq{justadummyvalue}{justadummyvalue}{somevalue}{}}
\end{document}
[Bearbeiten: Was ich mit erwarte, \checkempty{\IfStrEq{a}{a}{val}{}}
ist NonEmpty
. Das \checkempty{\IfStrEq{a}{b}{val}{}}
Ergebnis soll jedoch sein Empty
. ]
Allerdings bekomme ich einige Fehlermeldungen wie
Argument of \@xs@expand@and@assign has an extra }. \firstif{a}{b}{c} (followed by: ) document.tex /test line 19 Texlipse Build Error
und schließlich auch das
TeX capacity exceeded, sorry [input stack size=65000]. \firstif{a}{b}{c} (followed by: ) document.tex /test line 19 Texlipse Build Error
Grundsätzlich kann ich das Problem erahnen. \IfStrEq
lässt sich nicht erweitern (oder wie auch immer dieses Phänomen genau heißt) und nicht verschachteln. Daher xstring
bieten die meisten Befehle in eine Syntax wie \StrLeft{xstring}{4}[\Result]
. Der Ergebnisstring wird \Result
dann in gespeichert.
Allerdings bieten Testbefehle diese Syntax nicht an und ich vermute auch, dass sie nicht sinnvoll wäre. Trotzdem hoffe ich, dass es einige Optimierungen gibt, damit mein Beispiel funktioniert.
Bitte sagen Sie mir, ob es eine Optimierung gibt, die ich in einfügen kann \checkempty
. Ich muss (über jeden Fall von if
) innerhalb eines Befehls (hier \checkempty
) feststellen, ob das übergebene Argument (erweitert) leer ist oder nicht. [Bearbeiten: Das Äußere IfStrEq
muss vorher erweitert werden!] Wenn es keine Optimierung gibt, kann ich nicht verwenden IfStrEq
, richtig?
In der Vergangenheit habe ich mit dem xifthen
Paket gearbeitet. Es war eine echte Qual und ich konnte einige Erweiterungsprobleme nicht beheben. Mit xstring
und IfSubStr
hat alles gut funktioniert, außer in dem Fall, den ich in meinem Beispiel zeige :(
Antwort1
Das xstring
Paket bietet zusätzliche (sprich: erweiterte) Optionen zur Steuerung der Argumenterweiterung. Dies ist wirklich nicht für Anfänger gedacht und ein gutes Verständnis der Argumenterweiterung ist mehr als willkommen.
In Ihrem Fall kann der Code angepasst werden, um Folgendes zu kompilieren:
\documentclass{article}
\usepackage{xstring}
\newcommand\checkempty[1]{
\normalexpandarg
\exploregroups
\IfStrEq{#1}{}{%
Empty
}{%
NonEmpty
}
}
\begin{document}
\checkempty{\IfStrEq{justadummyvalue}{justadummyvalue}{somevalue}{}}
\end{document}
Beachten Sie die beiden neuen Zeilen in der Deklaration von \checkempty
. Die erste \normalexpandarg
stellt sicher, dass die an übergebenen Argumente (die zu vergleichenden Zeichenfolgen) \IfStrEq
nicht vollständig erweitert werden, wie dies standardmäßig der Fall wäre ( xstring
ist standardmäßig auf eingestellt fullexpandarg
). Wenn Ihr Argument jedoch Klammern enthält, wird der aufgerufene xstring
Befehl nicht innerhalb dieser Gruppe suchen. Da Sie prüfen möchten, ob die an Ihren Befehl übergebenen Argumente leer sind oder nicht, sollte diese Prüfung dennoch durchgeführt werden, daher die \exploregroups
Zeile. (Wenn Sie diese Funktion nicht verwenden möchten, lassen Sie diese Zeile einfach weg.) Sie können jederzeit mit zum Standardverhalten zurückkehren \noexploregroups
.
Diese Umschalter können an jeder beliebigen Stelle in Ihrem Code verwendet und durch Bereichsbegrenzung lokal gemacht werden.
Hoffentlich hilft das.:)
Antwort2
\pdfstrcmp
Der Vollständigkeit halber möchte ich erwähnen, dass LaTeX3 das Primitiv (oder Äquivalente für XeTeX
und ) verwendet, LuaTeX
um Zeichenfolgen erweiterbar zu vergleichen. Beachten Sie, dass es xstring
eine seltsame Definition eines Strings gibt (die ich jetzt nicht untersuchen möchte). Wenn Sie also erweiterte Funktionen verwenden, ist eine direkte Übersetzung in den LaTeX3-Jargon möglicherweise nicht möglich.
\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}
BEARBEITEN nach einigem Nachdenken: Tatsächlich definiere ich im obigen Code \IfStrEq
als Kopie von , aber es ist wahrscheinlich besser, einen neuen Befehl (oder was auch immer) \str_if_eq:nnTF
einzuführen , weil dies andere Möglichkeiten bietet (abhängig von der Anwesenheit eines Sterns).\expandableIfStrEq
\IfStrEq