命令参数的 Catcode 更改

命令参数的 Catcode 更改

我想通过改变两个符号的 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}因为强制执行和的beamercatcode (更改序言中的 catcode 无论如何都是有问题的)。您可以执行以下操作:<>\begin{document}

\AtBeginDocument{%
  \catcode`<=1\relax
  \catcode`>=2\relax}

虽然更改和beamer的 catcode可能会破坏很多,因为期望它们是 catcode-12。我建议您改为加载并使用分隔参数,这样您就不必更改 catcode:<>beamerxparse

\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}

在此处输入图片描述

相关内容