如何使用 xparse argspec 实现类似 \verb 的行为?

如何使用 xparse argspec 实现类似 \verb 的行为?

如何使用先前扫描的标记作为argspecu{}中的参数xparse

\documentclass{article}
\usepackage{xparse}

\NewDocumentEnvironment {some-cool-env} {D<>{\stopscan} u{#1}} {%
  Here is the text up until the stopping token: ``#2'' \newline
  Here's the rest of the environment:                  \par
} {}

\begin{document}
\begin{some-cool-env}
  I am a\stopscan teapot
\end{some-cool-env}

(some inner text)

\begin{some-cool-env}<|>
  A custom built|teapot.
\end{some-cool-env}
\end{document}

这将给予

Here is the text up until the stopping token: "I am a"
Here's the rest of the environment:

teapot

(some inner text)

Here is the text up until the stopping token: "A custom built"
Here's the rest of the environment:

teapot.

我怎样才能实现我想要的语法?(希望不会破坏xparse内部结构……)

上述简单的方法会产生以下错误:

ERROR: Illegal parameter number in definition of \__xparse_grab_arg:w.

--- TeX said ---
<to be read again> 
                   1
l.9 \DumbVerb
             <|>test|
--- HELP ---
This is probably caused by a \newcommand, \renewcommand,
\newenvironment, or \renewenvironment command in which a # is used
incorrectly.  A # character, except as part of the command name \#,
can be used only to indicate an argument parameter, as in #2, which
denotes the second argument. This error is also caused by nesting one
of the above four commands inside another, or by putting a parameter
like #2 in the last argument of a \newenvironment or \renewenvironment
command.

自从@egreg回答以来,我已经对问题主体进行了大量编辑,但问题标题保持不变。应该注意的是,@egreg回答的问题是针对用 定义的单个命令xparse。在这种情况下,他的答案是可行的,但不幸的是,它不能立即推广到定义类似的环境。(嗯,事实并非如此;您仍然可以定义辅助环境,但这仍然感觉像是作弊……)

答案1

这可能有点夸张xparse,但既然mu{#1}看起来可行,你可以分两个阶段进行:

\documentclass{article}
\usepackage{xparse}
\NewDocumentCommand\DumbVerb{D<>{|}}{\DumbVerbAux{#1}}
\NewDocumentCommand\DumbVerbAux{mu{#1}}{Here's #2}
\begin{document}
\DumbVerb test|

\DumbVerb<x>testx

\DumbVerb<\xyz>test\xyz
\end{document}

答案2

来自 egreg 的回答可能是目前最好的方法,但我想从为什么期望的方法会失败的角度来看待这个问题。这基本上分为两个部分。

从技术层面上讲,让参数使用先前抓取的信息(可能)是可行的,但一般来说,完全做到这一点会非常麻烦:想象一个有九个参数的函数,在这里你必须允许八个可能的先前抓取的参数。使用专用辅助函数(如 egreg 的答案中所述)可以避免这种复杂性,但必须在特别指定基础。

在概念层面上,xparse旨在创建“类似 LaTeX2e”但又“一致”的文档级界面。此处请求的问题是界面不是一致:每次使用该命令时,必须扫描不同的标记。理想情况下,这种方法不应该出现在文档中,当然也不应该有规律地出现,因此支持这种方法的必要性还xparse远未明确。

相关内容