我有类似的东西:
\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}
命令的一部分。出于许多其他原因(请参阅参考资料),最好使用它们,尤其是当您想要嵌套\if
s 时。
当然,在这个简单的例子中您不一定需要这个。
参考
代码
\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>
如果未给出值则返回。在内部,o
和d
类型是适当构造类型参数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}