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
结果如下: