tex4ht 전자 책의 그림 내에서 동적으로 삽입 된 페이지 나누기에 여백을 얻는 방법

Aug 17 2020

요약

LaTeX와 tex4ht를 사용하여 전자 책을 만들고 있습니다. 그림으로 취급하고 싶은 특정 텍스트가 있습니다. 때때로이 텍스트는 여러 페이지에 걸쳐 있습니다. 이 경우 ebook 뷰어에서 동적으로 삽입 된 페이지 나누기가 여백에 관계없이 텍스트를 나눕니다 (적어도 제어 방법을 알 수 없습니다). 즉, 페이지 나누기는 텍스트 줄의 세로 중앙에서 바로 발생할 수 있습니다.

다음은 내 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

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

명령어

% 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

불행히도 일부 Python 라이브러리 충돌로 인해 Calibre가 시스템에서 손상되었습니다. 하지만이 문제는 Gnome의 Ebook 뷰어 인 Foliate에서 확인할 수 있습니다.

내가 볼 수있는 한 가지 문제는 텍스트 플로트의 전체 내용 <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;하면 선이 올바르게 표시됩니다. 이 선언의 목적은 무엇입니까?