Как добиться поведения, подобного \verb, с помощью xparse argspec?

Как добиться поведения, подобного \verb, с помощью xparse argspec?

Как использовать ранее отсканированный токен в качестве аргумента u{}в xparseargspec?

\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

Theответ от egregвероятно, является лучшим подходом в настоящее время, но я хотел бы взглянуть на это с точки зрения того, почему желаемый подход терпит неудачу. По сути, в этом есть две части.

На техническом уровне, включение аргументов для использования информации, захваченной ранее, (вероятно) выполнимо, но станет очень утомительным, чтобы сделать это полностью в общем: представьте себе функцию с девятью аргументами, здесь вы должны разрешить восемь возможных ранее захваченных аргументов. Использование выделенного вспомогательного, как в ответе egreg, избегает этой сложности, но должно быть сделано надля этого случаяоснова.

На концептуальном уровне, xparseпредназначен для создания 'LaTeX2e-подобных', но также 'согласованных' интерфейсов на уровне документа. Проблема с запросом здесь заключается в том, что интерфейсне являетсяпоследовательный: каждый раз, когда используется команда, нужно сканировать другой маркер. В идеале такие подходы не должны появляться в документах, и уж точно не с какой-либо регулярностью, поэтому необходимость поддержки этого xparseдалеко не ясна.

Связанный контент