如何使用先前扫描的标记作为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
远未明确。