
Ich möchte einen Befehl in eine beliebige Umgebung einfügen, der den Umgebungstext als Argument verwendet.
Gewünschtes Verhalten
\begin{AnyEnvironment}{MandatoryEnvArg}[OptionalEnvArg]
...
\end{AnyEnvironment}
Sollte erweitert werden auf
\begin{AnyEnvironment}{MandatoryEnvArg}[OptionalEnvArg]
\MyMacro{...}
\end{AnyEnvironment}
Wobei ...
sich beliebige Inhalte befinden (ggf. auch \par
s und andere Umgebungen und Befehle).
Anwendungsfall
Mein Anwendungsfall für diese vielleicht seltsame Frage ist der folgende: Ich möchte den Umgebungskörper mit „vorverarbeiten“ können \MyMacro
. Insbesondere \MyMacro
wäre das ein Befehl, der selbst einen Lua-Befehl mit aufruft, \directlua
der den Umgebungskörper als Zeichenfolge empfängt und einige Zeichenfolgenmanipulationen daran vornimmt, bevor er wieder in den Eingabestrom von TeX eingefügt wird. Als einfaches Beispiel:
\NewDocumentCommand{\MyMacro}{m}
{
\directlua
{
local str = "\luaescapestring{\unexpanded{#1}}"
tex.sprint(str .. ' ~ ' .. str)
}
}
Genauer gesagt begann alles damit, dass ich neugierig war, ob ich Unterstützung für "Kurzschrift"-Syntaxen implementieren könnte (wie sie intypst
, ein LaTeX-ähnliches Satzprogramm) im Mathematikmodus. Meine grundlegenden Experimente haben überraschend gute Ergebnisse gebracht, sodass ich neugierig wurde, wie weit ich diese Art von Funktionalität in LaTeX bringen könnte, daher der allgemeine Charakter meiner Frage.
Anforderungen
AnyEnvironment
kann jede mögliche LaTeX-Umgebung sein. Insbesondere kann es:- Benutzerdefiniert sein.
- Durch externe Pakete definiert werden.
- Befinden Sie sich im Mathematikmodus (z. B.
aligned
) oder aktivieren Sie den Mathematikmodus selbst (z. B.align
). - Haben Sie Argumente aller Art.
- Der Name kann Sternchen (
*
) oder Bindestriche ( ) enthalten.-
- Enthalten wörtlichen Inhalt und/oder Catcode-Änderungen– Es scheint, dass es sehr schwierig wäre, dies zu unterstützen (gemäß den Kommentaren zu dieser Frage).
Ansätze
Umwelt neu definieren
\let\oldAnyEnvironment\AnyEnvironment
\let\endoldAnyEnvironment\endAnyEnvironment
\RenewDocumentEnvironment{AnyEnvironment}{+b}
{\oldAnyEnvironment\MyMacro{#1}}{\endoldAnyEnvironment}
Probleme:
- Funktioniert nicht, wenn
AnyEnvironment
Argumente vorhanden sind - Funktioniert nicht, wenn der Name (Sternchen) oder (Bindestrich)
AnyEnvironment
enthält (das lässt sich aber möglicherweise leicht beheben, ich habe gesehen, dass mit Sternchen versehene Umgebungen mit und bezeichnet werden , und vielleicht gibt es etwas Ähnliches für Bindestriche).*
-
\<env>star
\end<env>star
Mit Haken
\ExplSyntaxOn
\NewDocumentCommand { \MyMacro } { m } { Argument:~#1. }
\AtBeginEnvironment { AnyEnvironment } { \MyMacro \bgroup }
\AtEndEnvironment { AnyEnvironment } { \egroup }
\ExplSyntaxOff
Probleme:
- Funktioniert nicht
\bgroup
und\egroup
ist für diesen Zweck nicht geeignet (siehe auchArgumente, die möglicherweise durch \bgroup und \egroup abgegrenzt sind). Dieser Ansatz erscheint mir jedoch vielversprechender. Ich habe versucht, mich in die Modulel3basics
und einzulesenl3quark
, da ich hoffte, dort eine Antwort zu finden. Beispielsweise\use_none_delimit_by_q_stop:w ... \q_stop
kam mir der Gedanke, dass vielleicht etwas Ähnliches verwendet werden könnte, um den Umgebungskörper zu erfassen. Ich habe es jedoch bisher nicht geschafft, eine Lösung zu finden.
Verwandte Fragen:
Verwandte Pakete:
environ
– Eine neue Schnittstelle für Umgebungen in LaTeX- Definiert
\BODY
und\Collect@Body
Befehle
- Definiert
xparse
– Ein generischer Dokumentbefehlsparser- Definitionen
b
und+b
Argumenttypen
- Definitionen
amsmath
– AMS mathematische Einrichtungen für LaTeX- Definiert
\collect@body
Befehl
- Definiert
Einfaches, nicht funktionierendes Beispiel:
\documentclass{article}
\ExplSyntaxOn
\makeatletter
\NewDocumentEnvironment { AnyEnvironment } {} {} {}
\NewDocumentCommand { \MyMacro } { m } { Contents: ~ #1. }
\AtBeginEnvironment { AnyEnvironment } { \MyMacro \bgroup }
\AtEndEnvironment { AnyEnvironment } { \egroup }
\makeatother
\ExplSyntaxOff
\begin{document}
\begin{AnyEnvironment}
Example.
\end{AnyEnvironment}
\end{document}