假设希望\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 \texttt
inside会失败。我猜这是因为类重新定义了命令以使其具有覆盖感知能力,如下所示\textcolor
beamer
\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) 理解/学习更多。