%20mit%20einer%20Hintergrundfarbe%3F.png)
Ich möchte entweder eine ganze Codezeile in einer Auflistung oder einen Teil einer Zeile (einen Unterausdruck) mit einer Hintergrundfarbe hervorheben (um die Syntaxhervorhebung nicht zu beeinträchtigen).
Ich verwende lstlistings
die Umgebung aus dem „Listings“-Paket.
Antwort1
Bei Listings ist ein Wechsel zu TeX möglich, so dass Sie eine Box in den Hintergrund stellen können:
\documentclass{standalone}
\usepackage{listings,xcolor}
\lstset{language=c,escapechar=|}
\begin{document}
\begin{lstlisting}
int main (int argc, char ** argv)
{
|\makebox[0pt]{\color{yellow}\rule[-0.1ex]{30em}{2ex}}|printf("Hello, world\n");
exit(0);
}
\end{lstlisting}
\end{document}
Antwort2
Hier ist eine benutzerfreundliche Lösung, die auf Beiträgen dieser Site basiert.
Quellen:
- Erstellen eines Zebraeffekts mithilfe von Auflistungen
- Listung, Zebraeffekt und unterbrochene Linien
- Hervorheben von Zeilenbereichen in einer Listenliste: Teillösung, aber Erweiterungsprobleme
Der Code:
\documentclass[10pt,a4paper]{article}
\usepackage[utf8x]{inputenc}
\usepackage{ucs}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{xcolor}
\usepackage{listings}
\usepackage{pgf}
\usepackage{pgffor}
% Define backgroundcolor
\usepackage[
style=1,
skipbelow=\topskip,
skipabove=\topskip
]{mdframed}
\definecolor{bggray}{rgb}{0.85, 0.85, 0.85}
\mdfsetup{
leftmargin = 20pt,
rightmargin = 20pt,
backgroundcolor = bggray,
middlelinecolor = black,
roundcorner = 15
}
\BeforeBeginEnvironment{lstlisting}{\begin{mdframed}\vskip-.5\baselineskip}
\AfterEndEnvironment{lstlisting}{\end{mdframed}}
\makeatletter
%
% \btIfInRange{number}{range list}{TRUE}{FALSE}
%
% Test if int number <number> is element of a (comma separated) list of ranges
% (such as: {1,3-5,7,10-12,14}) and processes <TRUE> or <FALSE> respectively
%
\newcount\bt@rangea
\newcount\bt@rangeb
\newcommand\btIfInRange[2]{%
\global\let\bt@inrange\@secondoftwo%
\edef\bt@rangelist{#2}%
\foreach \range in \bt@rangelist {%
\afterassignment\bt@getrangeb%
\bt@rangea=0\range\relax%
\pgfmathtruncatemacro\result{ ( #1 >= \bt@rangea) && (#1 <= \bt@rangeb) }%
\ifnum\result=1\relax%
\breakforeach%
\global\let\bt@inrange\@firstoftwo%
\fi%
}%
\bt@inrange%
}
\newcommand\bt@getrangeb{%
\@ifnextchar\relax%
{\bt@rangeb=\bt@rangea}%
{\@getrangeb}%
}
\def\@getrangeb-#1\relax{%
\ifx\relax#1\relax%
\bt@rangeb=100000% \maxdimen is too large for pgfmath
\else%
\bt@rangeb=#1\relax%
\fi%
}
%
% \btLstHL{range list}
%
\newcommand{\btLstHL}[1]{%
\btIfInRange{\value{lstnumber}}{#1}%
{\color{blue!30}}%
{\def\lst@linebgrd}%
}%
%
% \btInputEmph[listing options]{range list}{file name}
%
\newcommand{\btLstInputEmph}[3][\empty]{%
\lstset{%
linebackgroundcolor=\btLstHL{#2}%
\lstinputlisting{#3}%
}% \only
}
% Patch line number key to call line background macro
\lst@Key{numbers}{none}{%
\def\lst@PlaceNumber{\lst@linebgrd}%
\lstKV@SwitchCases{#1}{%
none&\\%
left&\def\lst@PlaceNumber{\llap{\normalfont
\lst@numberstyle{\thelstnumber}\kern\lst@numbersep}\lst@linebgrd}\\%
right&\def\lst@PlaceNumber{\rlap{\normalfont
\kern\linewidth \kern\lst@numbersep
\lst@numberstyle{\thelstnumber}}\lst@linebgrd}%
}{%
\PackageError{Listings}{Numbers #1 unknown}\@ehc%
}%
}
% New keys
\lst@Key{linebackgroundcolor}{}{%
\def\lst@linebgrdcolor{#1}%
}
\lst@Key{linebackgroundsep}{0pt}{%
\def\lst@linebgrdsep{#1}%
}
\lst@Key{linebackgroundwidth}{\linewidth}{%
\def\lst@linebgrdwidth{#1}%
}
\lst@Key{linebackgroundheight}{\ht\strutbox}{%
\def\lst@linebgrdheight{#1}%
}
\lst@Key{linebackgrounddepth}{\dp\strutbox}{%
\def\lst@linebgrddepth{#1}%
}
\lst@Key{linebackgroundcmd}{\color@block}{%
\def\lst@linebgrdcmd{#1}%
}
% Line Background macro
\newcommand{\lst@linebgrd}{%
\ifx\lst@linebgrdcolor\empty\else
\rlap{%
\lst@basicstyle
\color{-.}% By default use the opposite (`-`) of the current color (`.`) as background
\lst@linebgrdcolor{%
\kern-\dimexpr\lst@linebgrdsep\relax%
\lst@linebgrdcmd{\lst@linebgrdwidth}{\lst@linebgrdheight}{\lst@linebgrddepth}%
}%
}%
\fi
}
\makeatother
\begin{document}
\begin{lstlisting}[
language = C,
linebackgroundcolor = {\btLstHL{4-6,9}},
]
/**
* Prints Hello World.
**/
#include <stdio.h>
}
int main(void) {
printf("Hello World!");
return 0;
}
\end{lstlisting}
\end{document}