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