lstinline 与 breaklines=true 与 wrapfig 冲突,导致警告

lstinline 与 breaklines=true 与 wrapfig 冲突,导致警告

以下 MWE 显示一条警告,打印如下:

\documentclass{article}

\usepackage{listings}
\usepackage{wrapfig}

\lstset{breaklines=true}

\begin{document}

\begin{wrapfigure}{r}{0.5\linewidth}
  Lorem ipsum dolor sit amet, consectetur adipiscing elit.
\end{wrapfigure}

Etiam ac quam dui. \lstinline{test}

\end{document}
Package wrapfig Warning: wrapfigure used inside a conflicting environment on input line 14.

删除该breaklines选项可以消除警告。在环境lstinline后面的段落中不使用wrapfigure也可以消除警告。

lstinline本段落中每使用一次,就会重复一次警告。

输出看起来不错。忽略警告是否安全?有没有办法lstinline在环境breaklines=true之后使用wrapfigure

我查看了相关问题,例如包裹图错误https://stackoverflow.com/questions/1677433/how-do-i-correctly-insert-an-image-figure-and-have-the-text-flow-around-the-im,但两者都归结为语法不正确。

答案1

wrapfig\parshape当检测到段落形状已更改为与其自身内部格式不相似的形状时,它会在重新定义中发出此警告。此钩子仅在段落未完全换行以覆盖当前时才处于活动状态wrapfigure。这里的问题是,当启用选项以缩进因行太长而断开的行时,listings会更改设置。\parshapebreaklines

从代码来看,我认为只要lstlisting在必须为 换行的段落中没有出现 ,那么结合使用这两个包是没问题的。如果在这样的段落中使用不带选项的 ,wrapfigure则不会出现此警告,但结果仍然是错误的。lstlistingbreaklines

另一方面,使用\lstinline在所有情况下都应该没问题,即使它太长而无法放在当前行中。在这种情况下,您可能会收到很多警告,但输出仍然应该是正确的,因为\lstinline文本被标准换行算法破坏,并且本身不使用段落形状。

如果您想摆脱这些警告,在您确定这些警告是不必要的报告后,您可以使用以下开关\DisableConflictWarning\EnableConflictWarning抑制并稍后重新启用警告:

\documentclass{article}
\usepackage{listings}
\usepackage{wrapfig}

\lstset{breaklines=true, basicstyle=\ttfamily}

\makeatletter
\let\origWF@conflict=\WF@conflict
\newcommand\DisableConflictWarning{\let\WF@conflict=\relax}
\newcommand\EnableConflictWarning{\let\WF@conflict=\origWF@conflict}
\makeatother

\begin{document}

\begin{wrapfigure}{r}{0.5\linewidth}
  Lorem ipsum dolor sit amet, consectetur adipiscing elit.
\end{wrapfigure}

\DisableConflictWarning
Etiam ac quam dui. \lstinline{test test test test test test} Etiam ac quam dui. Etiam ac quam dui. Etiam ac quam dui. Etiam ac quam dui. Etiam ac quam dui. Etiam ac quam dui. Etiam ac quam dui. Etiam ac quam dui. Etiam ac quam dui.

\end{document}

在此处输入图片描述

在我看来,listings永远不应该设置\parshape在 上\lstinline。因此必须在包代码中进行适当的修复。我看不出有办法Init从包外部修补当前钩子。

相关内容