![在 \newcommand 内逐字使用](https://linux22.com/image/320856/%E5%9C%A8%20%5Cnewcommand%20%E5%86%85%E9%80%90%E5%AD%97%E4%BD%BF%E7%94%A8%20.png)
可能已经有人回答了这个问题。但我没找到。如何在\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
提供逐字宏。我胆怯地尝试将其合并到另一个宏中,但没有成功,但我不知道\ExplsyntaxOn
egreg 的方法是否可以适应 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
确实是多余的,但正如我所说,我不清楚这些命令的真正用途是什么。