我想通过改变两个符号的 catcode 来编写可以在 <> 内带有参数的命令。
\documentclass{beamer}
\newcommand{\mycommand}[3]{
This is #1. This is #2. This is #3.
}
\catcode`<=1
\catcode`>=2
\begin{document}
\begin{frame}
\mycommand<text 1>{text 2}<text 3>
\end{frame}
\end{document}
这不起作用。如何正确更改 catcode?或者是否有其他方法可以使此类命令可读而无需使用额外的包?
答案1
您必须将 catcode 设置移到后面,\begin{document}
因为强制执行和的beamer
catcode (更改序言中的 catcode 无论如何都是有问题的)。您可以执行以下操作:<
>
\begin{document}
\AtBeginDocument{%
\catcode`<=1\relax
\catcode`>=2\relax}
虽然更改和beamer
的 catcode可能会破坏很多,因为期望它们是 catcode-12。我建议您改为加载并使用分隔参数,这样您就不必更改 catcode:<
>
beamer
xparse
\documentclass{beamer}
\usepackage{xparse}
\NewDocumentCommand\mycommand{r<>mr<>}{%
This is #1. This is #2. This is #3.%
}
\begin{document}
\begin{frame}
\mycommand<text 1>{text 2}<text 3>
\end{frame}
\end{document}
并且,通过在命令签名中使用而不是 ,xparse
您可以将<...>
参数设为可选参数(它们通常在 中beamer
) 。这样,您可以检查是否给出了参数并进行递归调用。d<>
r<>
d
在下面的代码中,如果\mycommand
调用时没有<...>
-delimited 参数,则不会执行任何操作。否则,它会调用\mycommmandaux
采用<...>
-delimited 参数加上强制参数(以 分隔{...}
)并打印文本的函数,然后\mycommand
再次调用以查找更多内容。
\documentclass{beamer}
\usepackage{xparse}
\NewDocumentCommand\mycommand{d<>}{%
\IfValueT{#1}{\mycommandaux{#1}}}
\NewDocumentCommand\mycommandaux{mm}{%
This is #1. This is #2. \mycommand}
\begin{document}
\begin{frame}
\mycommand<text 1>{text 2}
\mycommand<text 1>{text 2}<text 3>{text 4}<text 5>{text 6}
\end{frame}
\end{document}