将列表附加到 PDF

将列表附加到 PDF

我想将列表源作为附件添加到 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除了重写包之外(据我所知),一般来说适应接受可选参数(包括您的列表格式)是相当困难的。

此选项先保存文件,然后输入。相反的做法,即先设置,然后嵌入,会比较困难。

相关内容