graphics

为什么不支持.gif文件

这是一个我自己问了很久的问题,我没有找到答案。

是因为许可问题吗?因为文件格式的问题?其他一些原因?

正好相反:直接嵌入 GIF可能的,诚然不是在 PDF 中,而是在 SVG 输出中。

我们只需要添加一个 graphicx 规则,它将 GIF(静态/动画)视为另一种位图格式(除了 PNG 和 JPEG),其中包含用户提供的 <img file base name>.xbb 文件,其中包含边界框信息:

\DeclareGraphicsRule{.gif}{bitmap}{.xbb}{}

对于 480px * 360px 的图像, xbb 文件的内容为

%%BoundingBox: 0 0 480 360

要将 GIF 数据内嵌到 SVG 输出中,必须对 GIF 文件进行 base64 编码。包 media4svg 为此提供了一个命令,我们用它来修改位图的图形驱动程序代码( \Ginclude graphicx


(需要 pkg media4svg ,v0.9 2022-08-12。)

排版 example.tex 下面列出

dvilualatex example
dvisvgm --zoom=-1 --bbox=papersize --font-format=woff2 例子

or

latex --shell-escape example
dvisvgm --zoom=-1 --bbox=papersize --font-format=woff2 例子

or even

xelatex --shell-escape --no-pdf 示例
dvisvgm --zoom=-1 --bbox=papersize --font-format=woff2 example.xdv

NB Firefox 无法播放嵌入在 SVG 中的动画 GIF,而 SVG 本身嵌入在网页中(如 TeX.SX)。它看起来像一个错误。请改用基于 Blink 的网络浏览器,例如 Chromium、Chrome、Opera 或 Edge。或者(右键)单击图像以在其自己的浏览器选项卡中打开 SVG。


输入文件 example.tex

(从https://upload.wikimedia.org/wikipedia/commons/d/d3/Newtons_cradle_animation_book_2.gif下载 GIF )

\documentclass[dvisvgm]{article}

% download `Newtons_cradle_animation_book_2.gif' before typesetting:
%
% https://upload.wikimedia.org/wikipedia/commons/d/d3/Newtons_cradle_animation_book_2.gif

\usepackage[a6paper]{geometry}
\usepackage{graphicx}
\DeclareGraphicsRule{.gif}{bitmap}{.xbb}{}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% provide BoundingBox information in a separate .xbb file
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{filecontents}[overwrite,noheader]{Newtons_cradle_animation_book_2.xbb}
%%BoundingBox: 0 0 480 360
\end{filecontents}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% patch graphics backend driver `dvisvgm.def' to physically embed
% bitmaps into DVI
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\makeatletter
\let\Ginclude\Ginclude
\def\Ginclude#1{%
  \baseSixtyFour{#1}{72}{{?nl}}\bitmap%
  \Ginclude{%
    data:image/\expandafter\remove\Gin;;base64,{?nl}%
    \bitmap}%
}
\def\remove.#1;{#1}
\makeatother

\RequirePackage{media4svg} % provides base64-encode utility
\ExplSyntaxOn
\cs_new:Npn\baseSixtyFour#1#2#3#4{
  \sys_if_engine_luatex:TF{
    \xdef#4{\directlua{media4svg.base64("#1",#2,"#3")}}
  }{
    \msvg_convert_file_to_blob:nnnN{#1}{#2}{#3}#4
  }
}
\ExplSyntaxOff
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}

\section{Animated GIF}
\noindent\includegraphics[width=\linewidth]{Newtons_cradle_animation_book_2.gif}

\end{document}



1996 年的TUGboat中有一篇文章(由 Keith Reckdahl 撰写),其中讨论了支持的图像格式。这篇文章来自第 17 卷第 1 期,名为Using EPS Graphics in LATEX2ε Documents Part 1。讨论以 dvips 为中心,但可以为直接 pdf 输出提出类似的论点(请参阅David 对此问题的评论)。 dvips 中不实现直接支持的历史做法可能影响了对 pdflatex 和后来的编译器的选择。

引用(第52-53页)。

10.3 包括非 EPS 图形文件

虽然在LATEX文档中插入EPS图形很容易,但插入非EPS图形(GIF、TIFF、JPEG、PICT等)就不那么简单了。

[...]

10.3.1 直接支持非 EPS 图形

人们经常要求LATEX和dvips支持直接包含非EPS图形格式,使之像插入EPS文件一样简单。虽然这很方便,但不幸的是,有一些问题使事情变得复杂。

例如,大多数非EPS图形格式使用二进制文件,TEX无法读取,这使得LATEX无法确定非EPS图形的大小。此外,支持非EPS图形还需要dvips加入图形转换功能(GIF到PS,TIFF到PS,等等)。这不仅需要大量的编程,而且还需要在将来进行更多的维护。

dvips没有直接加入图形转换程序,而是提供了一个调用外部转换程序的机制。这个机制可以通过使用\DeclareGraphicsRule的命令参数从LATEX访问。这样做的好处是比直接支持更灵活,而且由于它使图形转换与DVI到PS的转换脱钩,用户可以自由选择自己的图形转换程序。

另一种有趣的历史方法在1991 年的一篇文章中进行了描述,其中 GIF 格式的照片被转换为字体 (!) 以直接包含到 LaTeX 文档中。