使用Beamer与lstlisting包时引号引发编译失败的解决方法
解决Beamer中tcolorbox嵌套lstlisting时双引号导致的编译失败问题
问题分析
在Beamer幻灯片的tcolorbox环境内使用lstlisting插入包含双引号的R代码(如read.csv("c://path"))时,pdflatex编译会失败,移除双引号则可正常编译。这是因为嵌套环境下,双引号触发了LaTeX的特殊字符解析冲突,即便帧已添加[fragile]选项,仍无法完全规避该问题。
解决方案
推荐两种可靠的解决方式:
方案1:使用tcblisting环境
tcolorbox原生提供了tcblisting环境,是专门为代码展示设计的结合方案,能更好处理代码中的特殊字符,避免编译冲突。使用前需加载tcolorbox的listings库。
修改后的代码片段:
\begin{frame}[fragile] \frametitle{Title} \begin{itemize} \item Item 1 \end{itemize} \begin{tcblisting}{colback=red!5,colframe=red!75!black,title=Reading in a .csv File,listing only} read.csv("c://test") \end{tcblisting} \end{frame}
方案2:给tcolorbox添加fragile选项
若坚持使用tcolorbox嵌套lstlisting的方式,给tcolorbox添加fragile选项,确保环境内的特殊字符被正确解析:
修改后的代码片段:
\begin{frame}[fragile] \frametitle{Title} \begin{itemize} \item Item 1 \end{itemize} \begin{tcolorbox}[fragile,colback=red!5,colframe=red!75!black,title=Reading in a .csv File] \lstset{tabsize=2} \begin{lstlisting} read.csv("c://test") \end{lstlisting} \end{tcolorbox} \end{frame}
完整可编译代码示例(采用tcblisting方案)
\documentclass[]{beamer} \usepackage{colortbl} \usepackage{bm} \usepackage{color} \usepackage{amssymb,amsmath} \usepackage{mathtools} \usepackage{float} \usepackage{algorithm} \usepackage[noend]{algpseudocode} \usepackage{listings} \lstset{basicstyle=\ttfamily} \usepackage{tcolorbox} \tcbuselibrary{listings} % 加载tcolorbox的listings库以支持tcblisting \usepackage{graphicx} \usepackage{fancybox} \usepackage{hyperref} % R代码格式设置 \lstset{language=R, basicstyle=\small\ttfamily, stringstyle=\color{DarkGreen}, otherkeywords={0,1,2,3,4,5,6,7,8,9}, morekeywords={TRUE,FALSE}, deletekeywords={data,frame,length,as,character}, keywordstyle=\color{blue}, commentstyle=\color{DarkGreen}, xleftmargin=.0in, breaklines=true, xrightmargin=.25in } \newcommand{\qq}{\symbol{34}} %\documentclass[handout]{beamer} \mode<handout> { \usetheme{default} } \mode<presentation> { \usetheme{Madrid} %\usetheme{default} } \usepackage[english]{babel} \usepackage[latin1]{inputenc} %\usepackage{SweaveSlides} \usepackage{bm} \usepackage{graphicx} \usefonttheme[onlymath]{serif} %\logo{\includegraphics[width=3cm]{logo.jpeg}} \title{Title} \author {Name\\Place} \institute[Place]{ } \date[Test]{Test} \subject{OP} \AtBeginSubsection[]% { \begin{frame}<beamer> \frametitle{Outline} \tableofcontents[currentsection,currentsubsection] \end{frame} } \begin{document} \begin{frame} \titlepage \end{frame} \begin{frame}[fragile] \frametitle{Title} \begin{itemize} \item Item 1 \end{itemize} \begin{tcblisting}{colback=red!5,colframe=red!75!black,title=Reading in a .csv File,listing only} read.csv("c://test") \end{tcblisting} \end{frame} \end{document}
内容的提问来源于stack exchange,提问作者dhc
相关产品推荐
相关产品推荐

