tex4ht 无法处理子文件夹中的图像?

tex4ht 无法处理子文件夹中的图像?
tlmgr revision 35841 (2014-12-16 20:11:15 +0100)
tex4ht revision:    34624

我正在使用用于测试 tex4ht 函数的包。但是,我发现如果图像在 subforder 下,oolatex 无法正确处理图形(ODT 文件中的图像在 libreoffice 和 openoffice 4.1.1 中都将显示为“读取错误”)。如果我们将图形移出,图像可以正确嵌入到 odt 文件中。发生这种情况的原因是什么,我应该做任何额外的配置来解决这个问题吗?

答案1

tex4ht这看起来像是支持的一个错误ODT。我提交了一个错误报告

所有图片都应放在文件Pictures的目录中odt,但会为原来位于编译文档子目录中的文件创建子目录。

为了解决这个问题,我们需要修改图片处理配置和一些命令tex4ht.env。我们需要将图片链接从 Pictures/subdir/imagename 更改为 Pictures/imagename。同时,我们需要跟踪实际图片文件的路径,以便将其复制到正确的位置。

您链接了一些测试包,我将用它作为测试的基础。有一个配置文件myconfig.cfg

处理图像包含的基本配置是\Configure{graphics*}

\Configure{graphics*}
   {png}
{\Picture[IMG]{imagename.png}}

\Gin@base我们需要为每种图形类型提供这样的配置。图像名称由包保存在宏中graphicx,但它包含完整路径。\Picture命令负责打印图像元素,我们在这里只需要基本名称。要删除路径,我们可以使用etoolbox列表处理命令:

\RequirePackage{etoolbox}
\Preamble{xhtml}
\DeclareListParser{\getImgFileParser}{/}

\makeatletter
\newcommand\getImgFile[2]{%
  \def\do##1{\def\imgBaseName{##1.#2}\def\imgBase{##1}}
  \def\ImgFullName{#1.#2}
  \getImgFileParser{#1}
}

我们声明了\getImgFile命令,有两个参数,文件名和后缀,我们将完整路径保存在中\ImgFullName,稍后我们会将其传递给复制命令。\getImgFileParser处理由分隔的路径的每个部分/,并将其带后缀和不带后缀保存到两个宏中。由于 imagename 是最后一部分,因此将在处理后保存。

我们可以按下列方式使用这个宏:

\Configure{graphics*}
   {png}
{\expandafter\getImgFile\expandafter{\Gin@base}{png}
   \Picture[IMG]{\imgBase.png}}

我们需要用\expandafter它扩展\Gin@base内容。

现在我们需要配置图像元素,使用\Configure{IMG}

\catcode`\:=11
\Configure{IMG}
  {\ht:special{t4ht>\ImgFullName.4og}%
\ht:special{t4ht*>}%
\ht:special{t4ht<\ImgFullName.4og}%
\OOmanifest{<manifest:file-entry
    manifest:full-path="Pictures/\imgBaseName"/>\Hnewline
}%
%
   \ht:special{t4ht=<draw:frame
      draw:name="\imgBaseName"
      text:anchor-type="as-char"  % "paragraph"
%      svg:width="...pt"
%      svg:height="...pt"
      draw:z-index="0"
    >%
      <draw:image\Hnewline
         xlink:href="Pictures/}}
  {\ht:special{t4ht=" \Hnewline
         xlink:type="simple"
        xlink:show="embed"
        xlink:actuate="onLoad"
\ifx\noBoundingBox\UnDefined
   \string svg:width="\the\Gin@req@width"
   svg:height="\the\Gin@req@height"
\fi
        /><!--draw:name="}}
  {" }
  {\ht:special{t4ht=" }}
  {\ht:special{t4ht=--></draw:frame>}}
\catcode`\:=12

此配置是从 复制而来,我只利用和ooffice.4ht更改了文件路径。我还添加了图像尺寸的代码。\ImgFullName\imgBaseName

mychonfig.cfg所有支持的图像格式的配置的完整内容:

\RequirePackage{etoolbox}
\Preamble{xhtml}
\DeclareListParser{\getImgFileParser}{/}


\makeatletter
\newcommand\getImgFile[2]{%
  \def\do##1{\def\imgBaseName{##1.#2}\def\imgBase{##1}}
  \def\ImgFullName{#1.#2}
  \getImgFileParser{#1}
}
  \Configure{graphics*}  
      {pdf}  
      {\Needs{"convert \csname Gin@base\endcsname.pdf  
                            \csname Gin@base\endcsname.png"}%  
\expandafter\getImgFile\expandafter{\Gin@base}{png}
   \Picture[IMG]{\imgBase.png }}  
\Configure{graphics*}
   {gif}
   {\expandafter\getImgFile\expandafter{\Gin@base}{gif}
\Picture[IMG]{\imgBase.gif }}
\Configure{graphics*}
   {png}
{\expandafter\getImgFile\expandafter{\Gin@base}{png}
   \Picture[IMG]{\imgBase.png}}
\Configure{graphics*}
   {jpg}
   {\expandafter\getImgFile\expandafter{\Gin@base}{jpg}
\Picture[IMG]{\imgBase.jpg}}
\Configure{graphics*}
   {jpeg}
   {\expandafter\getImgFile\expandafter{\Gin@base}{jpeg}
\Picture[IMG]{\imgBase.jpeg }}
\Configure{graphics*}
   {svg}
   {\expandafter\getImgFile\expandafter{\Gin@base}{svg}
\Picture[IMG]{\imgBase.svg }}
\catcode`\:=11
\Configure{IMG}
  {\ht:special{t4ht>\ImgFullName.4og}%
\ht:special{t4ht*>}%
\ht:special{t4ht<\ImgFullName.4og}%
\OOmanifest{<manifest:file-entry
    manifest:full-path="Pictures/\imgBaseName"/>\Hnewline
}%
%
   \ht:special{t4ht=<draw:frame
      draw:name="\imgBaseName"
      text:anchor-type="as-char"  % "paragraph"
%      svg:width="...pt"
%      svg:height="...pt"
      draw:z-index="0"
    >%
      <draw:image\Hnewline
         xlink:href="Pictures/}}
  {\ht:special{t4ht=" \Hnewline
         xlink:type="simple"
        xlink:show="embed"
        xlink:actuate="onLoad"
\ifx\noBoundingBox\UnDefined
   \string svg:width="\the\Gin@req@width"
   svg:height="\the\Gin@req@height"
\fi
        /><!--draw:name="}}
  {" }
  {\ht:special{t4ht=" }}
  {\ht:special{t4ht=--></draw:frame>}}
\catcode`\:=12
\makeatother
\begin{document}
\ConfigureEnv{tabular}
    {\HCode{}}{\HCode{}}{}{}
\ConfigureEnv{figure} 
    {\HCode{}}{\HCode{}}{}{}    
% This one removes the rulers. Taking a look at html4.4ht should make 
% clear what has been changed.
\Configure{float}
   {\ifOption{refcaption}{}{\csname par\endcsname\ShowPar \leavevmode}}
   {\HCode{}}
{\ifvmode \IgnorePar \fi\EndP \HCode{}\csname par\endcsname\ShowPar}
\EndPreamble

现在我们需要修改的内容tex4ht.env。使用以下命令查找文件的位置

kpsewhich tex4ht.env 

并将其复制到当前目录。在unix系统上,更改以下行:

.4og mkdir -p              sxw-%%0.dir/Pictures/%%1
.4og rmdir                 sxw-%%0.dir/Pictures/%%1
.4og cp    %%1             sxw-%%0.dir/Pictures/%%1

.4og cp    %%1             sxw-%%0.dir/Pictures/

在 Windows 上,使用了一些其他命令,但变化应该类似。

现在我们已经完成了图像包含,您的示例只有一个小问题。tex4ht找不到图像的边界框,并且渲染得太小。使用

ebb imagename

命令创建边界框信息并在 TeX 文件中更改

\usepackage{graphicx}

\usepackage[dvipdfm]{graphicx}

编译后

mk4ht oolatex test_case_mk4ht myxhtml

结果如下:

在此处输入图片描述

相关内容