从 pdf 复制后,固定宽度列表列,无额外空格

从 pdf 复制后,固定宽度列表列,无额外空格

我希望 Beamer 幻灯片中的代码列表在从 pdf 复制并粘贴到文本编辑器后具有相同的间距。我一直在使用包中的宏columns选项。lstsetlistings

如果我使用columns=fixed,pdf 中的代码列表将具有我想要的对齐方式,就像它们在 latex 中显示的那样。唉,当复制代码列表的文本(例如从 Evince 或 Acrobat Reader)并粘贴到文本编辑器中时,结果格式不正确,或者会插入额外的空格;通常在标点符号周围。

如果我使用columns=flexiblecolumns=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 复制后出现多余的空格/畸形?

相关内容