Como posso usar um token verificado anteriormente como argumento u{}
em um 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}
o que daria
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.
Como posso conseguir a sintaxe que gostaria? (Espero que sem invadir xparse
o interior de…)
A abordagem ingênua acima produz o seguinte erro:
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.
Editei bastante o corpo da pergunta desde a resposta de @egreg, mas o título da pergunta permanece o mesmo. Deve-se notar que a pergunta respondida por @egreg foi para comandos únicos definidos com xparse
. Nesse caso, a sua resposta funcionaria, mas infelizmente não é imediatamente generalizável para definir ambientes semelhantes. (Bem, isso não é verdade; você ainda pode definir um ambiente auxiliar, mas isso ainda parece trapaça…)
Responder1
Provavelmente isso está exagerando xparse
, mas como mu{#1}
parece funcionar, você pode fazer isso em duas etapas:
\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}
Responder2
Oresposta de egregé provavelmente a melhor abordagem no momento, mas gostaria de analisar isso do ponto de vista do motivo pelo qual a abordagem desejada falha. Existem essencialmente duas partes nisso.
Em um nível técnico, permitir que argumentos usem informações capturadas anteriormente é (provavelmente) factível, mas seria muito cansativo de fazer de maneira geral: imagine uma função com nove argumentos, aqui você tem que permitir oito possíveis argumentos capturados anteriormente. Usar um auxiliar dedicado, como na resposta do egreg, evita essa complexidade, mas deve ser feito de maneiraAd hocbase.
A nível conceitual, xparse
pretende-se criar interfaces 'semelhantes ao LaTeX2e', mas também 'consistentes' em nível de documento. O problema com a solicitação aqui é que a interfacenão éconsistente: cada vez que o comando é usado, um marcador diferente deve ser verificado. Idealmente, tais abordagens não deveriam aparecer em documentos, certamente não com qualquer regularidade, por isso a necessidade de apoiar isto xparse
está longe de ser clara.