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}

Я был бы рад понять, что является причиной ошибок в определении vec пакетом amsmath, и как их исправить.

Чтобы предоставить вам больше информации, я создам макрос:

\newcommand*\ifpresent[2]{\expandafter\if#1\empty\else#2\fi}

и я хочу

$\ifpresent{\ifpresent{x}{a}}{b}$

написать "б", и

$\ifpresent{\ifpresent{}{a}}{b}$

ничего не писать.

Я также попробовал:

\newcommand*\ifpresent[2]{\expandafter\ifx#1\empty\else#2\fi}

но в этом случае

$\ifpresent{\ifpresent{x}{a}}{b}$

выдает мне ошибки "Extra \else" и "extra \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до тех пор, пока не получит два нерасширяемых токена, а затем проверяет эти токены, чтобы увидеть, имеют ли они одинаковый код символа. Я подозреваю, чтоне являетсячто вы хотите проверить. Я бы предложил замену, но не ясно, что вы хотите проверить на данный момент/

Связанный контент