这是我问自己一段时间但一直没有找到答案的问题。
是因为授权问题吗?是因为文件格式?还是其他原因?
答案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 文档中。