將任意環境的主體傳遞給掛鉤指令

將任意環境的主體傳遞給掛鉤指令

我想將命令注入到使用環境主體作為參數的任意環境中。

期望的行為

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

應該擴展到

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

其中...是任意內容(可能包括\pars 和其他環境和命令)。

使用案例

我對這個可能很奇怪的問題的用例如下:我希望能夠使用\MyMacro.特別是,\MyMacro它本身會呼叫 Lua 命令,該命令\directlua會以字串形式接收環境主體,並在將其放回 TeX 的輸入流之前對其執行一些字串操作。作為一個基本範例:

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

更具體地說,這一切都是因為我很好奇是否可以實現對「簡寫」語法的支持(例如在typst,一個類似 LaTeX 的排版程式)在數學模式下。我的基本實驗產生了令人驚訝的好結果,所以我開始好奇我能在 LaTeX 中實現這種功能到什麼程度,因此我的問題具有普遍性。

要求

  • AnyEnvironment可以是任何可行的 LaTeX 環境。特別是,它可以:
    • 由使用者定義。
    • 由外部包定義。
    • 處於數學模式內(例如aligned),或啟動數學模式本身(例如align)。
    • 有任何類型的爭論。
    • 名稱中可能包含星號 ( *) 或破折號 ( )。-
    • 包含原語內容和/或目錄程式碼更改- 似乎支持這一點將非常困難(根據對此問題的評論)。

方法

重新定義環境

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

相關內容