tex4ebook 和 minted

tex4ebook 和 minted

我正在评估将我的 latex 书转换为 epub3 的可能性。这是 MWE:

\documentclass[a4paper,11pt]{book}
\usepackage[top=1in, bottom=1in, left=1.1in, right=1in]{geometry}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[english]{babel}

\usepackage{graphicx}
\usepackage{amsmath}
\usepackage[dvipsnames, table]{xcolor}

\usepackage{minted}
\definecolor{lightgray}{cmyk}{0.06, 0.05, 0.05, 0}
\setminted[python]{bgcolor=lightgray, breaklines, baselinestretch=0.8, fontsize=\small}
\setmintedinline[python]{bgcolor=lightgray, breaklines, fontsize=\small}
\setminted[text]{breaklines, baselinestretch=0.8, fontsize=\small}

\begin{document}

Lorem ipsum dolor sit amet, consectetur \mintinline{text}{asd_asd} adipiscing elit. Proin varius molestie faucibus. Suspendisse \mintinline{python}{asdasdasd} elementum \mintinline{python}{asd} velit sit amet urna convallis, et mattis nibh mollis. Proin quam felis, tristique nec hendrerit non, lobortis at lorem. Cras ac vehicula mauris. Curabitur ac nibh mollis, sodales ex sed, lacinia neque. \mintinline{text}{asdsad} Morbi fringilla libero ac sem eleifend gravida. Morbi aliquet ligula pharetra euismod lobortis. Fusce tristique id erat vitae venenatis. Ut \mintinline{python}{asdasadasdasasdasd}, \mintinline{python}{asd}, \mintinline{python}{asdasd} quis mi tempor, laoreet metus in, efficitur felis. Cras tristique viverra leo, elementum sollicitudin augue accumsan ac.

\begin{minted}{python}
def my_func(p1, p2, p3="asd"):
    # some line of wonderful code
    print("hello")
\end{minted}
\begin{equation}
y = m x^{2} + 2 x + 1
\end{equation}

Fusce \mintinline{python}{asd} congue neque volutpat massa posuere iaculis. Nulla commodo ipsum sed orci tincidunt faucibus. Mauris volutpat massa nisl, non lobortis lacus pulvinar nec. Nam elementum tortor nisi, ut tincidunt mi blandit vel. \mintinline{text}{asdas_dasd{asd}} Phasellus hendrerit dictum augue. Nullam ac sodales massa. Aliquam in accumsan odio, eu imperdiet libero. Sed aliquam ut orci et malesuada. \mintinline{python}{asd} Donec consequat vel mi id egestas. Sed posuere venenatis mi, quis ultrices leo congue a. Fusce et mi \mintinline{python}{asd} quis purus scelerisque elementum. Maecenas massa lectus, fringilla vel volutpat non, efficitur eget purus. Phasellus quis varius felis.

\end{document}

乱码段落中有一些 mintedinline 命令,它们代表代码。此外,还有 minted codeblock 和一个方程式。

首先,我尝试运行基本命令:tex4ebook -s -f epub3 test2.tex。结果如附图所示:左侧是 pdf,右侧是 epub。mintedinline创建新div元素,因此有新行,而minted代码块不尊重新行和缩进。此外,公式字体大小非常大。

在此处输入图片描述

理想情况下,我想创建一个针对 的配置文件mintedinline{text}mintedinline{python}以创建span具有自定义 CSS 标识符的元素。至于mintedcodeblock,我不知道。

我可以尝试什么?

答案1

似乎有些 Minted 选项与此包当前的 TeX4ht 支持不兼容。以下代码会导致编译错误,并且还会将所有行合并为一行:

 \setminted[python]{bgcolor=lightgray, breaklines, baselinestretch=0.8, fontsize=\small}

breaklines和选项bgcolor似乎会导致问题。要修复此问题,请将以下代码保存为minted.4ht

% minted.4ht (2019-11-07-14:08), generated from tex4ht-4ht.tex
% Copyright 2019 TeX Users Group
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
% version 1.3c of this license or (at your option) any
% later version. The latest version of this license is in
%   http://www.latex-project.org/lppl.txt
% and version 1.3c or later is part of all distributions
% of LaTeX version 2005/12/01 or later.
%
% This work has the LPPL maintenance status "maintained".
%
% The Current Maintainer of this work
% is the TeX4ht Project <http://tug.org/tex4ht>.
%
% If you modify this program, changing the
% version identification would be appreciated.
\immediate\write-1{version 2019-11-07-14:08}

\NewConfigure{InlineCode}{2}

\def\:tempa#1{%
  \endgroup%
  \begingroup%
  \Configure{BVerbatimInput}{\HCode{}}{}{}{}{}\a:InlineCode% The \HCode is necessary for correct paragraph handling
  \begingroup%
  \o:minted@inline@iii:{#1}%
  \b:InlineCode%
  \endgroup%
}

\HLet\minted@inline@iii\:tempa


\NewConfigure{MintedColorbg}{2}
\renewenvironment{minted@colorbg}[1]{%
  \colorlet{shadecolor}{#1}%
  \extractcolorspec{shadecolor}{\:tempa}%
  \expandafter\convertcolorspec\:tempa{HTML}\minted:bgcolor%
  \a:MintedColorbg%
  }
  {\b:MintedColorbg\medskip\noindent}

\Hinput{minted}
\endinput

重要的代码是这样的:

\NewConfigure{MintedColorbg}{2}
\renewenvironment{minted@colorbg}[1]{%
  \colorlet{shadecolor}{#1}%
  \extractcolorspec{shadecolor}{\:tempa}%
  \expandafter\convertcolorspec\:tempa{HTML}\minted:bgcolor%
  \a:MintedColorbg%
  }
  {\b:MintedColorbg\medskip\noindent}

它重新定义了用于有色背景列表的内部 Minted 环境。它使用的xcolor命令\extractcolorspec和将背景颜色保存到命令\convertcolorspec\minted:bgcolor。请注意,TeX4ht 使用的命令可以包含:字符作为文件名的一部分。命令\a:MintedColorbg\b:MintedColorbg用于使用\Configure命令插入 HTML 代码。

此配置是从自定义配置文件插入的。我们还将处理配置文件中的行折叠问题。如下所示myconfig.cfg

\Preamble{xhtml}
\catcode`\:=11
\Configure{fancyvrb}
   {\IgnorePar \EndP \gHAdvance\fancyvrbNo by 1
    \gHAssign\fancyvrb:cnt0
    \HCode{<pre class="fancyvrb" id="fancyvrb\fancyvrbNo">}}
   {\EndP\HCode{</pre>}}
   {\gHAdvance\fancyvrb:cnt by 1
    \ifnum \fancyvrb:cnt>1 
    \HCode{\Hnewline}\fi} {}
   {}{}

\Configure{MintedColorbg}
   {\ifvmode\IgnorePar\fi\EndP\HCode{<div class="minted-color-box" style="background-color:\#\minted:bgcolor">}}
   {\ifvmode\IgnorePar\fi\EndP\HCode{</div>}}
\Configure{Picture}{.svg}
\catcode`\:=12
\begin{document}
\EndPreamble

我将描述代码的某些部分:

\Configure{fancyvrb}
   {\IgnorePar \EndP \gHAdvance\fancyvrbNo by 1
    \gHAssign\fancyvrb:cnt0
    \HCode{<pre class="fancyvrb" id="fancyvrb\fancyvrbNo">}}
   {\EndP\HCode{</pre>}}
   {\gHAdvance\fancyvrb:cnt by 1
    \ifnum \fancyvrb:cnt>1 
    \HCode{\Hnewline}\fi} {}
   {}{}

这是从 TeX4ht 核心修改的配置。它使用<pre>标签而不是<div>花哨的逐字列表(Minted 在后台使用花哨的逐字列表)。这修复了行折叠问题。

\Configure{MintedColorbg}
   {\ifvmode\IgnorePar\fi\EndP\HCode{<div class="minted-color-box" style="background-color:\#\minted:bgcolor">}}
   {\ifvmode\IgnorePar\fi\EndP\HCode{</div>}}

这将启用代码清单的背景颜色。\ifvmode\IgnorePar\fi\EndP用于禁用框周围的段落。 我们需要此代码来生成格式良好的 HTML。 使用以下代码插入背景颜色:style="background-color:\#\minted:bgcolor",它使用\minted:bgcolor中定义的minted.4ht

请注意,内联铸造代码应该已经着色,奇怪的是它对您不起作用。

\Configure{Picture}{.svg}

这需要将数学转换为 SVG 图像。这应该会产生比默认位图更好的效果。请注意,数学的大小取决于原始文档的字体大小。当您使用11pt基本字体大小时,它可以稍微大一些。如果您想要更小的数学,您可以尝试更改基本字体大小。

您可以使用以下方式编译文档:

tex4ebook -c myconfig.cfg -sf epub3 test2.tex

另一种让数学看起来更好的方法是使用 MathML。问题是,虽然 MathML 是 Epub 3 规范的一部分,但许多阅读系统并不支持它。您可以使用以下方式要求 MathML:

 tex4ebook -c myconfig.cfg -sf epub3 test2.tex "mathml"

这是 SVG 图像的结果:

在此处输入图片描述

使用 MathML 进行如下操作:

在此处输入图片描述

相关内容