![如何安全地修改包中的 \everypar?](https://linux22.com/image/402112/%E5%A6%82%E4%BD%95%E5%AE%89%E5%85%A8%E5%9C%B0%E4%BF%AE%E6%94%B9%E5%8C%85%E4%B8%AD%E7%9A%84%20%5Ceverypar%EF%BC%9F.png)
这是\the\everypar 起什么作用?和TikZ Overlay:在下一段的开头注入内容?
从我快速grep -R '\\everypar' texmf-dist/tex/latex
看到的,它\everypar
被广泛用于不同的包中。有没有一种安全、一致的方式来使用\everypar
它将一些内容添加到某些段落的前面没有在此过程中破坏了其他软件包?我读到过ConTeXt 有\EveryPar
,但我认为这在 LaTeX 中不存在。
本质上我想创建一个宏,只在下一个段落在调用之后开始,但是没有途中损坏其他包裹。
例如,是否可以将自定义钩子插入到标记列表中,然后稍后再次将其删除 - 同时希望其他软件包不会在您不注意的时候清除标记列表?或者 TeX/LaTeX 中没有这样的功能?
答案1
最安全的方法可能是使用内联标题,例如以下内容噓到下一段的开头,然后清理\everypar
它,即使段落以组的形式开始,也可以以有效的方式执行此操作,就像这里一样。
\documentclass{article}
\begin{document}
\paragraph{Zzzzz}
\showthe\everypar
{abc}
{abc}
\end{document}
\@svsechd
从技术上讲,这是对您想要插入的代码进行本地定义,并设置一些布尔值来控制行为。
还有其他设置和恢复的方法\everypar
,但任何与段落开头混淆的包都应该(希望)已经检测到本节的第一个段落并做正确的事情,所以我要么直接使用,\paragraph
要么使用该机制的类似命令\@startsection
,或者至少复制足够的定义,\show\everypar
如果你运行上面的代码,你的代码看起来就像一个标准的乳胶运行标题。
答案2
为了方便未来的读者,我想参考cfr 提出的这个 LaTeX3 解决方案在类似的问题中:
\usepackage{l3galley,xparse}
\ExplSyntaxOn
\tl_gput_right:Nn \g_galley_par_begin_hook_tl
{
Any stuff that you want to put at the beginning of a paragraph.
}
\ExplSyntaxOff