breaklines=true 在 wrapfigure 旁边不起作用

breaklines=true 在 wrapfigure 旁边不起作用

我有一些带有代码的文字,旁边有一个图形。

我目前正在使用\begin{wrapfigure}0.5\textwidth 和lstinline[breaklines=true],但我的代码不会中断:

\paragraph{Rx-Pipeline}
\begin{wrapfigure}{r}{0.5\textwidth}
  \begin{center}
    \includegraphics[width=0.47\textwidth]{Inhalt/Bilder/marbles.png}
  \end{center}
  \caption{\label{fig:pipeline}Hier wird ein Bild mit wrapfig eingebunden}
\end{wrapfigure}

Die Rx-Pipeline für die Indexierung neuer Nextcloud-Daten ist, wie in \autoref{fig:pipeline} schematisch dargestellt,
in sieben einzelne Schritte unterteilt:

Zunächst wird die Liste an \lstinline[breaklines=true]|IndexingActions|, die der DataFetcher zurückgibt, in eine Reihe einzelner
\lstinline[breaklines=true]{Observables} verwandelt, um diese einzeln reaktiv abarbeiten zu können.

Im nächsten Schritt werden diejenigen \lstinline[breaklines=true]{IndexingAction}s gefiltert, deren Operation den Wert
\lstinline[breaklines=true]{INSERT} hat (wir befinden uns dann speziell in der Abarbeitung der neu hinzugefügten Dateien).

\blindtext[1]

在此处输入图片描述 密码破解在图像旁边不起作用吗?我在文档的其他地方没有遇到这种情况。

我该怎么做才能修复这个问题?手动破解它?

答案1

简短回答

正如评论中提到的,导致此问题的原因是listings没有找到合适的位置来中断内联列表。作为解决方案,下面的代码定义了一个新listings选项softbreaks[=false|true],该选项用新的可选断点替换内联列表中序列的每个出现位置\-。如果断点被视为换行符,则打印连字符,否则不打印任何内容。

长答案

listings\discretionary仅在以下标记之间的边界处插入可能的换行点(以项目的形式):

  • 标识符/关键字,即字符后跟一系列或者数字人物;
  • 数字、符号等,即一系列数字或者其他字符,不是由
  • 一系列空白/空格字符;或
  • 一系列字符,形成要由某项替换的序列literate

我们可以使用后一个事实来定义literate不可见打印的项目,而只是为换行算法添加新的可选断点。在这种情况下,可选连字符很有用。但是,像往常一样,事情并不那么简单listings。我们不能只是将一个额外的内容\discretionary放入项目的替换文本中literate,因为一个框包围了该文本。

我们改为在内部\lst@Literate命令中添加一个新的钩子,该钩子在运行文学代码的实际排版之前执行。有必要禁用通常的自由插入,因为否则序列<token>\-<token>将被处理为<token><discretionary><new discretionary><token>,因此<new discretionary>永远不会用于换行符。

在新的钩子中,我们检查找到的文字序列是否是那个\-,如果是,我们暂时禁用自由插入。当之后实际处理文字替换时,插入再次启用,但使用一个新例程来测试全局开关是否\if@usesoftbreak设置为 true。这仅在\-被替换时发生,因此其他文字项被正常的自由项包围。<token>\-<token>然后被正确处理为<token><new discretionary><token>

带有示例的完整代码

输出中最相关的列是\-使用 的最后一列。不幸的是,我无法弄清楚为什么softbreaks启用 的框的垂直间距略有不同。

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\usepackage{etoolbox}

\makeatletter

\newif\if@usesoftbreak

\let\lst@olddiscretionary=\lst@@discretionary
\def\lst@softbreak{\discretionary{-}{}{}}

\def\lst@newdiscretionary{%
%    \rule[-0.4ex]{0.4pt}{2ex}%
    \if@usesoftbreak
        \lst@softbreak
    \else
        \lst@olddiscretionary
    \fi
    \global\@usesoftbreakfalse
}

\patchcmd\lst@Literate{\ifx\lst@OutputBox\@gobble}%
    {\lst@hkBeforeLiterate{#2}\ifx\lst@OutputBox\@gobble}{}{}

\lst@AddToHook{DeInit}{%
    \global\@usesoftbreakfalse
    \global\let\lst@@discretionary=\lst@olddiscretionary
}

\def\lst@hkBeforeLiterate#1{%
    \def\@tempa{\lst@dosoftbreak}%
    \def\@tempb{#1}%
    \ifx\tempa\tempb
        \global\let\lst@@discretionary=\relax
    \fi
}

\lst@Key{softbreaks}{false}[t]{%
    \lstKV@SetIf{#1}\lst@ifsoftbreaks
    \lst@ifsoftbreaks
        \global\let\lst@@discretionary=\lst@newdiscretionary
        \lstset{breaklines}%
        \expandafter\def\expandafter\lst@literate\expandafter
            {\lst@literate{\\-}{\lst@dosoftbreak}1}%
    \fi
}

\def\lst@dosoftbreak{%
    \global\let\lst@@discretionary=\lst@newdiscretionary
    \global\@usesoftbreaktrue
}

\makeatother

\lstset{
    basicstyle=\ttfamily,
}

\newbox\demobox
\def\db#1{%
    \begin{lrbox}{\demobox}%
    \begin{minipage}{#1}%
    \raggedright
}
\def\enddb{%
    \end{minipage}%
    \end{lrbox}%
    \fbox{\usebox\demobox}%
}

\def\demo#1{%
    [#1]\par
    \smallskip
    \scantokens{%
        \db{5em}\lstinline[#1]|IndexingActions|\enddb \hspace{3em}%
        \db{5em}\lstinline[#1]|Indexing Actions|\enddb \hspace{3em}%
        \db{5em}\lstinline[#1]|Indexing-Actions|\enddb \hspace{3em}%
        \db{5em}\lstinline[#1]|Indexing\-Actions|\enddb \par
        \smallskip
        \db{13.6em}\lstinline[#1]|IndexingActions|\enddb \hspace{3em}%
        \db{13.6em}\lstinline[#1]|Indexing\-Actions|\enddb \par
    }%
}

\begin{document}
\parindent=0pt
\ttfamily

\demo{ }
\bigskip
\demo{breaklines}
\bigskip
\demo{softbreaks}
\bigskip
\demo{literate={A}{a}1,softbreaks}
\bigskip
\demo{breaklines}

\end{document}

在此处输入图片描述

相关内容