Cách lấy lề trên các ngắt trang được chèn động trong hình của sách điện tử tex4ht

Aug 17 2020

Tóm lược

Tôi đang tạo ebook bằng LaTeX và tex4ht. Tôi có một số văn bản mà tôi muốn coi như một con số. Đôi khi, văn bản này kéo dài nhiều trang. Khi điều đó xảy ra, các ngắt trang được chèn động từ trình xem ebook sẽ phá vỡ văn bản mà không liên quan đến bất kỳ lề nào (ít nhất, tôi không thể tìm ra cách kiểm soát nó). Nói cách khác, ngắt trang có thể xảy ra ngay ở tâm dọc của một dòng văn bản.

Đây là một ví dụ về một dòng như vậy từ MWE của tôi bên dưới.

Tôi đã thử thêm các lề và đệm khác nhau trong CSS, nhưng không có gì hiệu quả. Làm cách nào để ngăn điều này xảy ra?

Tôi đang sử dụng chuyển đổi ebook của Calibre để tạo ebook, nhưng tôi đã thử nghiệm với nhiều chương trình tạo, nhiều định dạng và nhiều người xem ebook - mọi thứ tôi đã thử đều hoạt động tương tự đối với vấn đề này.

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

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

Lệnh

% 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

Trả lời

1 michal.h21 Aug 17 2020 at 15:53

Thật không may, Calibre bị hỏng trên hệ thống của tôi do một số xung đột thư viện Python. Nhưng tôi có thể xác nhận vấn đề này trong Foliate, là trình xem Ebook dành cho Gnome.

Một vấn đề mà tôi có thể thấy là toàn bộ nội dung của float văn bản của bạn được bao bọc trong <p>phần tử, đó là HTML không hợp lệ. Nói chung, bạn cần phải đóng các đoạn văn trước khi chèn các phần tử cấp khối chẳng hạn như <div>. Nó có thể được thực hiện bằng các lệnh sau:

\ifvmode\IgnorePar\fi\EndP

Điều này cần phải được thực hiện trước mỗi \HCode{<div ...>}. Sau đó, bạn có thể yêu cầu đoạn văn mới bằng cách sử dụng \par. Tệp cấu hình được cập nhật có thể trông giống như sau:

\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

Điều này không khắc phục được vấn đề thực sự. Có vẻ như đó là do khai báo này trong CSS của bạn:

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

Khi bạn loại bỏ display: inline-block;, các dòng được hiển thị chính xác. Mục đích của tuyên bố này là gì?