Wie kann ich mit einer xparse-Argumentspezifikation ein \verb-ähnliches Verhalten erreichen?

Wie kann ich mit einer xparse-Argumentspezifikation ein \verb-ähnliches Verhalten erreichen?

Wie kann ich ein zuvor gescanntes Token als Argument u{}in einer xparseArgspec verwenden?

\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}

Das würde geben

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.

Wie kann ich die gewünschte Syntax erreichen? (Hoffentlich ohne in xparsedie internen Vorgänge einzudringen…)

Der naive Ansatz oben führt zu folgendem Fehler:

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.

Ich habe den Fragentext seit @egregs Antwort ziemlich bearbeitet, aber der Fragentitel ist derselbe geblieben. Es sollte beachtet werden, dass die Frage, die @egreg beantwortet hat, sich auf einzelne Befehle bezog, die mit definiert wurden xparse. In einem solchen Fall würde seine Antwort funktionieren, aber sie ist leider nicht unmittelbar auf die Definition ähnlicher Umgebungen übertragbar. (Nun, das stimmt nicht; Sie können immer noch eine Hilfsumgebung definieren, aber das fühlt sich trotzdem wie Betrug an…)

Antwort1

Das ist wahrscheinlich zu viel verlangt xparse, aber es mu{#1}scheint zu funktionieren. Sie können es in zwei Schritten tun:

\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}

Antwort2

DerAntwort von egregist derzeit wahrscheinlich der beste Ansatz, aber ich möchte dies aus der Perspektive betrachten, warum der gewünschte Ansatz fehlschlägt. Dabei gibt es im Wesentlichen zwei Teile.

Auf technischer Ebene ist es (wahrscheinlich) machbar, Argumente so zu aktivieren, dass sie zuvor erfasste Informationen verwenden, aber es wäre sehr mühsam, dies im Allgemeinen vollständig zu tun: Stellen Sie sich eine Funktion mit neun Argumenten vor. Hier müssen Sie acht mögliche zuvor erfasste Argumente zulassen. Die Verwendung eines dedizierten Hilfselements, wie in der Antwort von egreg, vermeidet diese Komplexität, muss jedoch auf einerad hocBasis.

Auf konzeptioneller Ebene xparsesoll eine 'LaTeX2e-ähnliche', aber auch 'konsistente' Schnittstelle auf Dokumentebene geschaffen werden. Das Problem mit der hier gestellten Anfrage ist, dass die Schnittstelleist nichtkonsistent: Bei jeder Verwendung des Befehls muss nach einem anderen Marker gesucht werden. Im Idealfall sollten solche Ansätze nicht in Dokumenten auftauchen, schon gar nicht mit irgendeiner Regelmäßigkeit, daher xparseist die Notwendigkeit, dies zu unterstützen, alles andere als klar.

verwandte Informationen