当任何组开始时,如何重新定义宏,然后当该组结束时再次定义宏?

当任何组开始时,如何重新定义宏,然后当该组结束时再次定义宏?

好吧,我知道这是一个相当艰巨的任务,但我正在根据我的答案制定一个方案这里,我包括了 Ahmed Musa 重新定义的环境\par。问题是:

  1. 有些环境(例如列表)\par以我不想触碰的方式在内部使用。
  2. 其他环境(例如,还有列表)破坏了我对\par 全球
  3. 应该有一种简单的方法可以将一组段落从\par重新定义中排除。

在文档中解释一下重新定义的环境只是为了方便,你实际上应该只在其中放入纯文本,这很好\par。但我想知道是否有更好的方法。


我想做的事如果可能的话,重新定义宏(实际上\par,但我们称之为\a=\a@new),这样当任何环境或{分隔组开始时,它就会被设置为\a@old。然后当具体的环境或组结束后,它应该被立即设置回\a@new,即使\a在此期间被全局重新定义。

因此,忽略空格,

\def\a{old a}
\def\a@new{new a}

\a
\begin{redefa}
    \a
    {\a}
    {
        \gdef\a{\emph{weird} a}
        \a
        {\a}
    }
    \a
\end{redefa}
\a

应该给予

旧 a
    新 a
    旧 a
        诡异的A
        诡异的
    的
旧的

这可能吗?

答案1

笔记:这是我针对特定问题所制定的解决方案。如果有人能给出更清晰或更通用的答案,我会接受。

感谢 Bruno Le Floch 的建议\currentgrouplevel

everyhook提供了一种非常安全的方式来附加内容\everypar,这让我可以在开始时运行它每一段

首先,我使用 检查环境变化\@currenvir。然后,为了克服{- 分隔的组,我还检查段落是否与 相同\currentgrouplevel\begin{autopn}如果两个检查都通过,\par则重新定义只有一次– 下次使用时,它将采用之前的值\begin{autopn}

但如果检查持续通过,\par就会持续被重新定义。因此,如果某些东西\gdef\par\par一旦组返回环境,它就会被重新定义autopn

\RequirePackage[excludeor]{everyhook}

\newcount\PN@env@depth
\def\@PN@autopn{autopn}
\newenvironment{autopn}
    {\PN@env@depth=\currentgrouplevel}
    {\parnotes}
\PushPostHook{par}{%
    % check for environment changes
    \ifx\@currenvir\@PN@autopn
        % check for {-delimited groups
        \ifnum\currentgrouplevel=\PN@env@depth
            \let\PN@par@orig\par
            \def\par{%
                \PN@par@orig
                %
                % check again at the end of the paragraph in case the paragraph spans groups
                %
                \ifx\@currenvir\@PN@autopn
                    \ifnum\currentgrouplevel=\PN@env@depth
                        % the new code I wanted to inject
                        \parnotes
                    \fi
                \fi
                % restore the definition of \par; then everything just repeats next paragraph
                \let\par\PN@par@orig
            }
        \fi
    \fi}

答案2

etextool软件包为所有环境添加了开始和结束钩子。您可以使用它们来排除某些环境,即相应地删除或更改您的定义。有关详细信息,请参阅软件包手册。

相关内容