
我想將命令注入到使用環境主體作為參數的任意環境中。
期望的行為
\begin{AnyEnvironment}{MandatoryEnvArg}[OptionalEnvArg]
...
\end{AnyEnvironment}
應該擴展到
\begin{AnyEnvironment}{MandatoryEnvArg}[OptionalEnvArg]
\MyMacro{...}
\end{AnyEnvironment}
其中...
是任意內容(可能包括\par
s 和其他環境和命令)。
使用案例
我對這個可能很奇怪的問題的用例如下:我希望能夠使用\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 分隔)。然而,這種方法對我來說更有希望。我嘗試閱讀l3basics
和l3quark
模組,因為我希望能在那裡找到答案;例如,\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}