文件钩子中的 \begin 和 \end 导致错误

文件钩子中的 \begin 和 \end 导致错误

使用我的包jwjournal,整个文档被放入名为 的环境中jwjournal,该环境会对文本进行一些正则表达式替换。但是,如果文本是通过\input或来输入的\include,则文件内容将不会被环境处理。作为解决这个问题的临时方法,可以在 之前停止此环境,然后\input重新启动此环境,并且子文件的内容必须放在\begin{jwjournal}和之间\end{jwjournal}

由于我不想让用户被这个内部环境所困扰,我想通过文件钩子自动执行此操作。因此我写了以下代码:

\hook_gput_code:nnn { begindocument/end } { jwjournal }
  {
    \hook_gput_code:nnn { file/before } { jwjournal }
      {
        \begin{jwjournal}
      }
    \hook_gput_code:nnn { file/after } { jwjournal }
      {
        \end{jwjournal}
      }
  }

然而,这并没有起到作用,反而产生了错误:

File ended while scanning use of \environment jwjournal .
<inserted text> 

我该如何正确实现这一目标?


下面是用于测试的文档。

main.tex

\documentclass[12pt, color entry]{jwjournal}

\ExplSyntaxOn

\NewDocumentCommand \InputJournal { m }
  {
    \end{jwjournal}
    \input{#1}
    \begin{jwjournal}
  }
\NewDocumentCommand \IncludeJournal { m }
  {
    \end{jwjournal}
    \include{#1}
    \begin{jwjournal}
  }

\hook_gput_code:nnn { begindocument/end } { jwjournal }
  {
    \hook_gput_code:nnn { file/before } { jwjournal }
      {
        \begin{jwjournal}
      }
    \hook_gput_code:nnn { file/after } { jwjournal }
      {
        \end{jwjournal}
      }
  }

\ExplSyntaxOff

\begin{document}

\InputJournal{Entrys/2023/01}

\end{document}

./Entrys/2023/01.tex

2023-01-01
==========

Some text

期望的输出应该是这样的:

在此处输入图片描述

答案1

如果像我一样,您在环境中使用b-type 参数来获取其内容,那么为了使功能能够与 type 命令一起使用\input\include您可以执行以下操作:

  1. 定义环境的相应命令版本(后面称为\YourCommandVersionOfTheEnvironment)。这很容易,因为在环境定义中您应该已经使用了#1
  2. 您可以定义如下内容,而不是使用\input\include与文件挂钩来添加环境的\begin\end(这会导致类似于我的问题中所述的错误):
\NewDocumentCommand \MyInput { m }
  {
    \file_get:nnN { #1 } { } \l_tmpa_tl
    \exp_args:No \YourCommandVersionOfTheEnvironment { \l_tmpa_tl }
  }
\NewDocumentCommand \MyInclude { m }
  {
    \clearpage
    \MyInput { #1 }
    \clearpage
  }

这样,您就可以成功地将处理应用到文件内容。

相关内容