任意の環境の本体をフックされたコマンドに渡す

任意の環境の本体をフックされたコマンドに渡す

環境本体を引数として使用するコマンドを任意の環境に挿入したいと思います。

望ましい行動

\begin{AnyEnvironment}{MandatoryEnvArg}[OptionalEnvArg]
  ...
\end{AnyEnvironment}

拡大すべき

\begin{AnyEnvironment}{MandatoryEnvArg}[OptionalEnvArg]
  \MyMacro{...}
\end{AnyEnvironment}

...任意の内容です (\parやその他の環境やコマンドが含まれる場合もあります)。

使用事例

この奇妙な質問に対する私の使用例は次のとおりです。 を使用して環境本体を「前処理」できるようにしたいのです\MyMacro。特に、は、環境本体を文字列として受け取り、TeX の入力ストリームに戻す前に文字列操作を実行する\MyMacroLua コマンドを呼び出すコマンドになります\directlua。基本的な例として、次のようになります。

\NewDocumentCommand{\MyMacro}{m}
  {
    \directlua
      {
        local str = "\luaescapestring{\unexpanded{#1}}"
        tex.sprint(str .. ' ~ ' .. str)
      }
  }

さらに具体的に言うと、これはすべて、私が「短縮形」構文(例えば、typst、LaTeX のようなタイプセッティング プログラム) を数式モードで使用しました。基本的な実験で驚くほど良い結果が得られたので、この種の機能を LaTeX でどこまで実現できるか興味が湧き、一般論として質問するようになりました。

要件

  • AnyEnvironment実行可能な LaTeX 環境であれば何でも構いません。具体的には、次のようになります。
    • ユーザー定義になります。
    • 外部パッケージによって定義されます。
    • 数式モード内(例:aligned)にいるか、数式モード自体をアクティブにします(例:align)。
    • あらゆる種類の議論をします。
    • 名前にアスタリスク ( *) またはダッシュ ( ) が含まれる場合があります。-
    • 逐語的な内容および/またはcatcodeの変更を含む— これをサポートするのは非常に難しいと思われます(この質問へのコメントによる)。

アプローチ

環境の再定義

\let\oldAnyEnvironment\AnyEnvironment
\let\endoldAnyEnvironment\endAnyEnvironment
\RenewDocumentEnvironment{AnyEnvironment}{+b}
  {\oldAnyEnvironment\MyMacro{#1}}{\endoldAnyEnvironment}

問題:

  • AnyEnvironment引数がある場合は動作しません
  • 名前に(アスタリスク) または(ダッシュ)AnyEnvironmentが含まれている場合は機能しません(ただし、これは簡単に修正できる可能性があります。アスタリスク付きの環境がおよびで参照されているのを見たことがあります。ダッシュにも同様のものがあるかもしれません)。*-\<env>star\end<env>star

フック付き

\ExplSyntaxOn
\NewDocumentCommand { \MyMacro } { m } { Argument:~#1. }
\AtBeginEnvironment { AnyEnvironment } { \MyMacro \bgroup }
\AtEndEnvironment   { AnyEnvironment } { \egroup }
\ExplSyntaxOff

問題:

  • 動作しません\bgroup\egroupこの目的には適していません引数は \bgroup と \egroup で区切られる可能性があります) ですが、このアプローチの方が私には有望に思えます。l3basicsl3quarkモジュールを読んでみました。そこに答えが見つかるかもしれないと思ったからです。たとえば、 は、\use_none_delimit_by_q_stop:w ... \q_stop環境本体を収集するために同様のものを使用できるのではないかと考えさせました。しかし、まだ解決策を見つけることができていません。

関連する質問:

関連パッケージ:

  • environ– LaTeX環境用の新しいインターフェース
    • 定義\BODY\Collect@Bodyコマンド
  • xparse– 汎用ドキュメントコマンドパーサー
    • 定義b+b引数の型
  • amsmath– LaTeX用のAMS数学機能
    • \collect@bodyコマンドを定義する

基本的な非動作例:

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

関連情報