跑过乳胶在 LaTeX 文件(没有任何配置文件)上,我在 html 输出中得到了大量对不存在的图形文件的引用。通常这些不存在的图形文件成对出现,例如
< img src="sample23x.png" alt="PICT" >
< img src="sample28x.png" alt="PICT" >
是什么原因造成这种情况的?又如何避免?
一个例子 (AMS-LaTeX
):
\documentclass[12pt,reqno]{amsart}
\usepackage{pdfpages}
\begin{document}
$$
\begin{pmatrix} x \\ y \\ u(x,y) \end{pmatrix} \in \Lambda \subseteq
\mathrm{dom}(a) \cap \mathrm{dom}(b) \cap \mathrm{dom}(c)
$$
\end{document}
生成了此公式的图形文件,但 html 文件包含另外两个不存在的引用。一旦pdfpages
删除,一切似乎都正常。
答案1
空白图像是由pdfpages
包分别引起的eso-pic
,该包由 调用pdfpages
。eso-pic
用于将对象放置在页面上的任意位置,它使用picture
模式执行此任务。 不幸的是,即使它是空的, 也会picture
被 转换为图像。tex4ht
还有另一个问题:\includepdf
命令不起作用。所以我们有两个问题需要解决。第一个可以通过阻止包eso-pic
加载来解决,第二个可以通过一些补丁来解决pdfpages
。
这是您的 TeX 文件的修改版本:
\documentclass[12pt,reqno]{amsart}
\makeatletter
\ifdefined\HCode
\@nameuse{:dontusepackage}{eso-pic}
\newif\ifESO@texcoord
\newcommand\AddToShipoutPicture{\@ifstar{}{}}
\let\AddToShipoutPictureBG\AddToShipoutPicture
\let\AddToShipoutPictureFG\AddToShipoutPicture
\fi
\usepackage{pdfpages}
\makeatother
\begin{document}
$$
\begin{pmatrix} x \\ y \\ u(x,y) \end{pmatrix} \in \Lambda \subseteq
\mathrm{dom}(a) \cap \mathrm{dom}(b) \cap \mathrm{dom}(c)
$$
\includepdf[pages={1,2,3}]{pdfsample.pdf}
\includegraphics[page=1]{pdfsample.pdf}
\end{document}
重要的代码是:
\ifdefined\HCode
\@nameuse{:dontusepackage}{eso-pic}
\newif\ifESO@texcoord
\newcommand\AddToShipoutPicture{\@ifstar{}{}}
\let\AddToShipoutPictureBG\AddToShipoutPicture
\let\AddToShipoutPictureFG\AddToShipoutPicture
\fi
它阻止加载,并定义了eso-pic
一些使用的基本宏。对于配置,我们可以创建配置文件:pdfpages
pdfpages
pdfpages.4ht
\let\pdf@page\relax
\define@key{Gin}{page}[]{\edef\pdf@page{\the\numexpr #1-1\relax}}
\def\AM@findfile#1{%
\AM@findfile@i{#1}{pdf}%
\AM@findfile@ii{#1}%
}
\catcode`\:=12
\renewcommand\AM@output[1]{%
\@for\@pages:=\AM@pagestemp\do{\includegraphics[page=\@pages]{\AM@currentdocname}}
}
\catcode`\:=11
\AtBeginDocument{
\Configure{graphics*}
{pdf}
{
\ifx\pdf@page\relax\def\pdf@page{0}\fi
\def\current@pdf@file{\[email protected][\pdf@page]}
\def\current@png@file{\Gin@base-\[email protected]}%
\expandafter\Needs\expandafter{"convert \current@pdf@file\space %\csname Gin@base\endcsname.pdf
\current@png@file"}%
\Picture[pict]{\current@png@file}%
\special{t4ht+@File: \csname current@png@file\endcsname}
\let\pdf@page\relax
}
}
\Hinput{pdfpages}
\endinput
在这个文件中,首先我们声明命令page
的选项\includegraphics
,因为它没有在DVI
模式中定义:
\let\pdf@page\relax
\define@key{Gin}{page}[]{\edef\pdf@page{\the\numexpr #1-1\relax}}
然后我们可以请求包含特定的页面:
\renewcommand\AM@output[1]{%
\@for\@pages:=\AM@pagestemp\do{\includegraphics[page=\@pages]{\AM@currentdocname}}
}
\@for
是内部 LaTeX 命令,可用于循环遍历逗号分隔的列表。在本例中\AM@pagestemp
,我们循环遍历存储所请求页面的 。
最后,我们需要添加对 PDF 图像的支持tex4ht
:
\AtBeginDocument{
\Configure{graphics*}
{pdf}
{
\ifx\pdf@page\relax\def\pdf@page{0}\fi
\def\current@pdf@file{\[email protected][\pdf@page]}
\def\current@png@file{\Gin@base-\[email protected]}%
\expandafter\Needs\expandafter{"convert \current@pdf@file\space %\csname Gin@base\endcsname.pdf
\current@png@file"}%
\Picture[pict]{\current@png@file}%
\special{t4ht+@File: \csname current@png@file\endcsname}
\let\pdf@page\relax
}
}
\pdf@page
包含请求的页面,此宏由选项存储\includegraphics
page
。我们可以使用 Imagemagick 的命令转换特定的 pdf 页面,convert
格式如下:
convert filename.pdf[page number] filename.png
然后使用命令包含转换后的图像\Picture
。\special
用于在中注册输出文件tex4ht
,以便可以将其复制到目标目录。