테스트에 매크로 인수가 포함된 "if"가 필요한 일부 매크로를 정의하려고 합니다. 이 인수가 \vec{<arg>}
이고 패키지가 로드 되면 문제가 발생합니다 amsmath
. 다음은 최소한의 작업 예입니다.
\documentclass{article}
\begin{document}
$\if\vec{x}\empty true\else false\fi$
\end{document}
다음은 작동하지 않는 최소한의 예입니다.
\documentclass{article}
\usepackage{amsmath}
\begin{document}
$\if\vec{x}\empty true\else false\fi$
\end{document}
amsmath 패키지의 vec 정의에서 오류가 발생하는 원인과 해결 방법을 알고 싶습니다.
더 많은 정보를 제공하기 위해 매크로를 만듭니다.
\newcommand*\ifpresent[2]{\expandafter\if#1\empty\else#2\fi}
그리고 나는 원한다
$\ifpresent{\ifpresent{x}{a}}{b}$
"b"라고 쓰고,
$\ifpresent{\ifpresent{}{a}}{b}$
아무것도 쓰지 말라고.
나는 또한 다음을 시도했습니다.
\newcommand*\ifpresent[2]{\expandafter\ifx#1\empty\else#2\fi}
하지만 이 경우에는
$\ifpresent{\ifpresent{x}{a}}{b}$
"추가 \else
" 및 "추가 \fi
" 오류가 발생합니다.
내가 원하는 것은 다음과 같은 매크로를 정의하는 것입니다.
\newcommand\foo[1]{\ifpresent{#1}{foo#1}}
그리고
\newcommand\bar[1]{\ifpresent{#1}{bar#1}}
그렇게
\foo{\bar{}}
아무것도 주지 않고
\foo{\bar{yeah}}
"foobaryeah"를 제공합니다
답변1
나는 당신이 무엇을 찾고 있는지 정말로 이해하지 못합니다. 확실히 \if
좋은 도구는 아닙니다. 규칙 때문에: \if
확장할 수 없는 두 개의 토큰을 찾을 때까지 뒤따르는 것을 확장한 다음 비교합니다.
아마도 이것은 귀하의 요구 사항을 실현한 것입니다.
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\doifnonblank}{mm}
{
\val_doifnonblank:fn { #1 } { #2 }
}
\cs_new:Npn \val_doifnonblank:nn #1 #2
{
\tl_if_blank:nF { #1 } { #2 }
}
\cs_generate_variant:Nn \val_doifnonblank:nn { f }
\ExplSyntaxOff
\newcommand{\foo}[1]{\doifnonblank{#1}{foo#1}}
\begin{document}
X\foo{}X
X\foo{x}X
X\foo{\doifnonblank{}{x}}X
X\foo{\doifnonblank{x}{y}}X
\end{document}
답변2
\if\vec{
두 개의 확장 불가능한 토큰을 얻을 때까지 확장한 \vec
다음 해당 토큰을 테스트하여 동일한 문자 코드가 있는지 확인합니다. 나는 그것을 의심한다그렇지 않다무엇을 테스트하고 싶은지. 교체를 제안하고 싶지만 그 시점에서 무엇을 테스트하고 싶은지 확실하지 않습니다/