graphics

Porque é que os ficheiros .gif não são suportados

Esta é uma pergunta que me tenho vindo a fazer há algum tempo e não encontrei resposta.

Será devido a questões de licenciamento? Por causa do formato do ficheiro? Por alguma outra razão?

Apenas para provar o contrário: a incorporação direta de GIF é possível, reconhecidamente não em PDF, mas na saída SVG.

Nós apenas temos que adicionar uma regra graphicx que trata GIF (estático/animado) como outro formato de bitmap (além de PNG e JPEG) com um <img file base name>.xbb fornecido pelo usuário contendo as informações da caixa delimitadora:

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

Para uma imagem de 480px * 360px, o conteúdo do arquivo xbb

%%BoundingBox: 0 0 480 360

Para inserir dados GIF na saída SVG, o arquivo GIF deve ser codificado em base64. O pacote media4svg fornece um comando para isso que usamos para modificar o código do driver graphicx para bitmaps ( \Ginclude ).


(Requer o pacote media4svg , v0.9 2022-08-12.)

Digite example.tex listado abaixo com

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

or

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

or even

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

NB Firefox falha ao reproduzir GIF animado embutido em SVG que está embutido em uma página da web (como TeX.SX). Parece um bug. Em vez disso, use um navegador da Web baseado em Blink, como Chromium, Chrome, Opera ou Edge. Ou clique com o botão direito na imagem para abrir o SVG em uma guia do navegador própria.


Arquivo de entrada example.tex .

(Baixe o GIF em 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\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}



Há um artigo no TUGboat de 1996 (escrito por Keith Reckdahl) que inclui uma discussão sobre suporte a formatos de imagem. O artigo é do Volume 17 No. 1 e é chamado Using EPS Graphics in LATEX2ε Documents Part 1 . A discussão é centrada em dvips , mas um argumento semelhante pode ser feito para saída direta de pdf (veja o comentário de David sobre esta questão). Também a prática histórica de não implementar suporte direto em dvips pode ter influenciado as escolhas feitas para pdflatex e compiladores posteriores.

Citação (página 52-53):

10.3 Incluindo Arquivos Gráficos Não EPS

Embora seja fácil inserir gráficos EPS em documentos LATEX,não é tão simples inserir gráficos não-EPS (GIF,TIFF,JPEG,PICT,etc.).

[...]

10.3.1 Suporte direto para gráficos não EPS

É frequentemente solicitado que LATEX e dvips apoiem a inclusão directa de formatos gráficos não-EPS,tornando-a tão fácil como a inserção de ficheiros EPS.Embora isto fosse conveniente,existem infelizmente alguns problemas que complicam as coisas.

Por exemplo,a maioria dos formatos gráficos não-EPS utilizam ficheiros binários que não podem ser lidos pelo TEX,o que impede o LATEX de determinar o tamanho dos gráficos não-EPS.Além disso,o suporte de gráficos não-EPS exigiria também que os dvips incorporassem capacidades de conversão gráfica (GIF-para-PS,TIFF-para-PS,etc.).Isto não só exigiria muita programação,como também exigiria mais manutenção no futuro.

Em vez de incorporar directamente rotinas de conversão gráfica,o dvips fornece um mecanismo de chamada de programas externos de conversão.Este mecanismo pode ser acedido a partir de LATEX,utilizando [do]argumento de comando da \DeclareGraphicsRule.Isto tem a vantagem de ser mais flexível do que o apoio directo,e uma vez que mantém a conversão gráfica desacoplada da conversão DVI para PS,os utilizadores são livres de escolher o seu próprio programa de conversão gráfica.

Outra abordagem histórica interessante é descrita em um artigo de 1991 , onde fotos em formato GIF são convertidas em uma fonte (!) para inclusão direta em documentos LaTeX.