我想将 tex 文档生成的 pdf 文件中的某些页面包含到文档本身中。可以这样做吗?用例是,我想在 beamer 演示文稿结束时制作“演讲大纲”幻灯片,就像这个一样
最小非工作示例:
\documentclass{beamer}
\usepackage{graphicx}
\begin{document}
\begin{frame}
\begin{block}{Frame}
First frame
\end{block}
\end{frame}
\begin{frame}
\includegraphics[page=1, width=0.5\textwidth]{\jobname.pdf}
\end{frame}
\end{document}
我已经尝试过,pdfpages
但它们都因相同的错误而失败\includegraphics
graphicx
pdfTeX error: pdflatex (file XXX.pdf): xpdf: reading PDF image failed
如果包含的版本不是当前正在编译的版本,而是同一文件的先前编译的结果,那就没问题了。如果我重命名 pdf 文件,然后包含副本,它就可以正常工作(这就是我生成上图的方式);有一个解决方案可以简单地自动执行此操作。\write18
不过,我想避免为此而打开不受限制。
答案1
编译 .tex iput 文件时,通常生成的 .pdf 输出文件的名称与 .tex iput 文件的名称相同。
通常,在上一次 (La)TeX 运行期间生成的现有 .pdf 输出文件会在当前 (La)TeX 运行开始时被销毁。因此,在当前 (La)TeX 运行期间,它通常无法用于包含/导入页面。
这种破坏可以通过以下方式解决:
例如,您可以在开始编译之前编写一些 shell 脚本或批处理脚本来重命名相关的 .pdf 文件。
在许多 TeX 平台上,从命令行调用 (La)TeX 时也可以传递一些选项来更改/设置所有文件的名称,这些文件的名称是从 -primitive 的扩展派生/可派生的\jobname
。这也会影响 .pdf 输出文件的名称。
例如,在当前(2017 年 2 月 9 日)的 TeX 平台 MiKTeX 2.9 文档中你可以阅读:
Setting the Name of the Output File
You can change the name of all output files by using the option --job-name=name.
This switch actually sets the name of the TeX job and has an effect of the
output file names, because these names are derived from the job name.
Look at the following example:
C:\> latex -job-name=foo sample2e
This is TeX, Version 3.14159 (MiKTeX 2.2)
(D:\texmf\tex\latex\base\sample2e.tex
LaTeX2e <2001/06/01>
Babel <v3.7h> and hyphenation patterns for english, german, ngerman, loaded.
(D:\texmf\tex\latex\base\article.cls
Document Class: article 2001/04/21 v1.4e Standard LaTeX document class
(D:\texmf\tex\latex\base\size10.clo))
No file foo.aux.
(D:\texmf\tex\latex\base\omscmr.fd) [1] [2] [3] (foo.aux) )
Output written on foo.dvi (3 pages, 7256 bytes).
Transcript written on foo.log.
C:\>
Note the altered output file names: foo.aux, foo.dvi and foo.log.
为了制作演示文稿,您可以编写一个脚本,使用不同的作业名称从同一组 .tex 输入文件创建两个 .pdf 输出文件。
例如,在生成第一个 .pdf 输出文件的过程中,使用包含短语“草稿”的作业名称。
例如,在生成第二个 .pdf 输出文件的过程中,使用包含短语“final”的作业名称。
“草稿” .pdf 输出文件和“最终” .pdf 输出文件应该非常相似。
但:
当生成第一个 .pdf 文件(“草稿” .pdf 输出文件)时,您可以让 TeX 在您实际希望包含某些文档自身页面副本的位置插入一些虚拟页面。
在生成第二个 .pdf 文件(“最终” .pdf 输出文件)时,您可以应用图形/graphicx-package\includegraphics
或pdf页面-package\includepdf
位于您实际希望包含部分文档自身页面副本的地方,用于导入/包含“草稿” .pdf 输出文件中的页面。
这样,可以确保“草稿” .pdf 输出文件和“最终” .pdf 输出文件的分页和页码相同。
由于“草稿” .pdf 输出文件和“最终” .pdf 输出文件基于同一组 .tex 输入文件,因此您需要实现一种机制来查明当前生成的是“草稿” .pdf 输出文件还是“最终” .pdf 输出文件。
如果“草稿” .pdf 输出文件正在制作中,请让 TeX 插入一些虚拟页面。
如果“最终” .pdf 输出文件正在制作中,请让 TeX 从“草稿” .pdf 输出文件中导入页面。
这种机制可以基于内核宏\ifFileExists
,可用于检查“草稿” .pdf 输出文件是否已经存在,如果存在,则让 TeX 包含来自“草稿” .pdf 输出文件的页面,如果不存在,则让 TeX 包含/生成一些“虚拟页面”。
它还可以基于检查\jobname
-primitive 的扩展是否产生“草稿” .pdf 输出文件的名称或“最终” .pdf 输出文件的名称。
请注意,目前无论如何通过导入图形/graphicx-package\includegraphics
或通过pdf页面-package\includepdf
意味着原始页面中包含的超链接在复制的页面中被禁用。
还要注意,复制的页面实际上源自 (La)TeX 运行,其中 的扩展\jobname
不同。因此,要复制的页面不包含源自 -primitive 扩展的文本短语\jobname
可能是一个好主意。