xelatex 和 \DeclareGraphicsRule

xelatex 和 \DeclareGraphicsRule

在一个上一个问题,灵感来自于我使用nbconvert\includegraphics,我询问了当命令明确引用 svg 文件时是否包含 pdf 文件。现在nbconvert不再使用,pdflatex而是使用xelatex,这是相关的...

乌尔丽克·菲舍尔接受的答案对于上述问题,

...
\usepackage{etoolbox}
\makeatletter
\preto\Gin@extensions{svg,}
\DeclareGraphicsRule{.svg}{pdf}{.pdf}{\noexpand\[email protected]}
\makeatother
...

与 配合使用效果很好pdflatexlualatex但与 配合使用效果不佳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}

相关内容