使用 tex4ht 进行 ODT 输出的数学模式下文本的非 ascii 字符

使用 tex4ht 进行 ODT 输出的数学模式下文本的非 ascii 字符

这是相关的,但据我所知,与关于python:从make4ht到odt格式的utf-8输出

我正在使用make4ht将 LaTeX 文档转换为 ODT,其中有一些方程式包含一些非 ascii 字符的文本,到目前为止我还没有能够获得良好的结果。

请考虑以下文档:

\documentclass{article}

\usepackage{amstext}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{tgpagella}

\begin{document}

\[
  \frac{importação}{consumo}
\]

\[
  \frac{\text{importação}}{\text{consumo}}
\]

\[
  \frac{\text{importa\c{c}\~ao}}{\text{consumo}}
\]

\[
  \frac{\mbox{importação}}{\mbox{consumo}}
\]

\[
  \frac{\textrm{importação}}{\textrm{consumo}}
\]

\[
  \frac{\textnormal{importação}}{\textnormal{consumo}}
\]

\end{document}

构建它:

make4ht -f odt document.tex

odt中的结果如下:

在此处输入图片描述

其背后,我们有:

  • 对于没有任何文本命令的方程式:

    • 在 .odt 文件中:({i m p o r t a ç ã o} over {c o n s u m o}因此每个字符都添加一个空格)

    • content.xml.odt 中对应方程为:

<math:mfrac><math:mrow><math:mi>i</math:mi><math:mi>m</math:mi><math:mi>p</math:mi><math:mi>o</math:mi><math:mi>r</math:mi><math:mi>t</math:mi><math:mi>a</math:mi><math:mi>&#xE7;</math:mi><math:mi>&#xE3;</math:mi><math:mi>o</math:mi></math:mrow> <math:mrow><math:mi>c</math:mi><math:mi>o</math:mi><math:mi>n</math:mi><math:mi>s</math:mi><math:mi>u</math:mi><math:mi>m</math:mi><math:mi>o</math:mi></math:mrow></math:mfrac> </math:math>

(我的解释是,这里的每个字母都被视为一个变量并放在相应的<math...>环境中。因此,尽管输出结果不同,但最终可能会被认为是正确的)。

  • 对于所有其他形式(即,使用数学模式内的文本命令):

    • 在 .odt 文件中:("o" over "consumo"因此,缺少括号(我不确定它们是否是必需的),最重要的是,缺少部分文本)

    • content.xml相应的方程中:

<math:mfrac><math:mrow><math:mstyle><math:mtext>importa&#xE7;&#xE3;o</math:mtext></math:mstyle></math:mrow> <math:mrow><math:mstyle><math:mtext>consumo</math:mtext></math:mstyle></math:mrow></math:mfrac>

因此,文本实际上存在,但 LibreOffice 不会呈现该文本。如果我直接content.xml使用编辑其中任何一个importação并重新打包,.odt 文件就会损坏。

那么,如何才能在 ODT 输出的数学模式下获得更好的文本结果,特别是使用上面的一些文本命令?

答案1

这似乎是 LibreOffice 的一个错误,它显然对编码为 XML 实体的 Unicode 字符存在问题,因为它只呈现实体后面的部分单词。将实体转换为字符似乎可以解决这个问题,因此我们可以重用我的上一个答案对于数学也做转换:

local filter = require "make4ht-filter"
local utfchar = unicode.utf8.char
local process =  filter {
  function(content)
    return content:gsub("%&%#x([A-Fa-f0-9]+);", function(entity)
      -- convert hexadecimal entity to Unicode
      print(entity,utfchar(tonumber(entity, 16)))
      return utfchar(tonumber(entity, 16))
    end)
  end
}

Make:match("4oo$", process)
Make:match("4om$", process)

数学保存在带有4om扩展名的文件中,因此此构建文件也会对带有该扩展名的文件执行转换过程。结果看起来不错:

在此处输入图片描述

相关内容