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]. 결과 문자열은 \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

\pdfstrcmp완전성을 기하기 위해 LaTeX3는 문자열을 확장 가능하게 비교하기 위해 기본 요소(또는 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

관련 정보