我正在使用外部 javascript 包(语法高亮器) 用于在编译为 HTML 时进行代码格式化,需要将代码放入其中,<![CDATA[ ... code .. ]]>
如上面的链接所述
这不会造成任何问题,只是 tex4ht 由于某种原因改变--
(两个破折号)成一些奇怪的东西,导致 syntaxHighlighter 无法渲染它,因为它没有显示在屏幕上,这是错误的。
这是一个 MWE,我展示了使用的命令和最终的 HTML,可以清楚地看到它--
已被更改。这不应该发生。tex4ht<![CDATA[ ... code .. ]]>
不应该触及里面的任何内容,因为这是纯逐字代码,应该保持原样。这意味着要由 Javascript 库使用。
\documentclass[11pt]{scrartcl}%
\IfFileExists{luatex85.sty}{\usepackage{luatex85}}{}
\ifdefined\HCode% detect tex4ht
\usepackage[utf8]{luainputenc}
\usepackage[T1]{fontenc}
\else
\usepackage{fontspec}
\fi
\begin{document}
\ifdefined\HCode
{\ScriptEnv{html}{\ifvmode\IgnorePar\fi\EndP\NoFonts\hfill\break}{\EndNoFonts\endgraf}
\begin{html}
<DIV><style scoped>.syntaxhighlighter {font-size: normalsize!important;}</style>
<script type="syntaxhighlighter"class="brush:bash; toolbar: false;" >
<![CDATA[
make4ht --lua -u -c my.cfg -e main.mk4 foo.tex "htm,pic-align,notoc*"
]]>
</script>
</DIV>
\end{html}}
\else
test
\fi
\end{document}
使用编译 make4ht --lua foo7_1.tex
,HTML 如下所示
<?xml version="1.0" encoding="iso-8859-1" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!--http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd-->
<html xmlns="http://www.w3.org/1999/xhtml"
>
<head><title></title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta name="generator" content="TeX4ht (http://www.tug.org/tex4ht/)" />
<meta name="originator" content="TeX4ht (http://www.tug.org/tex4ht/)" />
<!-- xhtml,html -->
<meta name="src" content="foo7_1.tex" />
<link rel="stylesheet" type="text/css" href="foo7_1.css" />
</head><body
>
<DIV><style scoped>.syntaxhighlighter {font-size: normalsize!important;}</style>
<script type="syntaxhighlighter"class="brush:bash; toolbar: false;" >
<![CDATA[
make4ht lua -u -c my.cfg -e main.mk4 foo.tex "htm,pic-align,notoc*"
]]>
</script>
</DIV>
</body></html>
请注意,--
不再显示。它们被更改为一些不可显示的代码。以下是屏幕截图
我需要更改什么才能使 tex4ht 不会像这样更改我的 HTML 中的代码?请注意,当您在计算机上将上述内容编译为 HTML 时,不会显示任何内容,因为需要安装 javascript 包。但通过查看源代码,可以看到问题所在。
HTML 的十六进制转储显示--
已更改为十六进制 15
根据 ASCII 表,它是NAK
(否定确认)
更新
这个问题发生在任何数据上,即使在 中,也<PRE> ... </PRE>
与 无关CDATA
。似乎 tex4ht 只是不喜欢--
在 模式下看到lualatex
。这是一个新的 MWE
\documentclass[11pt]{article}%
\IfFileExists{luatex85.sty}{\usepackage{luatex85}}{}
\ifdefined\HCode% detect tex4ht
\usepackage[utf8]{luainputenc}
\usepackage[T1]{fontenc}
\else
\usepackage{fontspec}
\fi
\begin{document}
\ifdefined\HCode
{\ScriptEnv{html}{\ifvmode\IgnorePar\fi\EndP\NoFonts\hfill\break}{\EndNoFonts\endgraf}
\begin{html}
<PRE>
-- this is a test
</PRE>
\end{html}}
\else
test
\fi
\end{document}
同样的问题。以下是生成后的 HTMLmake4ht --lua foo.tex
如果我不使用 lualatex 模式进行编译,那么它就可以正常工作!并且我会--
在 HTML 中显示。即,如果我使用 编译上述内容make4ht foo.tex
,则 HTML 如下
现在它们--
就在那里。所以这是 tex4ht 的 lualatex 模式的问题。
答案1
连字符由命令激活\ScriptEnv
,这意味着当在用它定义的环境中遇到连字符时,它会调用命令。ScriptEnv
定义有点神秘:
\bgroup
\catcode`\-=13
\catcode`\(=1 \catcode`\)=2 \catcode`\/=0
\catcode`\{=12 \catcode`\}=12 \catcode`\\=12
/gdef/ScriptEnv#1(%
/expandafter/let/csname :#1:/endcsname=/empty
/edef/:temp(/def/expandafter/noexpand/csname a:#1/endcsname
####1/expandafter/noexpand/csname end/endcsname{#1}%
(####1/noexpand/:EndVerbatim/noexpand/end(#1)))/:temp
% /expandafter/def/csname
% b:#1/endcsname##1\end{#1}(##1/:EndVerbatim/end(#1))%
/expandafter/def/csname
b:#1/endcsname(/bgroup /catcode`/-=13
/def/:temp####1\end{#1}(/egroup
/def-(/string-/relax)
####1/:EndVerbatim%
/expandafter/def/csname end#1/endcsname()%
/end(#1))%
/:temp)%
/edef/:temp(/noexpand/DefScript:
/expandafter/noexpand/csname #1/endcsname
(/expandafter/noexpand/csname a:#1/endcsname)%
(/expandafter/noexpand/csname b:#1/endcsname))/:temp
)
/egroup
重要的一行是:
/def-(/string-/relax)
似乎在 LuaTeX 下,endash
在这种情况下会形成两个连续的连字符,由于某种原因,它们不会转换为 unicode 字符,但仍保留在 8 位编码中。我不太明白,但解决方案是改变定义\ScriptEnv
以抑制连字符的形成:
\bgroup
\gdef\:scriptenv:breakhyphen{\hbox{}}
\catcode`\-=13
\catcode`\(=1 \catcode`\)=2 \catcode`\/=0
\catcode`\{=12 \catcode`\}=12 \catcode`\\=12
/gdef/ScriptEnv#1(%
/expandafter/let/csname :#1:/endcsname=/empty
/edef/:temp(/def/expandafter/noexpand/csname a:#1/endcsname
####1/expandafter/noexpand/csname end/endcsname{#1}%
(####1/noexpand/:EndVerbatim/noexpand/end(#1)))/:temp
% /expandafter/def/csname
% b:#1/endcsname##1\end{#1}(##1/:EndVerbatim/end(#1))%
/expandafter/def/csname
b:#1/endcsname(/bgroup /catcode`/-=13
/def/:temp####1\end{#1}(/egroup
/def-(/string-/:scriptenv:breakhyphen/relax)
####1/:EndVerbatim%
/expandafter/def/csname end#1/endcsname()%
/end(#1))%
/:temp)%
/edef/:temp(/noexpand/DefScript:
/expandafter/noexpand/csname #1/endcsname
(/expandafter/noexpand/csname a:#1/endcsname)%
(/expandafter/noexpand/csname b:#1/endcsname))/:temp
)
/egroup
更正 的本地副本中的定义latex.4ht
。我将更新tex4ht
源代码。