使用列表创建斑马效果

使用列表创建斑马效果

这个问题导致了一个新的方案的出现:
lstlinebgrdlstaddons捆)

朋友们,请考虑以下使用该listings包的示例:

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage{beramono}
\usepackage{listings}
\begin{document}

\begin{lstlisting}[language=C,basicstyle=\ttfamily]
/**
* Prints Hello World.
**/
#include <stdio.h>

int main(void) {
   printf("Hello World!");
   return 0;
}
\end{lstlisting}

\end{document}

输出正如我们预期的那样:

你好世界

我想知道我们是否可以添加一些我所知道的东西斑马效应(请原谅我对这个术语的误解)。我知道这是表格中使用的一种常见样式,其中行交替显示颜色,因此得名斑马。前面的示例看起来应类似于以下内容:

你好斑马

有人有什么想法吗?

答案1

以下代码可产生斑马纹效果。请参阅下文了解说明。

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage{beramono}
\usepackage{listings}
\usepackage{xcolor}

\newcommand\realnumberstyle[1]{}

\makeatletter
\newcommand{\zebra}[3]{%
    {\realnumberstyle{#3}}%
    \begingroup
    \lst@basicstyle
    \ifodd\value{lstnumber}%
        \color{#1}%
    \else
        \color{#2}%
    \fi
        \rlap{\hspace*{\lst@numbersep}%
        \color@block{\linewidth}{\ht\strutbox}{\dp\strutbox}%
        }%
    \endgroup
}
\makeatother


\begin{document}

\begin{lstlisting}[language=C,basicstyle=\ttfamily,numberstyle=\zebra{green!35}{yellow!35},numbers=left]
/**
* Prints Hello World.
**/
#include <stdio.h>

int main(void) {
   printf("Hello World!");
   return 0;
}
\end{lstlisting}

\bigskip

% If you want to make the bars shorter you need to use a `minipage` or similar environment:
\noindent
\begin{minipage}{.45\textwidth}
\begin{lstlisting}[language=C,basicstyle=\ttfamily,numberstyle=\zebra{green!25}{white},numbers=left]
/**
* Prints Hello World.
**/
#include <stdio.h>

int main(void) {
   printf("Hello World!");
   return 0;
}
\end{lstlisting}
\end{minipage}

\end{document}

结果

我的第一个想法是使用backgroundcolor一个取决于行号的条件,但它似乎只用于装箱整个列表。在研究了listings一段时间的源代码以了解如何破解行处理之后,我想到了一个想法,即(误)使用numberstyle。它以行号寄存器作为参数调用,并\llap在距离为的内排版。我只是在内numbersep放置了一个低级命令\colorboxxcolor包),称为放置彩色条。这需要。如果您不想让行号保持原样,或者以其他方式重新定义它。\color@block\rlapnumbers=left\realnumberstyle

如果您只想要一种颜色,您可以使用以下定义和numberstyle=\zebra{<color>}

\newcommand{\zebra}[2]{%
    {\realnumberstyle{#2}}%
    \begingroup
    \lst@basicstyle
    \ifodd\value{lstnumber}%
        \color{#1}%
        \rlap{\hspace*{\lst@numbersep}%
        \color@block{\linewidth}{\ht\strutbox}{\dp\strutbox}%
        }%
    \fi
    \endgroup
}

与此同时,我再次查看了listings源代码,这次是针对numbers键。以下包破解了这个键,插入了自己的处理程序,而不会像上面的代码那样干扰编号。然后,它提供了一组listings名为的新键/选项linebackground...,用于设置背景颜色,以及高度、深度、宽度、间隔甚至绘图命令。

您可以使用 来设置颜色linebackgroundcolor=<some color code>,它可以容纳条件。默认背景颜色是,即当前前景色 (别名为 ) 的对立面 ( ) 。-.框绘制代码跟在括号内的颜色代码后面,因此如果不需要背景 (甚至不需要白色),则颜色代码可以简单地将框绘制代码作为参数吞噬。-.xcolor

% lstlinebgrd.sty
\RequirePackage{listings}
\RequirePackage{xcolor}

% 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
}

用法:

\documentclass{article}

\usepackage{lstlinebgrd}

\begin{document}

\begin{lstlisting}[language=C,basicstyle=\ttfamily,linebackgroundcolor={\ifodd\value{lstnumber}\color{green}\fi}]
/**
* Prints Hello World.
**/
#include <stdio.h>

int main(void) {
   printf("Hello World!");
   return 0;
}
\end{lstlisting}

\begin{lstlisting}[language=C,basicstyle=\ttfamily\Large,linebackgroundcolor={\ifodd\value{lstnumber}\color{green}\else\color{yellow}\fi},linebackgroundsep=1em,linebackgroundwidth=18em]
/**
* Prints Hello World.
**/
#include <stdio.h>

int main(void) {
   printf("Hello World!");
   return 0;
}
\end{lstlisting}

\begin{lstlisting}[language=C,basicstyle=\ttfamily\tiny,linebackgroundcolor={\color{blue!\the\numexpr 5*\value{lstnumber}\relax}},linebackgroundheight=1.7ex,linebackgrounddepth=.4ex]
/**
* Prints Hello World.
**/
#include <stdio.h>

int main(void) {
   printf("Hello World!");
   return 0;
}
/**
* Prints Hello World.
**/
#include <stdio.h>

int main(void) {
   printf("Hello World!");
   return 0;
}
\end{lstlisting}


\end{document}

结果

相关内容