以下面的代码为例:
\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}