我希望 Beamer 幻灯片中的代码列表在从 pdf 复制并粘贴到文本编辑器后具有相同的间距。我一直在使用包中的宏columns
选项。lstset
listings
如果我使用columns=fixed
,pdf 中的代码列表将具有我想要的对齐方式,就像它们在 latex 中显示的那样。唉,当复制代码列表的文本(例如从 Evince 或 Acrobat Reader)并粘贴到文本编辑器中时,结果格式不正确,或者会插入额外的空格;通常在标点符号周围。
如果我使用columns=flexible
或columns=fullflexible
,文本在文本编辑器中会显示得更好(除了行首没有空格缩进),但现在 pdf 中的代码列表没有我在 latex 文件中准备的对齐方式。
例如:
\documentclass{beamer}
\usepackage{listings}
\lstset{
language=C++,
basicstyle=\footnotesize\ttfamily,
upquote=true,
columns=fixed,
% columns=flexible,
% columns=fullflexible,
frame=single,
}
\begin{document}
\begin{frame}[fragile]{C++ Example}
\begin{lstlisting}
void oload(int i) { std::cout << i << std::endl; }
void oload(float f) { std::cout << f << std::endl; }
void oload(double d) { std::cout << d << std::endl; }
int main(int argc, char *argv[])
{
int i = 9;
float f = 3.14f;
double d = 3.14;
oload(i);
oload(f);
oload(d);
return 0;
}
\end{lstlisting}
\end{frame}
\end{document}
从columns=fixed
上面通过 latex 生成的 pdf 中复制出来的文本是乱码,无法编译:
void oload ( int i )
{ std :: cout << i << std :: endl ; }
void oload ( float f ) { std :: cout << f << std :: endl ; }
void oload ( double d ) { std :: cout << d << std :: endl ; }
int main ( int
{
int
i =
float f =
double d =
oload ( i );
oload ( f );
oload ( d );
return 0;
}
argc , char * argv [])
9;
3.14 f ;
3.14;
同时,使用 时columns=fullflexible
,pdf 中的文本是可以通过的,也可以编译,但 pdf 中的代码列表不会保留原始的多个空格的使用;例如,原始 3 个函数定义中的括号和语句oload
不对齐:
void oload(int i) { std::cout << i << std::endl; }
void oload(float f) { std::cout << f << std::endl; }
void oload(double d) { std::cout << d << std::endl; }
int main(int argc, char *argv[])
{
int i = 9;
float f = 3.14f;
double d = 3.14;
oload(i);
oload(f);
oload(d);
return 0;
}
有没有办法让列的列表宽度固定,而不会在从 pdf 复制后出现多余的空格/畸形?