Cómo obtener márgenes en saltos de página insertados dinámicamente dentro de una figura de un libro electrónico tex4ht

Aug 17 2020

Resumen

Estoy creando un libro electrónico usando LaTeX y tex4ht. Tengo cierto texto que quiero tratar como una figura. A veces, este texto abarca varias páginas. Cuando eso sucede, los saltos de página insertados dinámicamente desde el visor de libros electrónicos dividen el texto sin tener en cuenta los márgenes (al menos, no puedo entender cómo controlarlo). En otras palabras, el salto de página puede ocurrir justo en el centro vertical de una línea de texto.

Aquí hay un ejemplo de una línea de este tipo de mi MWE a continuación.

Intenté agregar diferentes márgenes y rellenos en el CSS, pero nada funcionó. ¿Cómo puedo evitar que esto suceda?

Estoy usando ebook-convert de Calibre para crear el ebook, pero he experimentado con múltiples programas de creación, múltiples formatos y múltiples visores de ebook; todo lo que he probado se comporta de manera similar con respecto a este problema.

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

personalizado.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;
}

Comandos

% 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

Respuestas

1 michal.h21 Aug 17 2020 at 15:53

Desafortunadamente, Calibre no funciona en mi sistema debido a algunos conflictos con la biblioteca de Python. Pero puedo confirmar este problema en Foliate, que es un visor de libros electrónicos para Gnome.

Un problema que puedo ver es que todo el contenido de su texto flotante está encerrado en el <p>elemento, que es HTML no válido. En general, debe cerrar los párrafos antes de insertar elementos de nivel de bloque como <div>. Se puede hacer usando los siguientes comandos:

\ifvmode\IgnorePar\fi\EndP

Esto debe hacerse antes de cada \HCode{<div ...>}. Luego puede requerir un nuevo párrafo usando \par. El archivo de configuración actualizado puede verse así:

\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

Sin embargo, esto no soluciona el problema real. Parece que es causado por esta declaración en tu CSS:

div.wrap-html-inner {
    display: inline-block;
    text-align: left;
}

Cuando elimina display: inline-block;, las líneas se muestran correctamente. ¿Cuál es el propósito de esta declaración?