为什么不支持 .gif 文件?

为什么不支持 .gif 文件?

这是我问自己一段时间但一直没有找到答案的问题。

是因为授权问题吗?是因为文件格式?还是其他原因?

答案1

只是为了证明相反的观点:直接嵌入 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提供了一个命令,我们利用该命令来修改graphicx位图的驱动程序代码 ( \Ginclude@bitmap)。


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

排版example.tex如下

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

或者

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

甚至

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

注意:Firefox 无法播放嵌入在网页中的 SVG 中的动画 GIF(如 TeX.SX)。这似乎是一个错误。请改用基于 Blink 的 Web 浏览器,例如 Chromium、Chrome、Opera 或 Edge。或者(右键单击)图像以在其自己的浏览器选项卡中打开 SVG。


输入文件example.tex

(下载 GIF 来自https://upload.wikimedia.org/wikipedia/commons/d/d3/Newtons_cradle_animation_book_2.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@bitmapOrig\Ginclude@bitmap
\def\Ginclude@bitmap#1{%
  \baseSixtyFour{#1}{72}{{?nl}}\bitmap@stream%
  \Ginclude@bitmapOrig{%
    data:image/\expandafter\remove@dot\Gin@ext;;base64,{?nl}%
    \bitmap@stream}%
}
\def\remove@dot.#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}

答案2

有一篇文章拖船1996 年的一篇文章(由 Keith Reckdahl 撰写),其中讨论了支持图像格式。该文章来自第 17 卷第 1 期,名为在 LATEX2ε 文档中使用 EPS 图形第 1 部分。讨论主要围绕dvips,但对于直接 pdf 输出也可以提出类似的论点(见David 的评论关于这个问题)。此外,不实现直接支持的历史实践dvips可能影响了pdflatex后来的编译器的选择。

引述(第 52-53 页):

10.3 包含非 EPS 图形文件

虽然将 EPS 图形插入 LATEX 文档很容易,但插入非 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 文档中。

相关内容