概括

概括

概括

我正在使用 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;,这些行将正确显示。此声明的目的是什么?

相关内容