以下 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
会更改设置。\parshape
breaklines
从代码来看,我认为只要lstlisting
在必须为 换行的段落中没有出现 ,那么结合使用这两个包是没问题的。如果在这样的段落中使用不带选项的 ,wrapfigure
则不会出现此警告,但结果仍然是错误的。lstlisting
breaklines
另一方面,使用\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
从包外部修补当前钩子。