Как получить поля на динамически вставленных разрывах страниц в пределах рисунка электронной книги tex4ht

Aug 17 2020

Резюме

Я создаю электронную книгу с использованием LaTeX и tex4ht. У меня есть определенный текст, который я хочу рассматривать как рисунок. Иногда этот текст занимает несколько страниц. Когда это происходит, динамически вставленные разрывы страниц из средства просмотра электронных книг разбивают текст без учета каких-либо полей (по крайней мере, я не могу понять, как это контролировать). Другими словами, разрыв страницы может произойти прямо по вертикали в центре строки текста.

Вот пример такой строчки из моего MWE ниже.

Я пробовал добавлять разные поля и отступы в CSS, но ничего не помогло. Как я могу предотвратить это?

Я использую программу Calibre ebook-convert для создания электронной книги, но я экспериментировал с несколькими программами создания, несколькими форматами и несколькими программами просмотра электронных книг - все, что я пробовал, ведет себя аналогично в отношении этой проблемы.

MWE

mwe.tex

\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 michal.h21 Aug 17 2020 at 15:53

К сожалению, Caliber в моей системе не работает из-за некоторых конфликтов библиотеки Python. Но я могу подтвердить эту проблему в Foliate, программе просмотра электронных книг для Gnome.

Одна проблема, которую я вижу, заключается в том, что все содержимое вашего text float заключено в <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;линии отображаются правильно. Какова цель этого заявления?