概括
我正在使用 LaTeX 和 tex4ht 创建电子书。我想将某些文本视为图形。有时,这些文本跨越多页。当发生这种情况时,电子书查看器动态插入的分页符会不考虑任何边距而将文本拆分(至少,我不知道如何控制它)。换句话说,分页符可以发生在文本行的垂直中心。
下面是我的 MWE 中的此类行的一个示例。
我尝试在 CSS 中添加不同的边距和填充,但没有任何效果。我该如何防止这种情况发生?
我正在使用 Calibre 的 ebook-convert 来创建电子书,但我尝试过多个创建程序、多种格式和多个电子书查看器——对于这个问题,我尝试过的所有程序的行为都类似。
平均能量损失
麦格
\documentclass[ebook]{book}
%% Do-nothing environments that provide CSS hooks
\newenvironment{wrap-html-outer}{}{}
\newenvironment{wrap-html-inner}{}{}
\newenvironment{textfigure}{%
\begin{figure}%
\begin{wrap-html-outer}%
\begin{wrap-html-inner}%
}
{
\end{wrap-html-inner}%
\end{wrap-html-outer}%
\end{figure}%
}
\usepackage{lipsum}
\begin{document}
Some text before the figure.
\begin{textfigure}%
\lipsum
\end{textfigure}
Some text after the figure.
\end{document}
tex4ht.cfg
\RequirePackage{include4ht}
\Preamble{xhtml}
\AddCss{custom.css}
\ConfigureEnv{wrap-html-outer}{\HCode{<div class="wrap-html-outer">}}{\HCode{</div>}}{}{}
\ConfigureEnv{wrap-html-inner}{\HCode{<div class="wrap-html-inner">}}{\HCode{</div>}}{}{}
\begin{document}
\EndPreamble
自定义.css
p.noindent {
text-indent: 0;
}
div.figure {
margin-top: 1em;
margin-bottom: 1em;
}
div.wrap-html-outer {
text-align: center;
padding: 1em 2em;
}
div.wrap-html-inner {
display: inline-block;
text-align: left;
}
命令
% htxelatex mwe "tex4ht.cfg,xhtml,charset=utf-8" " -cunihtf -utf8" ""
% /Applications/calibre.app/Contents/MacOS/ebook-convert mwe.html mwe.epub --extra-css custom.css
答案1
不幸的是,由于一些 Python 库冲突,Calibre 在我的系统上无法使用。但我可以在 Foliate(适用于 Gnome 的电子书查看器)中确认这个问题。
我发现的一个问题是,文本浮动的所有内容都包含在元素中<p>
,这是无效的 HTML。通常,您需要在插入块级元素(例如)之前关闭段落<div>
。可以使用以下命令完成此操作:
\ifvmode\IgnorePar\fi\EndP
这需要在每个 之前完成\HCode{<div ...>}
。然后您可以使用 来要求新的段落\par
。更新后的配置文件如下所示:
\RequirePackage{include4ht}
\Preamble{xhtml}
\AddCss{custom.css}
\def\closecurrentpar{\ifvmode\IgnorePar\fi\EndP}
\ConfigureEnv{wrap-html-outer}{\closecurrentpar\HCode{<div class="wrap-html-outer">}\par}{\closecurrentpar\HCode{</div>}}{}{}
\ConfigureEnv{wrap-html-inner}{\closecurrentpar\HCode{<div class="wrap-html-inner">}\par}\closecurrentpar{\HCode{</div>}}{}{}
\begin{document}
\EndPreamble
但这并不能解决真正的问题。它似乎是由 CSS 中的以下声明引起的:
div.wrap-html-inner {
display: inline-block;
text-align: left;
}
当您删除 时display: inline-block;
,这些行将正确显示。此声明的目的是什么?