在编译了包括该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
。这个新钩子将新代码放在最后。
然而,现在情况似乎不再如此了。