我正在尝试制作一个可以选择性编译为讲义的演示文稿。此演示文稿还包含突出显示的代码片段。为了突出显示,我使用来自的代码这个问题。(在我的实际演示中效果很好,但是在最小的示例中,产生的高光太靠右了。)
当我为讲义模式编译时,列表中的最后一行突出显示仍存在。因此,我正在寻找某种方法来有条件地禁用突出显示。
我目前拥有的:
条件:
\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
参数的可选编译。另一个问题是我必须在列表环境中转义命令。我尝试将if
s 放置在各种位置,例如:
\ifhandout
\begin{lstlisting}
(*@\else
\begin{lstlisting}[linebackgroundcolor={
\btLstHL<1>{1-3}
\btLstHL<2>{6,9}
}](*@\fi@*)
... code
\end{lstlisting}
但一切都没有按预期进行。(我甚至设法将它们放置在将列表中的所有代码折叠在一行中的方式。)
有人知道,当ist时,我怎样才能[]
从编译中排除参数?handout
true
这是完整的“最小”测试示例。提前谢谢您。
\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}