根据条件将可选参数传递给列表环境

根据条件将可选参数传递给列表环境

我正在尝试制作一个可以选择性编译为讲义的演示文稿。此演示文稿还包含突出显示的代码片段。为了突出显示,我使用来自的代码这个问题。(在我的实际演示中效果很好,但是在最小的示例中,产生的高光太靠右了。)

当我为讲义模式编译时,列表中的最后一行突出显示仍存在。因此,我正在寻找某种方法来有条件地禁用突出显示。

我目前拥有的:

条件:

\newif\ifhandout
\handouttrue
\ifhandout
   \documentclass[handout]{beamer}
\else
  \documentclass{beamer}
\fi

重点突出:

\begin{frame}[fragile]{ListingTest}
  \begin{lstlisting}[linebackgroundcolor={
    \btLstHL<1>{1-3}
    \btLstHL<2>{6,9}
    }]
    ... some code thats at least 9 lines long
  \end{lstlisting}
\end{frame}

现在的问题是,我不知道如何实现可选linebackground参数的可选编译。另一个问题是我必须在列表环境中转义命令。我尝试将ifs 放置在各种位置,例如:

\ifhandout
\begin{lstlisting}
(*@\else
\begin{lstlisting}[linebackgroundcolor={
  \btLstHL<1>{1-3}
  \btLstHL<2>{6,9}
  }](*@\fi@*)
    ... code
\end{lstlisting}

但一切都没有按预期进行。(我甚至设法将它们放置在将列表中的所有代码折叠在一行中的方式。)

有人知道,当ist时,我怎样才能[]从编译中排除参数?handouttrue

这是完整的“最小”测试示例。提前谢谢您。

\newif\ifhandout

\handouttrue

\ifhandout
    \documentclass[handout]{beamer}
\else
    \documentclass{beamer}
\fi

\usepackage{lmodern}
\usepackage{pgf, pgffor}
\usepackage{listings}
\usepackage{lstlinebgrd}

\lstset
{
    inputencoding=utf8,
    language=c++,
    basicstyle=\tiny\ttfamily,
    numberstyle=\tiny,
    numbers=left,
    stepnumber=1,
    numbersep=5pt,
    escapeinside={(*@}{@*)},
    showstringspaces=false,
    backgroundcolor=\color{white},
    frame=single,
    tabsize=4,
    morekeywords={decltype},
    literate={ö}{{\"o}}1
           {ä}{{\"a}}1
           {ü}{{\"u}}1
           {Ä}{{\"A}}1
           {Ö}{{\"O}}1
           {Ü}{{\"U}}1
           {ß}{{\ss}}1
           {~}{{\textasciitilde}}1
}

\lstloadlanguages{C++}

% Some Code copied from stackoverflow for highlighting

\makeatletter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \btIfInRange{number}{range list}{TRUE}{FALSE}
%
% Test in 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%
}

\newcommand<>{\btLstHL}[1]{%
  \only#2{\btIfInRange{\value{lstnumber}}{#1}{\color{blue!30}\def\lst@linebgrdcmd{\color@block}}{\def\lst@linebgrdcmd####1####2####3{}}}%
}%
\makeatother

\begin{document}

\begin{frame}[fragile]{ListingTest}
  \begin{lstlisting}[linebackgroundcolor={
      \btLstHL<1>{1-3}
      \btLstHL<2>{6,9}
      \btLstHL<3>{7}
      \btLstHL<4>{8}
    }]
        /**
         * Prints Hello World.
         **/
        #include <stdio.h>

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

相关内容