我想使用 TeX4ht 从 LaTeX 生成 HTML 中的重音字符(带有下面的点)。这是我的 MWE.tex:
\documentclass{book}
\begin{document}
\d{s}
\d{ŕ}
\end{document}
我使用以下命令获取 HTML:
$ make4ht -l MWE.tex
这不太正确:ŕ 下缺少一个点。生成的 HTML 如下所示:
<p class='noindent'>ṣ</p>
<p class='indent'><span class='accentd'>ŕ</span></p>
这还不算太糟。我使用 XSLT 实现了一个解决方法,即对 HTML 文件进行后处理,并用 Unicode 字符(使用“组合下方点” Unicode 字符)替换元素span
,ṛ́
从而产生所需的结果。
现在,在更新我的系统(到 Ubuntu 23.10)后,我正在使用 Tex Live 2023。结果现在如下所示:
下方带点的 x 现在是图像而不是字符(而且是错误的字符:我想要的是 ŕ,而不是 x)。生成的 HTML 如下所示:
<p class='noindent'>ṣ</p>
<p class='indent'><img alt='ŕ. ' class='d' src='accents0x.png' /></p>
对我来说,这是 Tex Live 2022 的明显倒退。
我的问题:
- 我能在 Tex Live 2023 中获得与 Tex Live 2022 相同的结果吗?(我可以使用我的解决方法轻松解决这个问题)。
- 有没有一种不需要使用任何变通方法的解决方案?这意味着:
\d{s}
转换为ṣ
并\d{ŕ}
转换为ṛ́
。
答案1
由于数学模式中的问题,我不得不更改重音的处理方式。例如,$\widehat$ 不起作用。您可以使用此配置文件获取原始的重音处理方式:
\Preamble{xhtml}
\catcode`\:=11
\Configure{accents}
{\ifmmode \expandafter\mathord\fi
{\leavevmode
\if !#1!\ht:special{t4ht@+&\#x#2;}%
\else \expandafter \ifx\csname U#2#1\endcsname\relax
\ht:special{t4ht@+&{35}x#2;}%
\else
\ht:special{t4ht@+&{35}x\csname U#2#1\endcsname;}%
\fi \fi x%
%
\ht:special{t4ht@[}x\ht:special{t4ht@]}}}
{\ifmmode \expandafter\mathord\fi
{\HCode{<span class='accent#1'>}#3\HCode{</span>}}}
\catcode`\:=12
\begin{document}
\EndPreamble
它生成以下 HTML:
<!-- l. 5 --><p class='noindent'>ṣ
</p><!-- l. 7 --><p class='indent'> <span class='accentd'>ŕ</span>
</p>
要添加下面的点,您可以使用此make4ht
构建文件而不是 XSLT:
local domfilter = require "make4ht-domfilter"
local process = domfilter {
function(dom)
for _, el in ipairs(dom:query_selector(".accentd")) do
local accent = el:create_text_node(utf8.char(803))
el:add_child_node(accent)
end
return dom
end
}
Make:match("html$", process)
它循环遍历accentd
元素并添加组合点。使用以下方法编译:
$ make4ht -e build.lua -c config.cfg sample.tex
结果如下:
<!-- l. 5 --><p class='noindent'>ṣ
</p><!-- l. 7 --><p class='indent'> <span class='accentd'>ṛ́</span>
</p>