好吧,我知道这是一个相当艰巨的任务,但我正在根据我的答案制定一个方案这里,我包括了 Ahmed Musa 重新定义的环境\par
。问题是:
- 有些环境(例如列表)
\par
以我不想触碰的方式在内部使用。 - 其他环境(例如,还有列表)破坏了我对
\par
全球。 - 应该有一种简单的方法可以将一组段落从
\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
软件包为所有环境添加了开始和结束钩子。您可以使用它们来排除某些环境,即相应地删除或更改您的定义。有关详细信息,请参阅软件包手册。