在 \newcommand 内逐字使用

在 \newcommand 内逐字使用

可能已经有人回答了这个问题。但我没找到。如何在\newcommand{}或中使用 verbatim \begin{environment}...\end{environment}。在我的 MWE 中,最后两行会产生错误。

\documentclass{article}

\newcommand{\FIXME}[1]{#1}
\newcommand{\FIXMA}[1]{\verb+#1+}

\begin{document}
    \noindent
    \verb+test test test+ \\
    \FIXME{test test test}
    \FIXME{\verb+test test test+}
    \FIXMA{test test test}
\end{document}

答案1

阅读这个问题时,我想到了几件事。

可能性1) \detokenize

David 在评论中提出了这一点。原帖作者回复说他/她对宏名称后自动引入的空格感到不满\detokenize。这让我想起了这个问题,逐字打印小的 TeX 代码并渲染它,它提供了两个答案。Egreg 接受的答案使用了一种\ExplSyntaxOn方法(xparse包),其中

\usepackage{xparse} 
\ExplSyntaxOn 
\NewDocumentCommand{\showcase}{v} { \texttt{#1} } 
\ExplSyntaxOff

提供逐字宏。我胆怯地尝试将其合并到另一个宏中,但没有成功,但我不知道\ExplsyntaxOnegreg 的方法是否可以适应 OP 的需求。

这个问题的另一个答案是我自己提出的,我在其中引入了\detokenizeplus,以捕获烦人的空格并尝试消除它们。虽然我可以让它适用于那个特定的问题,但正如我在答案中指出的那样,这种方法并不是万无一失的。尽管如此,还是有机会\detokenizeplus在另一个宏中使用以获得该方法的好处\detokenize,但没有烦人的空格。

可能性2: verbatimbox

我的verbatimbox包可能也适用于此,但根据 OP 提供的有限示例,很难判断。该包的verbbox环境的作用是允许将verbatim内容保存在 LaTeX 框中,以便稍后重新使用\theverbbox(请注意,还有一个myverbbox环境允许指定框的唯一名称)。

因此,虽然verbatim无法使用此方法在宏内指定内容,但之前指定的verbatim内容可以(内联)在宏内呈现。以下是如何实现此操作的示例:

\documentclass{article}
\usepackage{verbatimbox}
\newcommand{\FIXME}[1]{$>>>$#1$<<<$}
\begin{document}
    \noindent
    $>>>$\verb+test test test+$<<<$ \\
    \FIXME{test test test}\\
    \begin{verbbox}test test test\end{verbbox}
    \FIXME{\theverbbox}\\
\end{document}

在此处输入图片描述

答案2

我不清楚你想达到什么目的。如果你真的需要逐字材料,你可以\lstinline使用listings包裹:

\documentclass{article}
\usepackage{listings}

\lstset{basicstyle=\ttfamily}
\newcommand{\FIXME}[1]{#1}
\newcommand{\FIXMD}{\lstinline}

\begin{document}
    \noindent
    \FIXME{test \lstinline!test! test}\\
    \FIXMD!test \text{AAA} test!
\end{document}

在此处输入图片描述

请注意,这\FIXMD确实是多余的,但正如我所说,我不清楚这些命令的真正用途是什么。

相关内容