使用 xparse 重新定义覆盖感知 beamer 命令

使用 xparse 重新定义覆盖感知 beamer 命令

假设希望\texttt命令接受两个可选参数具有默认值在强制性内容之前和之后,以便指定应该在电传文本前面或后面添加的任何内容(此处为空格)(请参阅免责声明)。

有两个可选参数让我想到了xparse。这可能是一种有效的方法:

\documentclass[varwidth,border=1mm]{standalone}
\usepackage{xcolor,xparse}

\NewCommandCopy{\OldTexttt}{\texttt}
\RenewDocumentCommand{\texttt}{O{\,} m O{\,}}{#1\OldTexttt{#2}#3\null}

\begin{document}
    --\OldTexttt{Hello}--

    --\texttt{Hello}--

    --\textcolor{red}{\texttt{Hello}}--

    --\textcolor{blue}{\texttt[\quad]{Hello}[\qquad]}--
\end{document}

但是,在 beamer 演示文稿中使用相同的代码时,使用 new \textttinside会失败。我猜这是因为类重新定义了命令以使其具有覆盖感知能力,如下所示\textcolorbeamer\texttt

\renewcommand<>{\texttt}{\only#1{\beameroriginal{\texttt}}}

但我真的不明白下面到底发生了什么未编译代码,特别是导致Paragraph ended before \texttt was complete. \end{frame}错误的原因。有人能解释一下失败的原因吗?

\documentclass{beamer}
\usepackage{xparse}

\NewCommandCopy{\OldTexttt}{\texttt}
\RenewDocumentCommand{\texttt}{O{\,} m O{\,}}{#1\OldTexttt{#2}#3\null}

% My workaround at the moment:
% \RenewDocumentCommand{\texttt}{O{\,} m O{\,}}{#1{\ttfamily#2}#3\null}

\begin{document}
    \begin{frame}{}
        --\OldTexttt{Hello}--
    
        --\texttt{Hello}--
        
        --\textcolor{red}{\texttt{Hello}}--
        
        --\textcolor{blue}{\texttt[\quad]{Hello}[\qquad]}--
    \end{frame}
\end{document}

现在,摆脱“两个可选参数方法”(我仍然想理解),我认为也可以\,在电传文本周围添加一个固定空格(例如),然后定义一个新命令来更改它。但是,我未能修改上面的 beamer 重新定义,以便添加\,空格电传文本。这可能吗?怎么做?顺便说一句,我发现\beameroriginal 仍在使用 \let而不是\NewCommandCopy存储原始命令,但我不确定这是否与此相关。

附加问题

\null尊重电传文本后的空格是个好主意吗?在内部 LATEX2e 宏列表texdoc macros2e)对我来说似乎不错,但我没有那么多经验来真正判断。

免责声明

这更像是一个学术问题,目的是更好地理解 LaTeX 机制,而不是真正的需求。我知道这\texttt[A]{xxx}[B]仅仅相当于A\texttt{xxx}B,但这里的重点是 (i) 几乎总是使用默认值,在需要时仍具有充分的灵活性,更重要的是 (ii) 理解/学习更多。

相关内容