测试用户命令是否位于文档末尾

测试用户命令是否位于文档末尾

命令是否有机会\testcommand测试它是否是 之前的最后一个用户命令\end{document}?由于 处仍有钩子enddocument,这似乎有点棘手。

我正在考虑放置一个空命令\somethingempty并让它\testcommand检测它\peek_meaning:N(TF)。但是,如果我将它放在钩子中,首先\testcommand看到的将是某种\UseHook

提出这个问题的动机是,在我的包中,有一些间距调整命令应该只在文档中间完成。

下面是 MWE。

\documentclass{article}

\ExplSyntaxOn

\def\somethingempty{}
\NewDocumentCommand \testcommand { }
  {
    % \peek_meaning:NF \somethingempty
    \peek_regex:nF { (\ *)? (\c{par}*)? (\ *)? \c{somethingempty} }
      {
        %% Some code that only should happen in the middle of the text
        ``something in the middle of the text''
      }
  }

\AddToHook{enddocument}{\somethingempty}

\ExplSyntaxOff

\begin{document}

\testcommand

Text.

\testcommand

% \somethingempty

\end{document}

答案1

在一般情况下解决这个问题似乎确实很难,但“对于只应在文档中间完成的命令有一些间距调整”表明这两个限制可能没问题:

  1. “一些代码只应该出现在文本中间”只排版垂直模式的材料,并且

  2. 你只需要测试“最后一个用户命令产生水平模式材料\end{document}”。

如果这两个限制没有问题,那么你可以使用para/before钩子:

\documentclass{article}

\pagestyle{empty}

\ExplSyntaxOn

\def\somethingempty{}
\NewDocumentCommand \testcommand { }
  {
    \hook_gput_next_code:nn { para/before } {
        \vskip 1ex \relax
        \hrule width \textwidth height 1pt depth 0pt \relax
        \vskip 1ex \relax
    }
  }

\AddToHook{enddocument}{\somethingempty}

\ExplSyntaxOff

\begin{document}

\testcommand

Text.

\testcommand

Text.

\testcommand

\somethingempty

\end{document}

示例输出

相关内容