我想将列表源作为附件添加到 PDF(由 创建pdflatex
)。\lstinputlisting
这很容易:
\RequirePackage{listings}
\RequirePackage{embedfile}
\let\lstinputlistingO=\lstinputlisting
\renewcommand{\lstinputlisting}[2][]{\embedfile{\detokenize{#2}}\lstinputlistingO[#1]{#2}}
但是我怎样才能做同样的事情\begin{listing} ... \end{listing}
?(引用的文件名应该是类似的listing 12
)
答案1
作为embedfile
只能嵌入外部文件,你必须先将环境内容写入文件。要做到这一点,listings
包,也就是\lst@BeginAlsoWriteFile
宏,可以使用:
\usepackage{listings}
\usepackage{embedfile}
\makeatletter
\lst@RequireAspects{writefile}
\lstnewenvironment{lstembedlisting}[2][]{%
\bgroup%
\lstset{#1}%
\lst@BeginAlsoWriteFile{#2}%
}
{%
\lst@EndWriteFile%
\embedfile{#2}%
\egroup%
}
\makeatother
此代码片段创建了一个名为 的新环境lstembedlisting
,该环境可以像普通的 一样使用lstlisting
,但它需要一个附加文件名作为强制参数。环境中的代码会同时排版并写入该文件。之后,\embedfile
调用 将其附加到 PDF。
完整 MWE:
\documentclass{article}
\usepackage{listings}
\usepackage{embedfile}
\makeatletter
\lst@RequireAspects{writefile}
\lstnewenvironment{lstembedlisting}[2][]{%
\bgroup%
\lstset{#1}%
\lst@BeginAlsoWriteFile{#2}%
}
{%
\lst@EndWriteFile%
\embedfile{#2}%
\egroup%
}
\makeatother
\begin{document}
\begin{lstembedlisting}[language=TeX]{listing_12.tex}
Hello world!
\bye
\end{lstembedlisting}
\end{document}
答案2
由于处理verbatim
内容很棘手,因此处理listings
在我看来,没有简单的单命令方法可以解决此问题。使用filecontents
包裹然而,这很容易。不过没有 diabonas 的答案那么清晰……
\documentclass{article}
\usepackage{listings}% http://ctan.org/pkg/listings
\usepackage{embedfile}% http://ctan.org/pkg/embedfile
\usepackage{filecontents}% http://ctan.org/pkg/filecontents
% Automatically embed listings file as attachment with \lstinputlisting
\let\lstinputlistingO=\lstinputlisting
\renewcommand{\lstinputlisting}[2][]{\embedfile{\detokenize{#2}}\lstinputlistingO[#1]{#2}}
\begin{document}
\lstinputlisting{A.tex} % Insert listing and embed in PDF
% Write listing to file
\begin{filecontents*}{B.tex}
Here is some more code
\end{filecontents*}
\lstinputlisting{B.tex} % Insert listing and embed in PDF
\end{document}
filecontents
允许在文档序言之外使用filecontents
(and filecontents*
) 环境。如果您不喜欢使用filecontents*
而更愿意使用诸如\begin{listing}
...之类的东西\end{listing}
,则可以将以下内容添加到文档序言中:
\expandafter\let\expandafter\listing\csname filecontents*\endcsname
\expandafter\let\expandafter\endlisting\csname endfilecontents*\endcsname
但是,filecontents
除了重写包之外(据我所知),一般来说适应接受可选参数(包括您的列表格式)是相当困难的。
此选项先保存文件,然后输入。相反的做法,即先设置,然后嵌入,会比较困难。