amsmath, vec 및 함께 작동하지 않는 경우

amsmath, vec 및 함께 작동하지 않는 경우

테스트에 매크로 인수가 포함된 "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다음 해당 토큰을 테스트하여 동일한 문자 코드가 있는지 확인합니다. 나는 그것을 의심한다그렇지 않다무엇을 테스트하고 싶은지. 교체를 제안하고 싶지만 그 시점에서 무엇을 테스트하고 싶은지 확실하지 않습니다/

관련 정보