这是我发现的问题。我必须在 LaTeX 中包含一些 PDF 文件。LaTeX 代码是在运行时生成的,并且必须包含在给定目录中找到的任何 PDF 文件。这些文件可能具有大写的 .PDF 扩展名。我无法控制以防止这种情况发生,也无法重命名它们。我的引擎是 XeLaTeX。这一切都发生在装有 TeXLive 2013 的 FreeBSD 机器上。
在我的工作站上,如果我这样做,一切正常不是将文件的扩展名提供给 \includepdf 命令。它猜测它是 PDF,并且包含一切顺利。但是,如果我提供带有大写 .PDF 扩展名的完整文件名,我会得到一个空白页而不是包含,并且日志会抱怨找不到该文件。
这是一个最小的例子(带扩展):
\documentclass[11pt,a4paper]{article}
\usepackage{pdfpages}
\usepackage[margin=1.5cm,landscape,includehead,includefoot]{geometry}
\begin{document}
\nonstopmode
\includepdf[pages=-,pagecommand=\clearpage]{compta.PDF}
\end{document}
以下是日志摘录:
./Sans-titre.tex:6: Unable to load picture or PDF file 'compta.PDF'.
<to be read again>
}
l.6 ...pages=-,pagecommand=\clearpage]{compta.PDF}
The requested image couldn't be read because
the file was not found.
File: compta.PDF Graphic file (type QTm)
这已经够奇怪了,但好吧,我想,我还是保留扩展名吧。问题是,当在 FreeBSD 服务器上排版相同的 .tex 时,如果我保留扩展名,我会在日志中看到以下内容:
This is XeTeX, Version 3.1415926-2.5-0.9999.3 (TeX Live 2013)
restricted \write18 enabled.
entering extended mode
! Package pdfpages Error: Cannot find file `compta'.
See the pdfpages package documentation for explanation.
Type H <return> for immediate help.
...
l.6 ...pdf[pages=-,pagecommand=\clearpage]{compta}
! Undefined control sequence.
\AM@checklast ...pii \\ \@tempcntb =\AM@pagecount
\relax \ifAM@DVIoutput \if...
l.6 ...pdf[pages=-,pagecommand=\clearpage]{compta}
! Missing number, treated as zero.
<to be read again>
\relax
l.6 ...pdf[pages=-,pagecommand=\clearpage]{compta}
)
Runaway argument?
\expandafter \AM@setphantomdoc \AM@doclist ,\END \ifthenelse {\boolean \ETC.
! File ended while scanning use of \AM@gobble.
<inserted text>
\par
<*> TMP_test.tex
! Emergency stop.
<*> TMP_test.tex
No pages of output.
Transcript written on TMP_test.log.
如果我输入 .PDF 扩展名,我会得到以下结果:
This is XeTeX, Version 3.1415926-2.5-0.9999.3 (TeX Live 2013)
restricted \write18 enabled.
entering extended mode
! Unable to load picture or PDF file 'compta.PDF'.
<to be read again>
}
l.6 ...pages=-,pagecommand=\clearpage]{compta.PDF}
<use "compta.PDF" >
! Unable to load picture or PDF file 'compta.PDF'.
<to be read again>
\GXT@clipend
l.6 ...pages=-,pagecommand=\clearpage]{compta.PDF}
! Arithmetic overflow.
<recently read> \calc@Acount
l.6 ...pages=-,pagecommand=\clearpage]{compta.PDF}
! Arithmetic overflow.
<recently read> \calc@Acount
这让我很生气,尤其是当我看到如果完全相同的 PDF 文件具有小写扩展名,一切都会顺利进行时。我尝试将以下内容(一起和单独)添加到序言中:
\DeclareGraphicsExtensions{pdf,PDF,png,PNG,jpg,JPG,jpeg,JPEG,txt,TXT}
\DeclareGraphicsRule{.PDF}{pdf}{*}{}
但无济于事(事实上,我从 \DeclareGraphicsRule 获得的唯一结果是,我得到的不是包含的 PDF,而是 PDF 文件的路径的打印,位于页面中间。
我想要包含的 pdf 文件位于https://dl.dropboxusercontent.com/u/10487109/compta.PDF(不过,正如我所说,小写扩展名也可以正常工作,因此我认为文件本身没有问题)
有人能帮我吗?提前谢谢。谢谢
答案1
一些图形驱动程序支持大写扩展名(pdftex.def
),其他的则不支持。2014
xetex.def
/04/07 v0.99 版本则不支持。
简单的形式是手动添加对每个扩展的支持,例如:
\DeclareGraphicsRule{.PNG}{QTm}{QTm}{#1}
\DeclareGraphicsRule{.JPG}{QTm}{QTm}{#1}
\usepackage{grfext}
\AppendGraphicsExtensions*{.PNG,.JPG}
.PDF
然而,由于存在错误,这种方法无法奏效。
下面的示例添加了 的支持扩展及其xetex.def
大写变体,并修补了 的命令以xetex.def
修复错误。
\documentclass{article}
\usepackage{graphicx}
\usepackage{grfext}
% bug in xetex.def
\usepackage{etoolbox}
\makeatletter
\patchcmd\XeTeX@include@QTm{%
\lowercase{\edef\type@ext{\Gin@ext}}%
}{%
\edef\type@ext{%
\noexpand\lowercase{%
\noexpand\def\noexpand\type@ext{\Gin@ext}%
}%
}%
\type@ext
}{}{}
\let\Ginclude@QTm\XeTeX@include@QTm
\patchcmd\G@measure@QTm{%
\lowercase{\edef\type@ext{#2}}%
}{%
\edef\type@ext{%
\noexpand\lowercase{%
\noexpand\def\noexpand\type@ext{#2}%
}%
}%
\type@ext
}{}{}
\@for\@ext:=\Gin@extensions\do{%
\uppercase\expandafter{%
\expandafter\def\expandafter\@EXT\expandafter{\@ext}%
}%
\@ifundefined{Gin@rule@\@EXT}{%
\expandafter
\let\csname Gin@rule@\@EXT\expandafter\endcsname
\csname Gin@rule@\@ext\endcsname
% Patch rule to exchange lowercase extension with uppercase
% (needed for ".PS" and ".EPS"
\edef\@tempa{%
\noexpand\patchcmd
\expandafter\noexpand\csname Gin@rule@\@EXT\endcsname
{{\@ext}}{{\@EXT}}{}{}%
}\@tempa
}{}%
\expandafter
\AppendGraphicsExtensions\expandafter*\expandafter{\@EXT}%
}
\makeatother
\begin{document}
\includegraphics{TIGER}
\end{document}