Verschachtelung von Testbefehlen (IfStrEq, IfSubStr usw.) von xstring

Verschachtelung von Testbefehlen (IfStrEq, IfSubStr usw.) von xstring

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. \IfStrEqlässt sich nicht erweitern (oder wie auch immer dieses Phänomen genau heißt) und nicht verschachteln. Daher xstringbieten die meisten Befehle in eine Syntax wie \StrLeft{xstring}{4}[\Result]. Der Ergebnisstring wird \Resultdann 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 IfStrEqmuss vorher erweitert werden!] Wenn es keine Optimierung gibt, kann ich nicht verwenden IfStrEq, richtig?

In der Vergangenheit habe ich mit dem xifthenPaket gearbeitet. Es war eine echte Qual und ich konnte einige Erweiterungsprobleme nicht beheben. Mit xstringund IfSubStrhat alles gut funktioniert, außer in dem Fall, den ich in meinem Beispiel zeige :(

Antwort1

Das xstringPaket 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 \normalexpandargstellt sicher, dass die an übergebenen Argumente (die zu vergleichenden Zeichenfolgen) \IfStrEqnicht vollständig erweitert werden, wie dies standardmäßig der Fall wäre ( xstringist standardmäßig auf eingestellt fullexpandarg). Wenn Ihr Argument jedoch Klammern enthält, wird der aufgerufene xstringBefehl 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 \exploregroupsZeile. (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

\pdfstrcmpDer Vollständigkeit halber möchte ich erwähnen, dass LaTeX3 das Primitiv (oder Äquivalente für XeTeXund ) verwendet, LuaTeXum Zeichenfolgen erweiterbar zu vergleichen. Beachten Sie, dass es xstringeine 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 \IfStrEqals Kopie von , aber es ist wahrscheinlich besser, einen neuen Befehl (oder was auch immer) \str_if_eq:nnTFeinzuführen , weil dies andere Möglichkeiten bietet (abhängig von der Anwesenheit eines Sterns).\expandableIfStrEq\IfStrEq

verwandte Informationen