我一直在搜索,但找不到使用该listings
包为代码列表添加图像背景的任何信息。有办法吗?
答案1
正如 PolGab 所说,总有办法tikz
。下面是使用 infamous\tikzmark
标记列表的开始和结束,然后添加一个剪裁为列表大小的图像的方法:
笔记:
这确实需要两次运行。第一次确定位置,第二次进行绘图。
来自
\tikzmark
在正文旁边添加大括号。
问题:
但这存在一些严重的问题:
列表之前需要一个空行(否则结果会令人惊讶)。
不确定为什么需要捏造事实,但他们最终将框架对齐到非常接近选项
fram=tb
绘制水平线的位置。
代码:
\documentclass{article}
\usepackage{listings}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{calc}
\usetikzlibrary{decorations.pathreplacing}
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\newcommand*{\AddBackgroundImage}[4][]{%
%\pgfmathsetmacrp{\height}{}%
\begin{tikzpicture}[overlay,remember picture]
\coordinate (VCenter) at ($(#2)!0.5!(#3)$);
\coordinate (Fudge) at (-\pgflinewidth,0);
\coordinate (VFudge) at (0,\baselineskip);
%\draw [red, thick,fill=yellow, fill opacity=0.2]% for debugging
\clip
($(#2)+ (Fudge) - 0.50*(VFudge)$) --
($(#2) + (\linewidth,0) - 0.50*(VFudge)$) --
($(#3) + (\linewidth,0) + 1.25*(VFudge)$) --
($(#3)+ (Fudge) + 1.25*(VFudge)$) -- cycle;
\path (VCenter) -- ++($(0.5*\linewidth,0)$)
node [opacity=0.3, #1] {\includegraphics[width=\linewidth]{#4}};
\end{tikzpicture}%
}%
\lstset{
language=C,
basicstyle=\small\sffamily,
%frame=tb,
numbers=left,
xleftmargin=5.0ex,
numberstyle=\tiny,
numbersep=4pt,
stepnumber=2,
keywordstyle=\color{blue}\bfseries
}
\lstset{emph={% Adjust any special keywords
printf%
},emphstyle={\color{red}\bfseries}%
}%
\begin{document}
\noindent
Here is an example of listings with a background image:
\noindent% Line above MUST be blank
\tikzmark{Start}%
\begin{lstlisting}
/* Hello World program */
#include<stdio.h>
struct cpu_info {
long unsigned utime, ntime, stime, itime;
long unsigned iowtime, irqtime, sirqtime;
};
main()
{
printf("Hello World");
}\end{lstlisting}
\tikzmark{End}
\AddBackgroundImage{Start}{End}{images/EiffelWide}%
%
\noindent
Some text afterwards.
\end{document}