Как использовать ранее отсканированный токен в качестве аргумента u{}
в xparse
argspec?
\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
далеко не ясна.