Ausrichtung Rahmen: Listing mit Überschrift

Schriftbild, Absätze und Auflistungen einstellen


Rodnay
Forum-Newbie
Forum-Newbie
Beiträge: 3
Registriert: Do 19. Mär 2015, 09:27

Ausrichtung Rahmen: Listing mit Überschrift

Beitrag von Rodnay »

Guten Morgen!

Ich probiere gerade in meinem Dokument die Listings mit einer gut formatierten Überschrift und Rahmen zu Versehen. Das Template dafür kommt von
http://stackoverflow.com/questions/7419 ... onal-books

Leider kommt es zu einer minimal falschen Ausrichtung der Rahmen (etwa 1px?)

Ich habe folgendes Beispieldokument, das den Fehler reproduziert:
\documentclass{report}

\usepackage{color}
\usepackage{xcolor}
\usepackage{listings}

\usepackage{caption}
\DeclareCaptionFont{white}{\color{white}}
\DeclareCaptionFormat{listing}{\colorbox{gray}{\parbox{\textwidth}{#1#2#3}}}
\captionsetup[lstlisting]{format=listing,labelfont=white,textfont=white}

\lstdefinestyle{framed}
{
     frame=lrb,         
     belowcaptionskip=-1pt,
     xleftmargin=8pt,
     framexleftmargin=8pt,
     framexrightmargin=5pt,
     framextopmargin=5pt,
     framexbottommargin=5pt,
     framesep=0pt,
     rulesep=0pt,
 }

\begin{document}

\begin{lstlisting}[style=framed,label=some-code,caption=Some Code]
public void here() {
    goes().the().code()
}
\end{lstlisting}

\end{document}
Das Ergebnis sieht dann so aus:
Bild

Der Rahmen ist um etwa 1px nach links verschoben gegenüber der Überschrifts-Box. Ich vermute, das hat irgendwie mit dem Rahmen der Überschrift zu tun. Ich habe nicht rausgefunden, wie ich diesen setzen kann.

Wenn ich das Verhältnis xleftmargin zu framexleftmargin ändere, dann verschiebt sich der Rahmen insgesamt relativ zu der Box. Eine genaue Ausrichtung erreiche ich so aber nicht, selbst wenn ich feinere Einheiten verwende.

Vielen Dank vorab für jeden Hinweis!

MGommes

Beitrag von MGommes »

Man könnte auch tcolorbox verwenden, siehe folgendes Beispiel im Online Editor.
\documentclass{scrreprt}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{tcolorbox}
\tcbuselibrary{listings}

\begin{document}

\section*{Vorschlag}

Hier mal ein Vorschlag aus tcolorbox.pdf.

\bigskip
% \tcbuselibrary{listings} /or/ \tcbuselibrary{listingsutf8}
\begin{tcblisting}{colback=yellow!5,colframe=yellow!50!black,listing only,
title=This is source code in another language (XML), fonttitle=\bfseries,
listing options={language=XML,columns=fullflexible,keywordstyle=\color{red}}}
<?xml version="1.0"?>
<project name="Package tcolorbox" default="documentation" basedir=".">
<description>
Apache Ant build file (http://ant.apache.org/)
</description>
</project>
\end{tcblisting}

\end{document}

Rodnay
Forum-Newbie
Forum-Newbie
Beiträge: 3
Registriert: Do 19. Mär 2015, 09:27

Beitrag von Rodnay »

Danke für den Hinweis MGommes!
Das sieht tatsächlich gut aus, würde aber erfordern, dass ich alle listings in meiner gesamten Arbeit noch einmal umschreiben müsste (extrem viele).

Eine reine Markup-Lösung wäre mir daher am liebsten.
Was kann es denn an Gründen für die Verschiebung geben? Problem ist, dass ich die Überschrift per captionsetup nur sehr eingeschränkt konfigurieren kann. Ich habe keinen direkten Zugriff auf Margins o.ä...

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

Du musst caption nur um die Breite der Linie (in der Voreinstellung .4pt) nach links schieben.

Außerdem sind Deine Listings zu breit. Ich hab das jetzt mal gleich mit korrigiert:
\documentclass{report} 
\usepackage{xcolor} 
\usepackage{listings} 

\usepackage{caption} 
\DeclareCaptionFont{white}{\color{white}} 
\DeclareCaptionFormat{listing}{%
  \hspace*{-0.4pt}\colorbox{gray}{\parbox{\dimexpr\textwidth-2\fboxsep+.8pt\relax}{#1#2#3}}} 
\captionsetup[lstlisting]{format=listing,labelfont=white,textfont=white} 

\lstdefinestyle{framed} 
{ 
      frame=lrb,         
      belowcaptionskip=-1pt, 
      xleftmargin=8pt,
      framexleftmargin=8pt, 
      xrightmargin=5pt,% ergänzt
      framexrightmargin=5pt, 
      framextopmargin=5pt, 
      framexbottommargin=5pt, 
      framesep=0pt,
      rulesep=0pt, 
  } 

%\usepackage{showframe}% Seitenaufteilung anzeigen
\begin{document} 

\begin{lstlisting}[style=framed,label=some-code,caption=Some Code] 
 public void here() { 
     goes().the().code() 
} 
\end{lstlisting} 

\end{document} 
Gruß
Elke

Rodnay
Forum-Newbie
Forum-Newbie
Beiträge: 3
Registriert: Do 19. Mär 2015, 09:27

Beitrag von Rodnay »

Perfekt, herzlichen Dank esdd! Funktioniert super.

Eine kleine Nachfrage noch - ist aber nur ein Detail:
Damit die Rahmen links/rechts bündig mit der Box wurden, musste ich das "belowcaptionskip" auf -1pt setzen. Dadurch wird natürlich auch der Text innerhalb der Box beeinflusst und erscheint nun höher (siehe Bild Eröffnungspost).
Gibts auch da eine Möglichkeit zur Steuerung?

esdd
Forum-Meister
Forum-Meister
Beiträge: 2561
Registriert: So 7. Feb 2010, 16:36

Beitrag von esdd »

framextopmargin scheint nur dann Einfluss zu haben, wenn eine Linie oberhalb gezeichnet wird, also bei der Option frame auch t angegeben ist. Dann musst Du aber in belowcaptionskip noch die Tiefe einer \strutbox und \fboxsep berücksichtigen.
\documentclass{report} 
\usepackage{xcolor} 
\usepackage{listings} 

\usepackage{caption} 
\DeclareCaptionFont{white}{\color{white}} 
\DeclareCaptionFormat{listing}{% 
   \hspace*{-0.4pt}\colorbox{gray}{\parbox{\dimexpr\textwidth-2\fboxsep+.8pt\relax}{#1#2#3}}}
\captionsetup[lstlisting]{format=listing,labelfont=white,textfont=white} 

\lstdefinestyle{framed} 
{ 
       frame=lrbt,         
       belowcaptionskip=\dimexpr\dp\strutbox+\fboxsep-1.2pt\relax, 
       xleftmargin=8pt, 
       framexleftmargin=8pt, 
       xrightmargin=5pt,% ergänzt 
       framexrightmargin=5pt, 
       framextopmargin=5pt, 
       framexbottommargin=5pt, 
       framesep=0pt, 
       rulesep=0pt, 
   } 

\begin{document} 
\begin{lstlisting}[style=framed,label=some-code,caption=Some Code] 
  public void here() { 
      goes().the().code() 
} 
\end{lstlisting} 
\end{document} 
Gruß
Elke

Antworten