![xelatex 和 \DeclareGraphicsRule](https://linux22.com/image/354502/xelatex%20%E5%92%8C%20%5CDeclareGraphicsRule.png)
在一个上一个问题,灵感来自于我使用nbconvert
\includegraphics
,我询问了当命令明确引用 svg 文件时是否包含 pdf 文件。现在nbconvert
不再使用,pdflatex
而是使用xelatex
,这是相关的...
...
\usepackage{etoolbox}
\makeatletter
\preto\Gin@extensions{svg,}
\DeclareGraphicsRule{.svg}{pdf}{.pdf}{\noexpand\[email protected]}
\makeatother
...
与 配合使用效果很好pdflatex
,lualatex
但与 配合使用效果不佳xelatex
,例如
$ cat text1.tex
\documentclass{standalone}
\usepackage{graphicx,etoolbox}
\makeatletter
\preto\Gin@extensions{svg,}
\DeclareGraphicsRule{.svg}{pdf}{.pdf}{\noexpand\[email protected]}
\makeatother
\begin{document} \includegraphics{trab1_conv.svg} \end{document}
$ xelatex text1
...
! LaTeX Error: Cannot determine size of graphic in trab1_conv.pdf (no BoundingBox).
...
No pages of output.
Transcript written on text1.log.
$
让我更困惑的是,trab1_conv.pdf
这是一个完全合理的 pdf,
$ perl -pi.bak -e s/conv.svg/conv.pdf/ text1.tex
$ xelatex text1
...
<use "trab1_conv.pdf" > [1] (./text1.aux) )
Output written on text1.pdf (1 page).
Transcript written on text1.log.
$
解决这个问题很容易(只需生成文件.tex
并运行pdflatex
它),但我想了解 XeLaTeX 和 之间发生了什么\declareGraphicsRule
。
Tia — g
附言:生成外部文件的方法是
latex trab1_conv.tex ; pdf2svg trab1_conv.pdf trab1_conv.svg
生成trab1_conv.tex
您喜欢的独立图像。
答案1
XeTeX 将 pdf(或 png)等图形类型传递给 QuickTime 库以获取其边界框。问题是它非常固执地坚持传递原始文件,并且似乎不包含代码来声明别名扩展名以代替获取文件大小。您可以尝试以下操作。我没有对其进行广泛测试,但我认为它不会干扰其他图形格式:
\documentclass[a4paper,12pt]{book}
\usepackage{graphicx}
\usepackage{etoolbox}
\usepackage{ifxetex}
\makeatletter
\preto\Gin@extensions{svg,}
\ifxetex
\DeclareGraphicsRule{.svg}{QTm}{QTm}{\noexpand\[email protected]}
\pretocmd\Gread@QTm{\ifdefstring\Gin@ext{.svg}{\def\Gin@ext{.pdf}}{}}{}{\fail}
\else
\DeclareGraphicsRule{.svg}{pdf}{.pdf}{\noexpand\[email protected]}
\fi
\makeatother
\begin{document}
\includegraphics{example-image-A.svg}
\end{document}