确保逐字代码块可复制/粘贴

确保逐字代码块可复制/粘贴

渲染包含此代码块的文档之后

\begin{verbatim}
if [ ! -d .git ]; then git init; fi         # Initialises a new Git repository, if doesn't already exist.
if [ ! -f README.md ]; touch README.md; fi  # Creates an empty README.md file,  if doesn't already exist.
git add -A                                  # Stages any files/directories present, in preparation to commit them to local Git repo.
git commit -m 'first commit'                # Commits the staged files/dirs to the local Git repo.
git remote add origin GIT_REMOTE_URL        # Adds the GitHub repo created above as a "Git remote" with the alias "origin".
\end{verbatim}

使用 转换为 PDF pdflatex,并在 Apple 的预览应用程序中,渲染的代码块看起来与预期完全一致:

if [ ! -d .git ]; then git init; fi         # Initialises a new Git repository, if doesn't already exist.
if [ ! -f README.md ]; touch README.md; fi  # Creates an empty README.md file,  if doesn't already exist.
git add -A                                  # Stages any files/directories present, in preparation to commit them to local Git repo.
git commit -m 'first commit'                # Commits the staged files/dirs to the local Git repo.
git remote add origin GIT_REMOTE_URL        # Adds the GitHub repo created above as a "Git remote" with the alias "origin".

但是,我随后尝试将渲染的代码块从 PDF 复制并粘贴到文本文件中。我原本以为结果与原始结果完全一样,但结果却如下:

if[!-d.git];thengitinit;fi if [ ! -f README.md ]; touch README.md; fi git add -A git commit -m 'first commit' git remote add origin GIT_REMOTE_URL
# Initialises a # Creates an em # Stages any fi # Commits the s # Adds the GitH

显然,这与原文有很大不同!

使用 Acrobat Professional 8,结果也是错误的,但是方式不同:

if [ ! -d .git ]; then git init; fi # Initialises a if [ ! -f README.md ]; touch README.md; fi # Creates an emgit add -A # Stages any figit commit -m 'first commit' # Commits the sgit remote add origin GIT_REMOTE_URL # Adds the GitHEN

我的问题是:有没有办法确保每一个 \begin{verbatim}...\end{verbatim}环境是否保存在 PDF 输出中,不仅如眼睛所见,而且如 PDF 查看软件中的文本选择工具所“看到”的那样?

答案1

既然你提到关于使用listings带有 PDF 标记的软件包的页面我想说的是,我比较幸运,能够让间隔发挥作用——查看我的 PDF。正如其他人指出的那样,您仍然需要确保它不会破坏水平框(行长)。在这种情况下,我拆分了注释并使页面横向显示。下面的方法也适用于文件包含,方法是使用\lstinputlisting{script.txt}而不是\begin{lstlisting}

由于我对这种 LaTeX 技巧还只是个业余爱好者,所以可能有人可以做出更多改进,但我已确保此方法适用于所有可打印的 ASCII 字符。有几件事并不完美,但它们可能不是什么大问题,或者它们可能不是特别难以修复(由更有经验的人来修复):

  • 我没有用大量可能的listings选项来测试它,所以我不知道它是否运行良好。
  • 我付出了相当大的努力来确保所有特殊的可打印 ASCII 字符都得到正确处理,但我不能做出任何保证。
  • 处理间距真的很痛苦,最后我所能做的就是用textcompPDF 中显示的一个小点替换每两个空格(但它仍然被复制为空格!)并希望它不会太分散注意力。也许可以添加一些颜色格式来让它消失;我真的不知道。问题是,你很可能只会在缩进的代码中看到这种情况;普通文本往往不会有两个连续的空格。
  • 我听到你问:既然它只替换一行中的两个空格,那么其他空格会怎样?好吧,因为它一次替换两个空格,所以偶数个空格没有问题。但是单个空格怎么办?大多数单个空格不会被替换,但会在输出中保留。它们不被保留的两种情况是在行的末尾或开头。也就是说,以奇数个空格结尾的行将在末尾丢失一个空格,而以单个空格开头的行(后面紧跟着一个可打印字符)将在开头丢失一个空格。
  • 编辑:哦,我忘了说了;我还没想出办法让它复制空白行。不过这比不复制粘贴还是好多了。

\documentclass{article}
\usepackage[landscape]{geometry}
\usepackage{listings}
\usepackage{textcomp}
\usepackage[space=true]{accsupp}

\newcommand{\pdfactualhex}[3]{\newcommand{#1}{%
\BeginAccSupp{method=hex,ActualText=#2}#3\EndAccSupp{}}}

\pdfactualhex{\pdfactualdspace}{2020}{\textperiodcentered\textperiodcentered}
\pdfactualhex{\pdfactualsquote}{27}{'}
\pdfactualhex{\pdfactualbtick}{60}{`}

\lstset{tabsize=4,basicstyle=\ttfamily,columns=flexible,emptylines=10000}
\lstset{literate={'}{\pdfactualsquote}1
                 {`}{\pdfactualbtick}1
                 {\ \ }{\pdfactualdspace}2
}

\begin{document}
\begin{lstlisting}
if [ ! -d .git ]; then git init; fi         # Initialises a new Git repository,
                                            # if doesn't already exist.

if [ ! -f README.md ]; touch README.md; fi  # Creates an empty README.md file,
                                            # if doesn't already exist.

git add -A                                  # Stages any files/directories
                                            # present, in preparation to commit
                                            # them to local Git repo.

git commit -m 'first commit'                # Commits the staged files/dirs
                                            # to the local Git repo.

git remote add origin GIT_REMOTE_URL        # Adds the GitHub repo created
                                            # above as a "Git remote" with the
                                            # alias "origin".
\end{lstlisting}
\end{document}

这是我的 PDF 输出的链接:http://goo.gl/9Ds75

答案2

verbatim 环境的内容对于页面来说太宽,并且在 cr/lf 之前行被截断。在 pdf 文件中,它最终成为一个段落。尝试使用较短的行执行以下操作,您会发现它很好

\documentclass{article}
\usepackage{verbatim}
\begin{document}
\begin{verbatim}
if [ ! -d .git ]; then git init; fi         #
if [ ! -f README.md ]; touch README.md; fi  #
git add -A                                  #
git commit -m 'first commit'                #
git remote add origin GIT_REMOTE_URL        #
\end{verbatim}
\end{document}

复制和粘贴逐字代码时经常被忽视的另一个问题是减号“-”有时不是一个字符而是一个规则(取决于字体)。为了确保它是正确的字符,请使用包的定义verbatim来定义自己verbfontlistings

\makeatletter
\newcommand*\verbfont{\normalfont\ttfamily
    \hyphenchar\font\m@ne
    \@noligs}
\makeatother

\usepackage{listings}
\lstset{basicstyle  = \verbfont}

相关内容