tex4ht 将包含的 eps 图形转换为尺寸错误的 png

tex4ht 将包含的 eps 图形转换为尺寸错误的 png

我最近将我的 Ubuntu 环境从 18.04 更新到了 22.04,我注意到 tex4ht(或 htlatex)在包含图形方面的默认行为发生了显著变化。考虑一下基本示例ex.tex

\documentclass{article}
\usepackage{graphicx}

\begin{document}
Lorem ipsum dolor sit amet, consectetur $2+3=5$:
\[a=b+c\]
\begin{centering}
\includegraphics[width=0.5\textwidth]{myimage.eps}
\end{centering}
\end{document}

现在基本转换命令的结果:

htlatex ex.tex "xhtml, charset=utf-8, pic-m, gif", "-cunihtf -utf8"

是创建两个 gif 文件:(ex0x.gif, ex1x.gif对应公式)和一个 png 文件:myimage.png这是转换后的图形。

然而,在 Ubuntu 18.04 中,相同命令的结果完全不同 - 它生成了三个 gif:ex0x.gif, ex1x.gif, ex2x.gif其中第三个 gif 对应于包含的图形。

这种默认行为的改变导致我的工作环境中出现以下问题:

  1. htlatex 生成的图形的名称和事件类型(gif+png)不再具有通用模式。这让生成的文件的进一步后期处理变得复杂。
  2. 在旧行为中,由包含的图形生成的图像具有正确的像素尺寸(至少是宽度)。也就是说,标签中 tex4ht 生成的宽度<img>与生成文件的像素宽度相同。在当前行为中情况并非如此,因为 png 是相对于边界框以固定密度生成的。在我的情况下,它有时太小,有时太大。

所以我有以下问题:是否可以模仿 htlatex 的旧行为,即强制它以与数学公式生成的其他图片相同的方式转换包含的 eps 图形?


更多信息:

  • 我过去常常生成 gif,但切换到 png 就可以了,所以这个gif选项并不重要。
  • 我确实看到了如何tex4ht从 eps 图形生成 png 文件 - 它是源代码中的以下片段(tex4ht-html4.tex
\Configure{graphics*}
   {eps}
   {\openin15=\csname Gin@base\endcsname\PictExt\relax%
   \ifeof15% 
   \Needs{\a:EpsConvert}% 
   \fi%
   \closein15%
   {\Configure{Needs}{File: \Gin@base\PictExt}\Needs{}}%
   \Picture[\a:GraphicsAlt]{{\Gin@base\PictExt} |<graphics dim|>}}

|<graphics default extensions|>
....
\Configure{EpsConvert}{"\a:Ghostscript\space -dSAFER    -dBATCH    -dNOPAUSE    -dEPSCrop    -r\gr:density\space -sDEVICE=pngalpha -sOutputFile="\[email protected]" "\[email protected]" "}

但不知何故我找不到这种转换的旧源代码(具有旧行为)。

  • 我不完全确定这是否真的是 tex4ht 的问题或 latex 本身的问题(或它的一些软件包,graphicx?)
  • 我可以解决生成的 png 文件缺少通用模式的问题,但生成的文件像素尺寸(宽度)错误的问题确实很烦人。

答案1

这一变化发生在四年前。 包含的图像\includegraphics通常保留其名称。 由于网络不支持 EPS 文件,因此它们被转换为 PNG 或 SVG。 由于这种情况,这种转换只会发生一次。 仅当目标图像不存在时,它才会执行转换命令。 这可以显著加快转换过程:

\Configure{graphics*}
   {eps}
   {\openin15=\csname Gin@base\endcsname\PictExt\relax%
   \ifeof15% 
   \Needs{\a:EpsConvert}% 
   \fi%
   \closein15%

关于图像大小,我们从命令中获取图像尺寸\includegraphics,因此当您使用 时width=0.5\textwidth,将使用此宽度。有几种方法可以更改它,请参阅此如何

如果您确实希望将 EPS 图像转换为以 TeX 文件命名的文件,您可以使用以下配置文件:

\Preamble{xhtml}

\makeatletter
\catcode`\:=11
\Configure{graphics*}
   {eps}
   {%
   \gif:nm{}%
   \Needs{"\a:Ghostscript\space -dSAFER    -dBATCH    -dNOPAUSE    -dEPSCrop    -r\gr:density\space -sDEVICE=pngalpha -sOutputFile="\PictureFile" "\[email protected]" "}
   {\Configure{Needs}{File: \PictureFile}\Needs{}}%
   \Picture[\a:GraphicsAlt]{{\PictureFile} \csname a:Gin-dim\endcsname}}
\Configure{Gin-dim}{} 
\Css{img { 
    max-width: 100\%; 
    height: auto; 
}} 
\catcode`\:=12
\makeatother
\begin{document}
\EndPreamble

声明\gif:nm一个新的图像名称,然后将其保存在\PictureFile命令中。我们可以在转换命令和图像声明中使用此命令。

我们还删除了图像尺寸,但我们需要使用 CSS 声明图像的最大宽度,否则图像可能会溢出页面。

结果如下:

<!-- l. 5 --><p class='noindent'>Lorem ipsum dolor sit amet, consectetur <img alt='2+ 3 = 5  ' class='math' src='sample0x.gif' />:
</p>
   <div class='math-display'>
<img alt='a = b + c
' class='math-display' src='sample1x.gif' /></div>
<!-- l. 6 --><p class='nopar'>  <img alt='PIC' src='sample2x.gif' />
</p>
    

在此处输入图片描述

相关内容