
Ich habe versucht, den Code inFarbiger Hintergrund in Inline-Auflistungen, was eigentlich dasselbe ist wie inWie kann ich \lstinline neu definieren, um alle Inline-Codefragmente automatisch hervorzuheben oder Rahmen darum zu zeichnen?, und ich bin auf das folgende Problem gestoßen.
Wenn der Absatz, in dem das \lstinline
erscheint, zwischen Seiten umbrochen ist, wird die Markierung auf die falsche Seite verschoben (nicht immer). Dies passiert auch, wenn der Absatz nicht umbrochen ist, wenn Latex-Fußnoten oder ein Schwebemechanismus dazwischenkommen und den Absatz auf die nächste Seite verschieben.
Das folgende MWE zeigt beide Probleme. Es ist derselbe Code wie in den zitierten Antworten, mit etwas mehr Text vor dem Beispiel, der das Problem im ersten Fall verursacht (Seitenumbruch im Absatz). Sie können die Zeile mit der Fußnote in der Nähe auskommentieren, \begin{document}
um auch das zweite Problem zu sehen (der ganze Absatz geht auf die nächste Seite, aber die Hervorhebung bleibt auf der ersten Seite).
\documentclass[a4paper]{article}
\usepackage{etoolbox}
\usepackage{atbegshi,ifthen,listings,tikz}
\usepackage{lipsum}
% change this to customize the appearance of the highlight
\tikzstyle{highlighter} = [
yellow,% set the color for inline listings here.
line width = \baselineskip,
]
% enable these two lines for a more human-looking highlight
%\usetikzlibrary{decorations.pathmorphing}
%\tikzstyle{highlighter} += [decorate, decoration = random steps]
% implementation of the core highlighting logic; do not change!
\newcounter{highlight}[page]
\newcommand{\tikzhighlightanchor}[1]{\ensuremath{\vcenter{\hbox{\tikz[remember picture, overlay]{\coordinate (#1 highlight \arabic{highlight});}}}}}
\newcommand{\bh}[0]{\stepcounter{highlight}\tikzhighlightanchor{begin}}
\newcommand{\eh}[0]{\tikzhighlightanchor{end}}
\AtBeginShipout{\AtBeginShipoutUpperLeft{\ifthenelse{\value{highlight} > 0}{\tikz[remember picture, overlay]{\foreach \stroke in {1,...,\arabic{highlight}} \draw[highlighter] (begin highlight \stroke) -- (end highlight \stroke);}}{}}}
%--------------------------
\makeatletter % Redefine macros from listings package:
\newtoggle{@InInlineListing}%
\togglefalse{@InInlineListing}%
\renewcommand\lstinline[1][]{%
\leavevmode\bgroup\toggletrue{@InInlineListing}\bh % \hbox\bgroup --> \bgroup
\def\lst@boxpos{b}%
\lsthk@PreSet\lstset{flexiblecolumns,#1}%
\lsthk@TextStyle
\@ifnextchar\bgroup{\afterassignment\lst@InlineG \let\@let@token}%
\lstinline@}%
\def\lst@LeaveAllModes{%
\ifnum\lst@mode=\lst@nomode
\expandafter\lsthk@EndGroup\iftoggle{@InInlineListing}{\eh{}}{}%
\else
\expandafter\egroup\expandafter\lst@LeaveAllModes
\fi%
}
\makeatother
\lstset{backgroundcolor=\color{green!10}}%
\begin{document}
\lipsum[1-5]
% Foo\footnote{\lipsum[6]}
This is a somewhat large paragraph which latex perhaps will break among two
pages. Hopefully this will show the intended problem, that is, that the
highligthed yellow box is shown in the page in which the paragraph started,
instead of the page in which the code actually landed. Some more sentences to
fill the required space will do. Blah, blah, lorem ipsum or whatever.
This is a test where \lstinline{A=1} should have a yellow background.
This, on the other hand, actually works:
\begin{lstlisting}[backgroundcolor=\color{green}]
A = 1
\end{lstlisting}
\end{document}
Dies ist das Ergebnis (nach zweimaligem Kompilieren). Das gelbe Kästchen neben „ipsum“ sollte sich im A=1
Inline-Code der zweiten Seite befinden.
Kann das behoben werden?
Antwort1
Ich kann eine Lösung anbieten, die auf der tcolorbox
version 2.80 (2014/03/31)
erst heute veröffentlichten Version basiert und bei der eine \lstinline
Umhüllung mithilfe von bereitgestellt wird xparse
. Anstatt das neue Makro \RenewTotalTCBox
aus Version zu verwenden 2.80
, können Sie auch eine Variation meiner Antwort aufWie erstelle ich mit \newtcbinputlisting eine Verbatim-Box?mit Version 2.72
.
Um Ihr Beispiel anzupassen, habe ich einige Sonderzeichen °
zur Abgrenzung gewählt \lstline
:
\documentclass[a4paper]{article}
\usepackage{etoolbox}
\usepackage{atbegshi,ifthen,listings,tikz}
\usepackage{lipsum}
\usepackage[most]{tcolorbox}% version 2.80 (2014/03/31)
\let\lstinlineoriginal=\lstinline
% change this to customize the appearance of the highlight
\tikzstyle{highlighter} = [
yellow,% set the color for inline listings here.
line width = \baselineskip,
]
\RenewTotalTCBox{\lstinline}{ O{} v }
{blank,boxsep=1pt,nobeforeafter,tcbox raise base,interior style={fill,highlighter}}
{\lstinlineoriginal[flexiblecolumns,#1]°#2°}
\lstset{backgroundcolor=\color{green!10}}%
\begin{document}
\lipsum[1-5]
% Foo\footnote{\lipsum[6]}
This is a somewhat large paragraph which latex perhaps will break among two
pages. Hopefully this will show the intended problem, that is, that the
highligthed yellow box is shown in the page in which the paragraph started,
instead of the page in which the code actually landed. Some more sentences to
fill the required space will do. Blah, blah, lorem ipsum or whatever.
This is a test where \lstinline{A=1} should have a yellow background.
This, on the other hand, actually works:
\begin{lstlisting}[backgroundcolor=\color{green}]
A = 1
\end{lstlisting}
\end{document}