如何强制扩展 \def 为 \in@?

如何强制扩展 \def 为 \in@?

以下面的代码为例:

\documentclass{standalone}
\def\myvar{foobar}

\begin{document}
\makeatletter
\in@{foo}{foobar}\ifin@ Yes\else No\fi,
\in@{foo}{\myvar}\ifin@ Yes\else No\fi
\makeatother
\end{document}

Yes, No按照我的预期,这会进行排版Yes, Yes。我猜这是因为在它工作\myvar之前没有被扩展\in@。我该如何让它工作?

注意:我不太擅长扩展,所以上面的内容(或标题)可能没有多大意义。

答案1

\expandafter有几种方法,其中一种方法是用两个

\documentclass{standalone}
\def\myvar{foobar}

\begin{document}
\makeatletter
\in@{foo}{foobar}\ifin@ Yes\else No\fi,
\def\zz{\in@{foo}}
\expandafter\zz\expandafter{\myvar}\ifin@ Yes\else No\fi
\makeatother
\end{document}

答案2

\in@不会扩展其参数;您可以轻松定义一个新的宏\ein@来扩展(一次)其参数:

\documentclass{article}
\def\myvar{foobar}

\makeatletter
\def\ein@#1#2{%
  \expandafter\ein@@\expandafter{#2}{#1}%
}
\def\ein@@#1#2{\in@{#2}{#1}}
\makeatother

\begin{document}

\makeatletter
\in@{foo}{foobar}\ifin@ Yes\else No\fi,
\ein@{foo}{\myvar}\ifin@ Yes\else No\fi
\makeatother

\end{document}

您可以使用以下方法更轻松地完成此操作xparse

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\IfInTF}{smmmm}
 {
  \IfBooleanTF{#1}
    {
     \tl_if_in:onTF { #3 } { #2 }  { #4 } { #5 }
    }
    {
     \tl_if_in:nnTF { #3 } { #2 }  { #4 } { #5 }
    }
 }
\ExplSyntaxOff

\newcommand\myvar{foobar}


\begin{document}

\IfInTF{foo}{foobar}{Yes}{No},
\IfInTF*{foo}{\myvar}{Yes}{No}

\end{document}

相关内容