You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LaTeX listings宏包生成PDF时Python代码缩进复制丢失问题求解

问题根源

listings宏包默认排版逻辑中,为实现列对齐效果,缩进位置的视觉空白多通过PDF坐标偏移实现,并未写入实际空格字符,因此复制文本时阅读器无法识别这类空白,最终出现缩进丢失。现有配置中使用的columns=fullflexible参数会放大该问题,该参数会使用弹性字距调整替代固定宽度的空格输出。

修复方案

方案1:调整listings现有配置(无需更换宏包)

在原有\lstset配置中修改/新增以下参数即可:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\begin{document}

\lstset{
    language=Python,
    frame=lines,
    caption={Insert code directly in your document},
    label={lst:code_direct},
    basicstyle=\footnotesize\ttfamily, % 基础样式必须指定等宽字体\ttfamily
    keepspaces=true,
    columns=fixed, % 替换原有的fullflexible,使用固定列宽
    literate={\ }{{\ }}1, % 强制将空格渲染为可复制的实际字符
    tabsize=4, % 若代码用Tab缩进,指定Tab对应空格数
    showspaces=false,
    showtabs=false
}

\begin{lstlisting}
for j in range(5):
    print(j)
\end{lstlisting}

\end{document}

配置生效后,PDF中代码的视觉效果不变,复制时缩进空格会被完整保留。

方案2:替换为minted宏包(更稳定的代码排版方案)

如果调整listings参数后仍有复制异常,可以换用minted宏包实现代码排版,该宏包基于Pygments做语法高亮,输出的所有代码字符(包括缩进空格)都是实际嵌入PDF的文本,天生不存在复制丢缩进的问题。注意使用该宏包时编译需要加-shell-escape参数。
最小示例代码如下:

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{minted}
\begin{document}

\begin{minted}[
    frame=lines,
    fontsize=\footnotesize,
    tabsize=4
]{python}
for j in range(5):
    print(j)
\end{minted}

\end{document}
注意事项
  • 不要使用columns=flexible或者columns=fullflexible参数,这两个参数的弹性字距机制会破坏可复制空格的输出
  • 代码样式必须指定等宽字体(\ttfamily),非等宽字体下固定列宽的排版效果会错乱,也容易出现复制异常
  • 测试复制效果时建议用纯文本编辑器(比如记事本、VS Code)粘贴验证,不要粘贴到Word这类会自动调整格式的软件中测试

内容的提问来源于stack exchange,提问作者Stefano Fedele

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 08:30:47