我有一本半尺寸的小册子letterpaper
:
\documentclass{book}
\usepackage[paperheight=8.5in,paperwidth=5.5in]{geometry}
\usepackage{mwe}
\begin{document}
\lipsum[1-13]
\end{document}
但是,当我运行pdfbook
生成的 PDF 时,无论原始页面大小如何,我得到的 PDF 总是 11.7 x 8.27 英寸。如何使用pdfbook
(或pdfjam
) 简单(且适当地)将这些页面合并在一起,而无需尝试更改纸张大小?
理想的
编译上述 MWE 后,我得到了一个大小恰好是信纸一半的 PDF。我想运行pdfbook
(或自定义调用pdfjam
),以便这些页面以正确的配置在长边上设置为两页,以将其装订成一本书。
$ pdfbook -p letter test.pdf out.pdf
----
pdfjam: This is pdfjam version 2.08.
pdfjam: Reading any site-wide or user-specific defaults...
(none found)
pdfjam ERROR: no PDF/JPG/PNG file found at -p
答案1
这里的基本问题是pdfjam
表现出非标准行为,并且记录得相当差。由于pdfbook
基本上是 的一个最小包装器pdfjam
,它继承了这些缺陷,同时进一步掩盖了问题的根源。
在这种情况下,您可以使用以下方法解决问题
pdfbook --paper letter --outfile out.pdf -- in.pdf
请注意,--
输入 pdf 之前的 是必需的。这对于 shell 脚本来说根本不是正常行为。pdfjam
解析选项非常奇怪。我不想说它很危险,但我不相信它不危险。但是,只要你不传递任何危险的东西,它应该(希望)是相当安全的。
弄清楚这一点需要一点侦查工作。和的手册页pdfbook
并没有提供太多信息。基本上,我首先阅读了显示如何调用的pdfjam
脚本。这相对简单。然后我直接切换到测试,试图缩小问题范围。pdfbook
pdfjam
pdfjam
pdfjam --help
是我发现的最有用的文档来源。其中包括以下内容:
Usage: pdfjam [OPTIONS] [--] [FILE1 [SEL1]] [FILE2 [SEL2]]...
和
--paper PAPERSPEC (or simply --PAPERSPEC)
Specify a LaTeX paper size, for example
'--paper a4paper' or simply '--a4paper' for ISO A4 paper.
If the LaTeX 'geometry' package is installed, a wider range
of paper sizes is available. For details see documentation
for LaTeX and/or the 'geometry' package.
[Default for you at this site: paper=a4paper]
--papersize '{WIDTH,HEIGHT}'
Specify a custom paper size, e.g.,
--papersize '{10in,18cm}'
(Note the braces, and the comma!)
If the 'geometry' package is not found, this has no effect.
和
* '--' can be used to signal that there are no more options to come.
这并没有告诉你,该脚本正在以非标准方式解析选项,并且- 是必不可少的如果传递了某些选项。通常,只有在--
传递给 shell 脚本的主要参数之一可能被误认为是选项(例如文件名以 开头-
)或者您希望防止误用(例如调用 shell 时)时才需要。但是,在 的情况下pdfjam
,如果您写
pdfjam --paper letter --outfile out.pdf in.pdf
您将收到错误。使用 进行调试表明,在调用 提供的 PDF 合并命令时,--no-try
脚本正在传递类似的东西作为可选参数。然后它尝试合并和。显然,这些都不起作用。paper letter--outfile
pdfpages
out.pdf
in.pdf
回顾pdfjam
其本身,你可以看到它是如何解析选项的:
for arg
do
case $arg in
--quiet | -q | --configpath)
verbose=false ;
;;
--version | -V)
echo "$version"
exit 0 ;
;;
--batch)
batch=true ;
;;
--help | -u | -h)
help=true ;
;;
--vanilla)
vanilla=true ;
;;
*)
;;
esac
done
然后,它会在文件后面单独解析任何剩余的选项。我不太清楚它为什么这样做,但结果是它基本上无法区分选项和参数。如果你没有明确告诉它选项已经完成,它就无法正确解析任何剩余的选项。这实际上非常糟糕,因为它让任意的东西被传递下去,pdfpages
即使它毫无意义。虽然我不知道这是否会被利用,但它是那种可以让脚本容易受到攻击的东西。
此外,包括
* '--' can be used to signal that there are no more options to come.
不构成此行为的正确文档,因为这是 shell 脚本的标准行为。不标准的是,这是必需的即使你的第一个参数有一个不奇怪的名字即,即使in.pdf
文件名不是以 开头-
。
在我看来,这是有缺陷的行为。 Shell 脚本不应该有这样的行为。此外,它用于/var/tmp
临时文件。这也是非标准且有问题的。它应该/tmp
这样使用,例如,在重新启动时删除它创建的临时文件。尽管这些文件只有在传递时才会保留--no-tidy
,但这种行为仍然是意料之外的,而且我认为对于这种类型的脚本来说,这是不可取的。
pdfjam
因此,在使用和包装器(例如)时,我会非常小心pdfbook
。例如,我会避免将其他进程的输出通过管道传输到,pdfjam
并且只手动调用脚本或其包装器。