手动换行,就像列表列表中的自动换行一样

手动换行,就像列表列表中的自动换行一样

我想决定长行应该在哪里中断,但要在中断前/中断后执行操作,并且不在行号上前进。

我已经尝试过这个:

\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}

在此处输入图片描述

相关内容