noindentafter 和 etoolbox (> v2.5f) 之间不兼容?

noindentafter 和 etoolbox (> v2.5f) 之间不兼容?

在编译了包括该noindentafter包在内的一些遗留代码之后,我注意到它们产生了一个以前从未出现过的警告:

Package noindentafter Warning: Patching `\end' failed!
(noindentafter)                `\NoIndentAfter...' commands won't work.

etoolbox我认为该消息是软件包(在中使用)更新的结果,noindentafter因为其修订历史记录指出:

2.5g 2019-09-09 更新修补程序\begin\end提前更新 LaTeX 内核更改

也许该补丁导致了与 的一些不兼容noindentafter。以下是 MWE:

\documentclass[11pt]{article}
\usepackage{noindentafter}
\NoIndentAfterEnv{enumerate}
\setlength{\parindent}{3em}% % To make the indentation clearly visible 

\begin{document}

\begin{enumerate}
\item[(1)]  Some text.
\item[(2)]  Some other text.
\end{enumerate}

Text that should not be indented.
\end{document}

结果如下:

在此处输入图片描述

欢迎任何提示!

答案1

想要noindentafter修补\end(这是不好的做法),以便注入一些代码。随着 LaTeX 的最新版本,它\end已经变得很强大,但以一种相当奇怪的方式,xpatch在这种情况下变得毫无用处。

该包应该做

\expandafter\patchcmd\csname end \endcsname{%
  \if@ignore\@ignorefalse\ignorespaces\fi%
}{%
  \if@ignore\@ignorefalse\ignorespaces\fi%
  \csuse{@noindent@#1@hook}%
}{}{%
  \PackageWarningNoLine{noindentafter}{%
    Patching `\string\end' failed!\MessageBreak%
    `\string\NoIndentAfter...' commands won't work%
  }%
}

您可以自己做,但是在软件包更新之前,您必须忍受无害的警告。

\documentclass[11pt]{article}
\usepackage{noindentafter}
\NoIndentAfterEnv{enumerate}
\setlength{\parindent}{3em}% % To make the indentation clearly visible 

\makeatletter
\expandafter\patchcmd\csname end \endcsname{%
  \if@ignore\@ignorefalse\ignorespaces\fi%
}{%
  \if@ignore\@ignorefalse\ignorespaces\fi%
  \csuse{@noindent@#1@hook}%
}{}{%
  \PackageWarningNoLine{noindentafter}{%
    Patching `\string\end' failed!\MessageBreak%
    `\string\NoIndentAfter...' commands won't work%
  }%
}
\makeatother

\begin{document}

\begin{enumerate}
\item[(1)]  Some text.
\item[(2)]  Some other text.
\end{enumerate}

Text that should not be indented.
\end{document}

在此处输入图片描述

我不确定该包是否有用,因为这样更容易不留下空行\end{enumerate}并获得完全相同的输出。

\documentclass[11pt]{article}
\setlength{\parindent}{3em}% % To make the indentation clearly visible

\begin{document}

\begin{enumerate}
\item[(1)]  Some text.
\item[(2)]  Some other text.
\end{enumerate}
Text that should not be indented.

\end{document}

答案2

我发现不再需要\end直接修补。etoolbox-macro\AfterEndEnvironment现在可以做同样的事情。以下代码对我有用,是从noindentafter-package 复制而来。

\newcommand*\@NoIndentAfter{%
    \@ifnextchar\par{%
        \def\par{%
            \everypar{\setbox\z@\lastbox\everypar{}}%
            \@restorepar%
        }%
    }{}%
}
\newrobustcmd*{\NoIndentAfterThis}{\@NoIndentAfter\par\par}

\AfterEndEnvironment{enumerate}{\NoIndentAfterThis}

我认为这只适用于更新版本\end(见@egregs 回答关于更新),因为noindentafter软件包作者明确写道:

该软件包etoolbox提供了命令\AfterEndEnvironment,该命令会创建一个在命令内部非常靠后的位置执行的钩子\end。但是,这个钩子仍然位于 之前\ignorespaces,这太早了,无法正确抑制环境后的缩进。因此,现在将另一个钩子添加到\end using中\patchcmd。这个新钩子将新代码放在最后。

然而,现在情况似乎不再如此了。

相关内容