我在 Windows 7 下运行 MiKTeX,尝试使用 htlatex 将一些 LaTeX 编译为 HTML。
htlatex 似乎将 HTML 中的每个“ff”和“fi”实例转换为 NUL 字节。想知道是否有人有任何见解!
这是我正在使用的配置文件(我在网上看到的一些东西可能就是问题所在):
\Preamble{xhtml}
\Configure{HtmlPar}
{\EndP\Tg<p>}
{\EndP\Tg<p>}
{\HCode{</p>\Hnewline}}
{\HCode{</p>\Hnewline}}
\Configure{emph}{\ifvmode\ShowPar\fi\HCode{<em>}}{\HCode{</em>}}
\Configure{textbf}{\ifvmode\ShowPar\fi\HCode{<b>}}{\HCode{</b>}}
\begin{document}
\EndPreamble
下面是一个示例 tex 文件,可以说明我的问题:
\documentclass{article}
\begin{document}
\section{Letters}
\subsection{Valid Letters}
AA Aa aA aa\\
BB Bb bB bb\\
CD Cd cD cd\\
\subsection{Invalid Letters}
FF Ff fF ff\\
FI Fi fI fi\\
\section{Strings}
a string of text\\
a fine string of text\\
a definition of an efficient and fine string of text\\
finally, the problem is solved!\\
\end{document}
这是我运行该命令后得到的输出
htlatex example.tex MyFonts.cfg "xhtml, NoFonts, -css" -utf8 -shell-escape
1 字母
1.1 有效信件
AA Aa aA aa
BB Bb bB bb
CD Cd cD cd1.2 无效信件
FF Ff fF
FI Fi fI2 根弦
一串文本
一串清晰的文本
一串有效而清晰的文本终于,问题解决了!
如果我查看 HTML 输出,所有出现的“ff”和“fi”都已被 NUL 字符替换。有人知道为什么吗?
谢谢!
答案1
您以错误的方式编译它。
正确的编译顺序是:
htlatex filename "tex4ht.sty opt" "tex4ht command opt" "t4ht command opt" "latex opt"
在你的情况下这意味着这个命令:
htlatex filename "MyFonts, NoFonts, -css" " -utf8" "" -shell-escape
这为我生成了良好的 html。
进一步说明:
您请求命令-utf8
的选项tex4ht
,但是您没有提供unicode字体-cunihtf
或的选项-cmozhtf
,因此生成的html是latin-1
编码的。unicode的正确编译顺序是:
htlatex filename "MyFonts, NoFonts, -css, charset=utf-8" " -utf8 -cunihtf" "" -shell-escape
请注意,在这种情况下,连字符会转换为 Unicode 字符,这可能不是您想要的。您可以使用我的制作4小时工具:
您可以将选项移动tex4ht.sty
到文件中cfg
:
\Preamble{xhtml,NoFonts, -css}
所以您不需要在命令行上指定它们。现在您可以简单地调用:
make4ht -u -c MyFonts -s filename
还要注意,该NoFonts
选项可能很危险 - 如果你将其添加到你的 tex 文件中:
\textbf{příliš} \emph{žluťoučký} \textit{ďábelské}
和
\usepackage[utf8]{inputenc}
生成的 html 如下所示:
<b>Hello příliš</b> <em>žluťoučký</em> ďábelské
\textbf
您可以看到和有 html 标签\emph
,因为您为这些命令提供了配置,但\textit
没有生成任何标记。如果您删除NoFonts
选项,由于tex4ht
命令中的错误,重音字符周围会产生大量不必要的元素,这可能是您使用 的原因NoFonts
。要解决此问题,您可以配置\textbf
和\emph
关闭 html 字体:
\Configure{emph}{\ifvmode\ShowPar\fi\HCode{<em>}\NoFonts}{\EndNoFonts\HCode{</em>}}
\Configure{textbf}{\ifvmode\ShowPar\fi\HCode{<b>}\NoFonts}{\EndNoFonts\HCode{</b>}}
但是如果你不想为所有字体更改命令提供这样的配置,你可以使用make4ht
过滤器。创建 make 文件filename.mk4
:
local filter = require "make4ht-filter"
local process = filter{"cleanspan", "fixligatures", "hruletohr"}
Make:htlatex()
Make:htlatex()
Make:match("html$",process)
此示例中使用了三个过滤器:
- cleanspan 删除重音字母周围的虚假跨度元素
- fixligatures 用基本字符替换连字符
-----
hruletohr用<hr />
元素替换一系列字符
如果删除该NoFonts
选项,生成的 html 现在是:
<b>příliš</b> <em>žluťoučký</em> <span class="cmti-10">ďábelské </span>
因此,即使\textit
没有产生语义上有意义的代码,文本也会由于 css 而变成斜体。