如何在 \newcommand 中指定覆盖规范的默认值?

如何在 \newcommand 中指定覆盖规范的默认值?

我有类似的东西:

\documentclass{beamer}
\newcommand<>{\mycommand}[1]{\textcolor#2{red}{#1}}

\begin{document}
 \frame{
  \mycommand{test}
 }
\end{document}

我希望该命令采用默认覆盖规范(例如,<2,4>),如果像示例中那样调用该命令(没有覆盖规范),则将启用该默认覆盖规范,如果使用覆盖规范(例如,\mycommand<1-4>)调用该命令,则该默认覆盖规范将被覆盖。

这可能吗?

答案1

这(至少)可以通过使用 TeX 条件来实现。

您需要测试#2是否为空。下面的示例使用临时宏来测试\@empty是否#2为空。由于#2只包含几个简单字符(没有 TeX),您也可以简单地执行

\ifx\\#2\

测试是否为空字符串(如果为空\ifx\\\\则为真);\\您还可以使用几乎任何其他未出现的控制序列#2(例如\relax)。

eTeX 允许我们进行安全测试\detokenize

\if\relax\detokenize{#2}\relax

还有许多软件包提供空字符串测试:

  • etoolbox\ifstrempty{#2}{<true>}{<false>}

  • xifthen\ifthenelse{\isempty{#2}}{<true>}{<false>}

在我的示例中,我使用了\@firstoftwo和 ,\@secondoftwo这样就不需要重复{red}{#2}命令的一部分。出于许多其他原因(请参阅参考资料),最好使用它们,尤其是当您想要嵌套\ifs 时。

当然,在这个简单的例子中您不一定需要这个。

参考

代码

\documentclass{beamer}
\makeatletter
\newcommand<>{\mycommand}[1]{%
  \def\@tempa{#2}%
  \ifx\@tempa\@empty
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
  {\textcolor<2,4>}{\textcolor#2}{red}{#1}}
\makeatother
\begin{document}
 \frame{\mycommand{test}}
\end{document}

答案2

\documentclass{beamer} 
\newcommand<>\mycommand[1]{%
  \ifx\relax#2\relax \textcolor<2,4>{red}{#1}% #2 is empty
  \else              \textcolor#2{red}{#1}%
  \fi}
\begin{document}

 \frame{\mycommand{test}}
 \frame{\mycommand<1>{test}}

\end{document}

答案3

xparse的可选分隔符D规范:

o标准的 LaTeX 可选参数,用方括号括起来,-NoValue-如果未给出,将提供特殊标记(如下所述)。

d给定为,一个可选参数,由和d<token1><token2>分隔。与 一样,如果没有给出值,则返回特殊标记。<token1><token2>o-NoValue-

D给定为D<token1><token2>{<default>},它与 一样d,但<default>如果未给出值则返回。在内部,od类型是适当构造类型参数O的快捷方式。D

\documentclass{beamer}

% If you don't have an up-to-date TeX distribution, include xparse manually
% \usepackage{xparse}
\NewDocumentCommand{\mycommand}{ D<>{2,4} m }{%
  \textcolor<#1>{red}{#2}%
}

\begin{document}

\begin{frame}
  \mycommand{test}
\end{frame}

\end{document}

答案4

笔记沃纳的回答比我的更好。


我能够做到这一点xparse

\NewDocumentCommand{\mycommand}{O{<2,4>} m}{\textcolor#1{red}{#2}}

此解决方案的一个问题是必须使用[ ]'s包装覆盖规范,如下所示:

\mycommand[<1-4>]{test}

完整代码:

\documentclass{beamer}
\usepackage{xparse}

\NewDocumentCommand{\mycommand}{O{<2,4>} m}{\textcolor#1{red}{#2}}

\begin{document}
 \frame{
  \mycommand{test}
  \mycommand[<1-4>]{test}
 }
\end{document}

相关内容