임의 환경의 본문을 후크된 명령에 전달

임의 환경의 본문을 후크된 명령에 전달

환경 본문을 인수로 사용하는 임의의 환경에 명령을 삽입하고 싶습니다.

원하는 동작

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

다음으로 확장해야 함

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

...임의의 콘텐츠(아마도 \pars 및 기타 환경과 명령 포함)는 어디에 있습니까?

사용 사례

이 이상한 질문에 대한 나의 사용 사례는 다음과 같습니다. \MyMacro. 특히 환경 본체를 문자열로 수신하고 이를 TeX의 입력 스트림에 다시 넣기 전에 문자열 조작을 수행 \MyMacro하는 Lua 명령을 자체적으로 호출하는 명령이 될 것입니다 . \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가 있으면 작동하지 않습니다. (이것은 쉽게 고칠 수 있지만 별표 표시된 환경은 and 로 참조되는 것을 본 적이 있으며 대시와 비슷한 것이 있을 수도 있습니다.)*-\<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}

관련 정보