我只是想知道是否可以在每个列表旁边有一个“复制到剪贴板按钮”,将 lstlistings 环境的逐字内容复制到剪贴板。
仅 acroread 解决方案就足以满足我的目的。
答案1
好的,这里有两种方法,它们都不完美,都不是 100% 满足要求。但也许我们可以一起优化它们 :-)
\documentclass{article}
\usepackage{listings}
\usepackage{attachfile}
\usepackage{accsupp}
\usepackage{verbatim}
\usepackage{color}
\usepackage[misc]{ifsym}
\definecolor{lstbgcolor}{rgb}{0.9,0.9,0.9}
\makeatletter
\lst@RequireAspects{writefile}
% Use \attachfile command to add listing content as paperclip.
\lstnewenvironment{attachedlisting}{%
\lst@BeginAlsoWriteFile{\jobname.lsttmp}%
}
{%
\lst@EndWriteFile
\marginpar{\attachfile[appearance=false,icon=Paperclip,mimetype=text/tex]{\jobname.lsttmp}}
}
% Use accsupp package to add listing content as copyable text.
\lstnewenvironment{copyablelisting}{%
\lst@BeginAlsoWriteFile{\jobname.lsttmp}%
}
{%
\lst@EndWriteFile
\let\verbatim@processline\add@lstline
\global\let\lstfile\empty
\verbatiminput{\jobname.lsttmp}%
\marginpar{(\BeginAccSupp{method=escape,ActualText={\lstfile}}\PaperPortrait\EndAccSupp{})}
}
\def\add@lstline
{\xdef\lstfile{\unexpanded\expandafter{\lstfile}\the\verbatim@line\string^^J}}
\makeatother
\begin{document}
\lstset{breakatwhitespace=true,breaklines=true,language=[LaTeX]TeX,basicstyle=\small\ttfamily,flexiblecolumns,backgroundcolor=\color{lstbgcolor}}
\begin{attachedlisting}
\documentclass{article}
\title{Cartesian closed categories and the price of eggs}
\author{Jane Doe}
\date{September 1994}
\begin{document}
\maketitle
Hello world!
\end{document}
\end{attachedlisting}
\begin{copyablelisting}
\documentclass{article}
\title{Cartesian closed categories and the price of eggs}
\author{Jane Doe}
\date{September 1994}
\begin{document}
\maketitle
Hello world!
\end{document}
\end{copyablelisting}
\end{document}
第一个环境,attachedlisting
显示一个回形针,允许在编辑器中打开列表内容(或保存到文件)。
第二种环境,copyablelisting
显示一个符号,当复制时,将粘贴到列表内容中。
开放式问题
- 符号的放置:由于在文件完全写入之前需要结束列表环境,因此“目标符号”的放置是一个问题。要将其放到顶部,可能需要运行两次。
- 复制符号:我无法制作一个可以粘贴到列表内容中的字符。如果“复制符号”两侧没有至少一个“正常”字符包围,这个技巧将不起作用这些也被复制了。因此,目前,您会在列表文本前后看到两个多余的字符。我也无法以某种方式使它们“不可见”。
这是我目前能做到的最好了。当然,我愿意听取建议。