使用我的包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
您可以执行以下操作:
- 定义环境的相应命令版本(后面称为
\YourCommandVersionOfTheEnvironment
)。这很容易,因为在环境定义中您应该已经使用了#1
。 - 您可以定义如下内容,而不是使用
\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
}
这样,您就可以成功地将处理应用到文件内容。