Übergeben Sie den Hauptteil einer beliebigen Umgebung an den angeschlossenen Befehl.

Übergeben Sie den Hauptteil einer beliebigen Umgebung an den angeschlossenen Befehl.

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 \pars 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 \MyMacrowäre das ein Befehl, der selbst einen Lua-Befehl mit aufruft, \directluader 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

  • AnyEnvironmentkann 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 AnyEnvironmentArgumente vorhanden sind
  • Funktioniert nicht, wenn der Name (Sternchen) oder (Bindestrich) AnyEnvironmententhä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 \bgroupund \egroupist 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 Module l3basicsund einzulesen l3quark, da ich hoffte, dort eine Antwort zu finden. Beispielsweise \use_none_delimit_by_q_stop:w ... \q_stopkam 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 \BODYund \Collect@BodyBefehle
  • xparse– Ein generischer Dokumentbefehlsparser
    • Definitionen bund +bArgumenttypen
  • amsmath– AMS mathematische Einrichtungen für LaTeX
    • Definiert \collect@bodyBefehl

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}

verwandte Informationen