我有一些带有代码的文字,旁边有一个图形。
我目前正在使用\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}