Seite 1 von 1

Ausrichtung Rahmen: Listing mit Überschrift

Verfasst: Do 19. Mär 2015, 09:38
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!

Verfasst: Do 19. Mär 2015, 11:54
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}

Verfasst: Do 19. Mär 2015, 12:11
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.ä...

Verfasst: Do 19. Mär 2015, 13:30
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

Verfasst: Do 19. Mär 2015, 22:04
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?

Verfasst: Fr 20. Mär 2015, 10:35
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