我熟悉以下问题162626与204822,并按照其中的说明进行操作,但一直无法得到好的解决方案。htlatex 正在将文档中的所有连字符转换为空字节。MWE:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[oldstyle,proportional]{libertine}
\begin{document}
find the fly; it's difficult, but fluffy.
\end{document}
我的命令行:
htlatex test.tex "xhtml, -css, charset=utf-8" " -utf8 -cunihtf" "" -shell-escape;
问题似乎出在libertine
;当我不加载它时,连字符会正常显示,但当我加载它时,连字符为空。这建议的解决方案是简单地删除包libertine
,然后使用 进行编译htlatex
,但我真的想避免必须修改我的文档才能将其转换为 HTML。
有人对此有建议的解决方案吗?
答案1
Linux Libertine 仍未在 Linux 中完全支持tex4ht
,因为有几十种字体,适用于各种字体编码、样式、大小和粗细。但是,添加对基本 T1 字体的支持并不难,使用特发。
您会发现命令输出缺少一些字体支持tex4ht
:
tex4ht test.dvi " -cunihtf -utf8"
这将打印出很多文本,因为它打印的是tex4ht.env
文件的内容,而文件的内容并不小。但在开始时,你会发现:
tex4ht.c (2012-07-25-19:36 kpathsea)
tex4ht sample.dvi
(/usr/local/texlive/2015/texmf-dist/tex4ht/base/unix/tex4ht.env)
(/usr/local/texlive/2015/texmf-dist/tex4ht/ht-fonts/iso8859/1/html/charset/unicode.4hf)
(/usr/local/texlive/2015/texmf-dist/fonts/tfm/public/libertine/LinLibertineTB-osf-t1.tfm)
(LinLibertineTB-osf-t1.htf)
Searching `LinLibertineT-osf-t1.htf' for `LinLibertineTB-osf-t1.htf'
--- warning --- Couldn't find font `LinLibertineT-osf-t1.htf' (char codes: 0--255)
----------------------------------------------------
environment file
----------------------------------------------------
% tex4ht.env-unix (2015-02-15-10:26), generated from tex4ht-env.tex
因此我们需要创建文件LinLibertineT-osf-t1.htf
,对应到。我们可以通过项目提供的命令 LinLibertineT-osf-t1.tfm
来检查使用的字体编码以及字体是虚拟的还是真实的:lstexenc
htfgen
$ lstexenc LinLibertineT-osf-t1
LinLibertineT-osf-t1 vf EXTENDED TEX FONT ENCODING - LATIN
LinLibertineT-osf-t1--base tfm EXTENDED TEX FONT ENCODING - LATIN
所以我们看到它是虚拟字体,并且使用了一些非标准字体编码。它使用LinLibertineT-osf-t1--base
作为基础字体,有时虚拟字体包含几种字体,所以这还不算太糟。
有时可以在.map
文件中找到准确的字体编码。最简单的查找方法是使用 Google 搜索fontname enc
,因此LinLibertineT-osf-t1--base enc
在我们的例子中(是的,enc 文件是为基本字体提供的。如果虚拟字体包含几种真实字体,我们需要为每种字体找到编码)。搜索找到文件libertine.map
,它为所有 Libertine 真实字体提供了编码。我们必须在其中搜索LinLibertineT-osf-t1--base
:
LinLibertineT-osf-t1--base LinLibertineT "AutoEnc_ulngvdga3jyvcsz3zod63p4gna ReEncodeFont" <[lbtn_ulngvd.enc <LinLibertineT.pfb
重要的是<[lbtn_ulngvd.enc
部分,它包含编码名称lbtn_ulngvd
。现在我们可以为创建辅助表LinLibertineT-osf-t1
:
tfmtochars LinLibertineT-osf-t1 lbtn_ulngvd > LinLibertineT-osf-t1.tsv
最后创建文件.htf
:
htfgen LinLibertineT-osf-t1.tsv > LinLibertineT-osf-t1.htf
结果如下:
LinLibertineT-osf-t1 0 255
'`' '' grave
'´' '' acute
'ˆ' '' circumflex
'˜' '' tilde
'¨' '' dieresis
'˝' '' hungarumlaut
'˚' '' ring
'ˇ' '' caron
'˘' '' breve
'¯' '' macron
'˙' '' dotaccent
'¸' '' cedilla
'˛' '' ogonek
'‚' '' quotesinglbase
'‹' '' guilsinglleft
'›' '' guilsinglright
'“' '' quotedblleft
'”' '' quotedblright
'„' '' quotedblbase
'«' '' guillemotleft
'»' '' guillemotright
'–' '' endash
'—' '' emdash
'&#xnil;' '' .notdef
'₀' '' perthousandzero
'ı' '' dotlessi
'ȷ' '' dotlessj
'fi' '' f_i
'ffi' '' f_f_i
'ff' '' f_f
'fl' '' f_l
'ffl' '' f_f_l
'␣' '' uni2423
'!' '' exclam
'"' '' quotedbl
'#' '' numbersign
'$' '' dollar
'%' '' percent
'&' '' ampersand
'’' '' quoteright
'(' '' parenleft
')' '' parenright
'*' '' asterisk
'+' '' plus
',' '' comma
'-' '' hyphen
'.' '' period
'/' '' slash
'' '' zero.oldstyle
'' '' one.oldstyle
'' '' two.oldstyle
'' '' three.oldstyle
'' '' four.oldstyle
'' '' five.oldstyle
'' '' six.oldstyle
'' '' seven.oldstyle
'' '' eight.taboldstyle
'' '' nine.oldstyle
':' '' colon
';' '' semicolon
'<' '' less
'=' '' equal
'>' '' greater
'?' '' question
'@' '' at
'A' '' A
'B' '' B
'C' '' C
'D' '' D
'E' '' E
'F' '' F
'G' '' G
'H' '' H
'I' '' I
'J' '' J
'K' '' K
'L' '' L
'M' '' M
'N' '' N
'O' '' O
'P' '' P
'Q' '' Q
'R' '' R
'S' '' S
'T' '' T
'U' '' U
'V' '' V
'W' '' W
'X' '' X
'Y' '' Y
'Z' '' Z
'[' '' bracketleft
'\' '' backslash
']' '' bracketright
'^' '' asciicircum
'_' '' underscore
'‘' '' quoteleft
'a' '' a
'b' '' b
'c' '' c
'd' '' d
'e' '' e
'f' '' f
'g' '' g
'h' '' h
'i' '' i
'j' '' j
'k' '' k
'l' '' l
'm' '' m
'n' '' n
'o' '' o
'p' '' p
'q' '' q
'r' '' r
's' '' s
't' '' t
'u' '' u
'v' '' v
'w' '' w
'x' '' x
'y' '' y
'z' '' z
'{' '' braceleft
'|' '' bar
'}' '' braceright
'~' '' asciitilde
'-' '' hyphen
'Ă' '' Abreve
'Ą' '' Aogonek
'Ć' '' Cacute
'Č' '' Ccaron
'Ď' '' Dcaron
'Ě' '' Ecaron
'Ę' '' Eogonek
'Ğ' '' Gbreve
'Ĺ' '' Lacute
'Ľ' '' Lcaron
'Ł' '' Lslash
'Ń' '' Nacute
'Ň' '' Ncaron
'Ŋ' '' Eng
'Ő' '' Ohungarumlaut
'Ŕ' '' Racute
'Ř' '' Rcaron
'Ś' '' Sacute
'Š' '' Scaron
'Ş' '' Scedilla
'Ť' '' Tcaron
'Ţ' '' Tcedilla
'Ű' '' Uhungarumlaut
'Ů' '' Uring
'Ÿ' '' Ydieresis
'Ź' '' Zacute
'Ž' '' Zcaron
'Ż' '' Zdotaccent
'IJ' '' IJ
'İ' '' Idotaccent
'đ' '' dcroat
'§' '' section
'ă' '' abreve
'ą' '' aogonek
'ć' '' cacute
'č' '' ccaron
'ď' '' dcaron
'ě' '' ecaron
'ę' '' eogonek
'ğ' '' gbreve
'ĺ' '' lacute
'ľ' '' lcaron
'ł' '' lslash
'ń' '' nacute
'ň' '' ncaron
'ŋ' '' eng
'ő' '' ohungarumlaut
'ŕ' '' racute
'ř' '' rcaron
'ś' '' sacute
'š' '' scaron
'ş' '' scedilla
'ť' '' tcaron
'ţ' '' tcedilla
'ű' '' uhungarumlaut
'ů' '' uring
'ÿ' '' ydieresis
'ź' '' zacute
'ž' '' zcaron
'ż' '' zdotaccent
'ij' '' ij
'¡' '' exclamdown
'¿' '' questiondown
'£' '' sterling
'À' '' Agrave
'Á' '' Aacute
'Â' '' Acircumflex
'Ã' '' Atilde
'Ä' '' Adieresis
'Å' '' Aring
'Æ' '' AE
'Ç' '' Ccedilla
'È' '' Egrave
'É' '' Eacute
'Ê' '' Ecircumflex
'Ë' '' Edieresis
'Ì' '' Igrave
'Í' '' Iacute
'Î' '' Icircumflex
'Ï' '' Idieresis
'Ð' '' Eth
'Ñ' '' Ntilde
'Ò' '' Ograve
'Ó' '' Oacute
'Ô' '' Ocircumflex
'Õ' '' Otilde
'Ö' '' Odieresis
'Œ' '' OE
'Ø' '' Oslash
'Ù' '' Ugrave
'Ú' '' Uacute
'Û' '' Ucircumflex
'Ü' '' Udieresis
'Ý' '' Yacute
'Þ' '' Thorn
'&#xnil;' '' .notdef
'à' '' agrave
'á' '' aacute
'â' '' acircumflex
'ã' '' atilde
'ä' '' adieresis
'å' '' aring
'æ' '' ae
'ç' '' ccedilla
'è' '' egrave
'é' '' eacute
'ê' '' ecircumflex
'ë' '' edieresis
'ì' '' igrave
'í' '' iacute
'î' '' icircumflex
'ï' '' idieresis
'ð' '' eth
'ñ' '' ntilde
'ò' '' ograve
'ó' '' oacute
'ô' '' ocircumflex
'õ' '' otilde
'ö' '' odieresis
'œ' '' oe
'ø' '' oslash
'ù' '' ugrave
'ú' '' uacute
'û' '' ucircumflex
'ü' '' udieresis
'ý' '' yacute
'þ' '' thorn
'ß' '' germandbls
LinLibertineT-osf-t1 0 255
(您需要在文件末尾添加空行,Stack Exchange 会吃掉它)
我们还应该添加对粗体和斜体的支持。如果字体使用相同的编码,我们不必重复整个过程。不幸的是,每种字体使用不同的编码,但在 diff 之后,它们似乎并没有太大的不同,所以我们可以只创建.htf
文件,它不包含所有字符的所有 unicode 值,而只是链接到LinLibertineT-osf-t1
。第二种文件类型htf
如下所示:
LinLibertineTB-osf-t1.htf:
.LinLibertineT-osf-t1
htfcss: LinLibertineTB-osf-t1 font-weight: bold; font-family: "Linux Libertine O",serif;
LinLibertineTI-osf-t1:
.LinLibertineT-osf-t1
htfcss: LinLibertineTI-osf-t1 font-weight: normal; font-style: italic; font-family: "Linux Libertine O",serif;
如果你没有禁用CSS
,你会看到类似以下内容:
如您所见,普通字体没有样式,但粗体和斜体有。您可以使用简单的配置文件修复它:
\Preamble{xhtml}
\Css{body{font-family: "Linux Libertine O", serif;}}
\begin{document}
\EndPreamble
还请注意,这里使用的是 unicode 旧式数字,而不是普通数字。最终结果: