![为什么`\everypar`会被下一段开头的一对非空括号所干扰?](https://linux22.com/image/459720/%E4%B8%BA%E4%BB%80%E4%B9%88%60%5Ceverypar%60%E4%BC%9A%E8%A2%AB%E4%B8%8B%E4%B8%80%E6%AE%B5%E5%BC%80%E5%A4%B4%E7%9A%84%E4%B8%80%E5%AF%B9%E9%9D%9E%E7%A9%BA%E6%8B%AC%E5%8F%B7%E6%89%80%E5%B9%B2%E6%89%B0%EF%BC%9F.png)
在自定义伪列表环境的末尾,我重新定义\@doendpe
以防止环境后面的段落缩进,无论后面是否有空行\end{env}
(第一种情况)或没有空行(第二种情况)。这适用于大多数用例(第一种到第三种情况)。
但是,如果紧跟在环境后面的段落开头有一对非空的花括号,则无缩进也会扩展到下一个段落(第 4 种情况)。如果组为空,则它会按预期工作(第 5 种情况):
\documentclass{article}
\parindent8mm
\author{}
\title{}
\makeatletter
\let\orig@doendpe\@doendpe
\newenvironment{mylist}
{\list{}{%
\leftmargin0pt
\parindent0pt
\bfseries\sffamily
}\item\relax}
{\endlist
\gdef\@doendpe{%
\@endpetrue
\everypar{{\setbox\z@\lastbox}\everypar{}\@endpefalse}%
\global\let\@doendpe\orig@doendpe}%
}
\makeatother
\begin{document}
\begin{mylist}
1st case
\end{mylist}
test test test
test test test
test test test
\begin{mylist}
2nd case
\end{mylist}
test test test
test test test
test test test
\begin{mylist}
3rd case
\end{mylist}
[test test test]
test test test
test test test
\begin{mylist}
4th case
\end{mylist}
{[}test test test{]}
test test test
test test test
\begin{mylist}
5th case
\end{mylist}
{}test test test
test test test
test test test
\end{document}
输出:
我想知道(1),为什么当括号后紧接着一对非空括号时,此解决方案会中断\end
(以及为什么当括号为空时它不会中断)以及(2),我需要在环境的定义使其适用于所有五种用例。
答案1
案例 4 中的括号及其中的文本表示该段落以组为单位开始。在此组中\everypar
执行,并且确实会重置自身,但仅限于本地,因此在组之后,重置自身的“doendpe-everypar”魔法再次失效。
您可以改用 para hook:
\documentclass{article}
\parindent8mm
\author{}
\title{}
\newenvironment{mylist}
{\list{}{%
\leftmargin0pt
\parindent0pt
\bfseries\sffamily
}\item\relax}
{\endlist\AddToHookNext{para/begin}{\OmitIndent}}
\begin{document}
\begin{mylist}
1st case
\end{mylist}
test test test
test test test
test test test
\begin{mylist}
2nd case
\end{mylist}
test test test
test test test
test test test
\begin{mylist}
3rd case
\end{mylist}
[test test test]
test test test
test test test
\begin{mylist}
4th case
\end{mylist}
{[}test test test{]}
test test test
test test test
\begin{mylist}
5th case
\end{mylist}
{}test test test
test test test
test test test
\end{document}