tex4ht 破坏了 HTML 文件中 CDATA 内的“--”

tex4ht 破坏了 HTML 文件中 CDATA 内的“--”

我正在使用外部 javascript 包(语法高亮器) 用于在编译为 HTML 时进行代码格式化,需要将代码放入其中,<![CDATA[ ... code .. ]]>如上面的链接所述

Mathematica 图形

这不会造成任何问题,只是 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> 

请注意,--不再显示。它们被更改为一些不可显示的代码。以下是屏幕截图

Mathematica 图形

我需要更改什么才能使 tex4ht 不会像这样更改我的 HTML 中的代码?请注意,当您在计算机上将上述内容编译为 HTML 时,不会显示任何内容,因为需要安装 javascript 包。但通过查看源代码,可以看到问题所在。

HTML 的十六进制转储显示--已更改为十六进制 15

Mathematica 图形

根据 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

Mathematica 图形

如果我不使用 lualatex 模式进行编译,那么它就可以正常工作!并且我会--在 HTML 中显示。即,如果我使用 编译上述内容make4ht foo.tex,则 HTML 如下

Mathematica 图形

现在它们--就在那里。所以这是 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源代码。

相关内容