我想决定长行应该在哪里中断,但要在中断前/中断后执行操作,并且不在行号上前进。
我已经尝试过这个:
\documentclass{article}
\usepackage{color, xcolor, listings}
\def\postbreak{\raisebox{0ex}[0ex][0ex]{\ensuremath{\hookrightarrow\space}}}
\lstset{postbreak=\postbreak,
breaklines=true, breakatwhitespace=true,
basicstyle=\small\ttfamily,
xleftmargin=2em,xrightmargin=1em,
numbers=left,frame=single
}
\begin{document}
\begin{lstlisting}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent id mattis velit, ut ultricies massa.
In lacus libero, porttitor quis urna id.
\end{lstlisting}
\begin{lstlisting}[escapeinside={@}{@}]
Lorem ipsum dolor sit amet,@\newline\postbreak@ consectetur adipiscing elit.@\newline\postbreak@ Praesent id mattis velit,@\newline\postbreak@ ut ultricies massa.
In lacus libero, porttitor quis urna id.
\end{lstlisting}
\begin{lstlisting}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent id mattis velit, ut ultricies massa.
In lacus libero, porttitor quis urna id.
\end{lstlisting}
\end{document}
但它破坏了列表周围的行距和框架。
第一个框是我通常得到的,第二个框是我尝试放置换行符时得到的,第三个框是我想要得到的,但不会在列表中手动放置空格(因为当某些样式发生变化时它可能会损坏)
答案1
构建于Mike Renfro 的回答,您可以使用mdframed
包生成与原始框架相同的框架,不包括行号:
\documentclass{article}
\usepackage{xcolor, listings}
\usepackage[framemethod=tikz]{mdframed}
\def\postbreak{%
\raisebox{0ex}[0ex][0ex]{\ensuremath{\hookrightarrow\space}}}
\lstset{postbreak=\postbreak,
breaklines=true, breakatwhitespace=true,
basicstyle=\small\ttfamily,
xleftmargin=2em,xrightmargin=1em,
numbers=left
}
\mdfdefinestyle{myframe}
{
hidealllines=true,
singleextra={
\draw
([xshift=16pt]O|-P) --
([xshift=16pt]O) --
(P|-O) --
(P) -- cycle;
},
firstextra={
\draw
([xshift=16pt]O) --
([xshift=16pt]O|-P) --
(P) --
(P|-O);
},
secondextra={
\draw
([xshift=16pt]O|-P) --
([xshift=16pt]O) --
(P|-O) --
(P);
},
middleextra={
\draw
([xshift=16pt]O|-P) --
([xshift=16pt]O);
\draw
(P|-O) --
(P);
},
innerleftmargin=0pt,
innerrightmargin=3pt,
innertopmargin=0pt,
innerbottommargin=0pt,
rightmargin=7pt,
}
\surroundwithmdframed[style=myframe]{lstlisting}
\begin{document}
\begin{lstlisting}[escapeinside={@}{@}]
Lorem ipsum dolor sit amet,@\newline\postbreak@ consectetur adipiscing elit.@\newline\postbreak@ Praesent id mattis velit,@\newline\postbreak@ ut ultricies massa.
In lacus libero, porttitor quis urna id.
\end{lstlisting}
\end{document}
答案2
工作于使用列表和框架包格式化源列表,如果你不介意框架绕着行号转,你可以使用framed
打包并保持你的框架和换行符完好无损。
\usepackage{framed}
...
\begin{framed}
\begin{lstlisting}[escapeinside={@}{@}]
Lorem ipsum dolor sit amet,@\newline\postbreak@ consectetur adipiscing elit.@\newline\postbreak@ Praesent id mattis velit,@\newline\postbreak@ ut ultricies massa.
In lacus libero, porttitor quis urna id.
\end{lstlisting}
\end{framed}