本文已加入专栏文章目录,归入「进阶使用」文章系列。
插入 PDF 的两种效果
用 latex 生成 pdf 时,插图功能(通常通过 graphicx
宏包的 includegraphics
命令)除了支持 eps、jpg 等常见图片格式,还支持 pdf 格式。
插入 pdf 图片,有两种效果
- 像插图那样,一页 pdf 就像是一个 eps 或 jpg 图片,插一张图就像是输入了一个大号的字符。这是
includegraphics
提供的功能。 - 像合并 pdf 文件那样,相当于先用 latex 生成 main.pdf,然后把另一个 pdf 文件(的一部分)和 main.pdf 合并。这是
pdfpages
宏包提供的功能。
两者的差异是,在最终输出的 pdf 里,
graphicx
插入的 pdf 页面,角色是某页里的一个大一点的符号,这一页里还能包含其他内容;pdfpages
插入的 pdf 页面,角色是一个整页。
本文提供一种尝试,使得在用第一种效果插入 pdf 时,能一次插入所有页面。
指定页面的选项
pdfpages
提供的 pages
选项, 允许用户指定要插入
- 哪一页
pages=2
、 - 哪几页
pages=1,3,5
、 - 哪个页面范围
pages=1-3,4-
includegraphics[<options>]{<image file>}
也有 page
选项,从选项命名上可以看出,它只接受一个数字,即每次只插入一页。
获取 PDF 文件的总页码
插图终究需要引擎的底层支持,而 xetex 和 pdftex 引擎,
- 都只支持一次插入一页 pdf,这意味着需要在 latex 层面做「输入所有页面」的循环
- 也都提供了获取 pdf 文件总页数的 primitive
TeX-SX 上的问答 Get number of pages of external PDF 提供了在 pdftex、xetex 和 luatex 三种引擎下的页码获取方法。我们参考它,做一个只支持 pdftex 和 xetex 的
usepackage{
iftex}
% Store number of pages of pdf file #2 in command #1.
% Usage: @getPageNumOfPdf{@pagecount}{image.pdf}
% Ref: https://tex.stackexchange.com/q/198091
def@getPageNumOfPdf#1#2{
%
ifPDFTeX
pdfximage{
#2}%
xdef#1{
thepdflastximagepages}%
elseifXeTeX
% trailing space in `"#2" ` is necessary
xdef#1{
theXeTeXpdfpagecount"#2" }%
else
PackageError{
TEST}{
Support en