将 storebox 与 tex4ebook 结合使用

将 storebox 与 tex4ebook 结合使用

有什么方法可以让 storebox 包与 tex4ebook 一起工作吗?

基于 storebox 文档的 MWE 是:

\documentclass{article}

\usepackage{storebox}

\newstorebox{\mybox}

\begin{document}

\storebox{\mybox}{Contents of box}

\usestorebox{\mybox}

\usestorebox{\mybox}

\end{document}

根据文档,这只会在 pdf 文件中存储一个盒子副本以减小文件大小。它还说该包仅适用于 pdflatex 或 lualatex。

我想将它与 tex4ebook 一起使用,并带有重复的图像,就像讨论过的修改后的棋盘命令一样这里.我想定义一个带有

\storebox{\mybox}{%
  \begin{center}
  \mychessboard
  \end{center}}
}

并根据需要在文件中使用 \usestorebox{\mybox}。

如果稍后使用相同的棋盘,则想法是使用以前生成的图像,而不是创建新的图像。

谢谢。

更新:

我刚刚发现@Michal.h21 的解决方案不适用于 mobi 输出。

命令的输出

tex4ebook -r 133 -f mobi mwename.tex

 Amazon kindlegen(Windows) V2.9 build 1029-0897292
 A command line e-book compiler
 Copyright Amazon.com and its Affiliates 2014
*************************************************************

Error(xmlmake):E27012: Item or process id already used: mwename0x_png
Pack mobi 2

有什么方法可以避免这个错误吗?

如果我生成 epub,Calibre 会将文件转换为 mobi,不会出现任何错误。但是,我注意到 Calibre 转换其他文件时并不总是正确的,因此如果可能的话,我希望避免这种情况。

谢谢你的帮助。

更新 2:

@Michal.h21

使用新的 tex4book 文件仍然会导致错误。如果我生成 epub,它可以正常运行,但当我尝试使用 Calibre 查看它时会挂起:

Calibre error

如果我生成 mobi,我会收到一个错误:

Error(core):E1005: Could not access file.
     in file:    C:\Users\User\AppData\Local\Temp\mbp_7E1_1_1D_E_C_1F_3E7_3574_2508_1\OEBPS\mwename.html

您遇到了这些错误吗?

谢谢。

更正:

我注意到 epub 运行最后给出了一个整洁的错误:

HTML Tidy for Windows released on 25 March 2009
Error: Can't open "mwename-epub/OEBPS/mwename.ncx"

这可能是问题所在吗?

mwename.ncx 存在于工作目录中:

   <?xml version="1.0"?>
 <!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN"
"http://www.daisy.org/z3986/2005/ncx-2005-1.dtd">
 <ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">                                                                            <head>
 <meta name="dtb:uid" content="http://example.com/mwename"/>
 <meta name="dtb:depth" content="3"/>
 <meta name="dtb:totalPageCount" content="0"/>
 <meta name="dtb:maxPageNumber" content="0"/>
 </head>
 <docTitle>
<text>Unnamed</text>
</docTitle>
  <navMap>
   <navPoint id="mainentry" playOrder="1"> <navLabel><text>Document</text></navLabel> <content src="mwename.html" /> </navPoint></navMap>
   </ncx>

它不在OEBPS目录中。OEBPS目录中只有一个文件content.opf。

答案1

似乎每次使用都会\savebox复制数据,但使用相同的输出图像名称。我们可以利用这一事实,在make4ht构建文件中创建自定义图像转换函数,该函数将检查文件名并仅转换一次。

将以下文件另存为mwename.mk4

local used_images = {}
Make:image("png$", function(par)
  local output = par.output
  if not used_images[output] then
    local command = "dvipng -bg Transparent -T tight -D ${resolution} -o ${output}  -pp ${page} ${source}" % par
    print(command)
    used_images[output] = true
    os.execute(command)
  end
  return true
end)

构建文件是一个 Lua 脚本,函数Make:image("png$",...)配置图像的创建png。它会检查文件名是否已被使用,如果没有,它才会创建图像。

当我们修改MWE来创建图片时:

\documentclass{article}

\usepackage{storebox}

\newstorebox{\mybox}


\begin{document}

\storebox{\mybox}{\Picture+{}Contents of box\EndPicture}

\usestorebox{\mybox}

\usestorebox{\mybox}

\end{document}

结果如下:

enter image description here

您可以使用-r命令行选项来更改图片的分辨率:

 tex4ebook -r 133 mwename.tex

相关内容