Добавление горизонтальных линий до и после рамки листинга

Добавление горизонтальных линий до и после рамки листинга

У меня есть листинг, и я хотел бы добавить hlineдо и после листинга. Использование framesпараметра стиля не работает так, как предполагалось, по двум причинам: 1. Я хочу сохранить левую полосу как разделитель от нумерации и исходного кода; и 2. Между верхней/нижней строкой фрейма и левой нет пробела.

Пример кода:

\documentclass{article}
\usepackage{listings}
\usepackage{lipsum}

\lstdefinestyle{CEE}{language=C, frame=l,  numbers=left,  numbersep=1em,  xleftmargin=2em} 

\begin{document}

\lipsum[1]

\begin{lstlisting}[style=CEE, caption={Hello world}]
#include <stdio.h>

int main(int argc, char *argv[])
{
    printf("Hello world\n");
    return 0;
}
\end{lstlisting}

\lipsum[2]
\end{document}

Это дает нам:

введите описание изображения здесь

Но я хочу, чтобы \hlineэто заполняло всю область \textwidth, а не только ширину кадра, как в (отредактировано GIMP)

введите описание изображения здесь

Обратите внимание, что интервал и ширина линии неверны, так как это всего лишь редактирование в gimp. Идея в том же интервале, что и в tableenvironment. Как:

введите описание изображения здесь

решение1

введите описание изображения здесь

Я использовал пакет tcolorboxдля получения строк. Вы можете изменить параметры среды tmpboxв соответствии со своими потребностями. Однако есть одна проблема: я не думаю, что возможно определить новую среду, которая объединяет tmpboxи lstlisting. Поэтому вам придется вызывать tmpboxкаждый раз явно.

\documentclass[11pt, a4paper]{article}
\usepackage{geometry}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{tcolorbox}
\tcbuselibrary{skins,breakable}

\newenvironment{tmpbox}{%
  \tcolorbox[%
  empty,
  parbox=false,
  noparskip,
  enhanced,
  breakable,
  frame hidden,
  boxrule=0pt,
  colback=white,
  left=-.5ex, % right=-4pt,
  before skip=.1ex plus 2pt,
  after skip=1ex plus 2pt,
  overlay unbroken and last={%
    \draw ($(frame.north west)+(0, -6ex)$)
    -- +(1\textwidth, 0);
    \draw ($(frame.south west)+(0, 2ex)$)
    -- +(1\textwidth, 0);    
  }]
}{\endtcolorbox}

\usepackage{listings}
\lstdefinestyle{CEE}{%
  frame=l, language=C, numbers=left, numbersep=1em, xleftmargin=2em
}

\usepackage{lipsum}

\begin{document}
\begin{center}\large\bfseries
  Adding horizontal lines about listings
\end{center}


% See \verb|https://en.wikibooks.org/wiki/LaTeX/Source_Code_Listings|.

\lipsum[1]

\begin{tmpbox}
  \begin{lstlisting}[style=CEE, caption={Hello world with hlines}]
  #include <stdio.h>
  int main(int argc, char *argv[])
  {
    printf("Hello world\n");
    return 0;
  }
\end{lstlisting}
\end{tmpbox}

\lipsum[3]

\begin{lstlisting}[style=CEE, caption={Hello world}]
  #include <stdio.h>
  int main(int argc, char *argv[])
  {
    printf("Hello world\n");
    return 0;
  }
\end{lstlisting}

\lipsum[4]
\end{document}

Связанный контент