다음 코드는 작동하지 않습니다.
\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