如何将 LaTeX 代码转换为最少的 HTML?

如何将 LaTeX 代码转换为最少的 HTML?

我正在使用 MikTex 发行版中的 Texmaker。

我想做的是

  • 创建 Latex 代码
  • 运行 Texmaker 进行所有替换,例如从\newcommand
  • 将其构建为纯 ASCII 代码,而不是 pdf

问题:怎么做,如何配置 Texmaker,如果可以的话?

根据你的评论提出建议: 按年代顺序:

  • 使用或结合pdftotext

  • tex4ebook与使用DOM-filters

  • 使用lwarp

  • 使用pandoc

  • 使用markup

我的初步评估这些建议:

  1. pdftotext当然有效,如果我需要使用 手动重做 100%(或部分)epub 文件,它可能是一个有用的后备解决方案Sigil,请参阅下面的流程。 和 被排除lwarp在本次评估之外pandocmarkup

  2. 我有信心通过以下方式实现我的目标:a)tex4ebook按照 michal.h21 的建议运行配置文件,b)Scrivener预先使用来引入一些替换,例如,保存已完成的工作\index{},c)让它Sigil发挥魔力(重新格式化、目录、元数据等)。// 是的,它将仍然是一个半自动化过程。

  3. 仅使用 2a) 创建的 epub 文件似乎在 Calibre 的电子书阅读器 (软件) 上表现良好,但在我的 iPad (硬件) 上表现奇怪。还没有深入研究,但可能<guide>里面的部分content.opf由于某种原因遗漏了一些信息。诸如此类。// 这只是遵循最小编码策略的另一个原因,即尽可能避免在输出中出现太多花哨的东西。

  4. 使用make4ht相同的配置文件并在Sigil新的 epub 上处理该 HTML 文件似乎运行良好,即使在我的 iPad 上也是如此。

铭记过程:从您的评论中,请找到基本流程我的想法如下。目前还不清楚我是否能实现它,以及重复时它的可靠性如何。pdf 部分是可靠的,而 epub 创建可能会导致脆弱的epub代码(在某些阅读器上有效,但在其他阅读器上无效)。// 方法:单一来源,一旦冻结,pdf 和 epub 输出。//例子当然是简化了。// epub 不能是任何有效的 epub 内容,避免问题在任何电子书阅读器上。//”最小 epub“意思是:不要在输出文件中包括花哨的东西。//例子可以是 HTML 注释,这是允许的,但如果运气不好,会激怒一些电子书阅读器(需要很长时间才能加载它)。//装饰如果我没记错的话,带<p> </p>- 标签的插件是由 完成的Sigil。分区、目录创建、样式表等也是如此。也就是说,许多功能pdflatex都是多余的。

单一冻结源,从中衍生的 pdf 和 epub(可在任何电子书阅读器上运行)。

简而言之,我需要摆脱不太有用的字节,并拥有更多的控制权来插入类、div 标签等。相信我:Scrivener如果需要,可以使用 轻松完成部分操作。(如果您不了解此程序,请考虑使用一个工具来创建、组织、修改和收集大量不同长度的笔记。)

问题是程序/工具往往会将太多内容放入 epub 文件中...这是一种非常弱的格式(在一个阅读器上可能运行得很快且很好,但在另一个阅读器上会导致问题)。

在此处输入图片描述

示例(现在几乎已经过时了):不幸的是,我留下了一些关于我的“ASCII”要求可能意味着什么或可能不意味着什么的混淆的空间。希望读者不再触发“ascii”或“pdf”,从这个简单的 Latex 文档开始……

\documentclass[10pt]{book}

\begin{document}

\chapter{Lorem ipsum}

  Dolor sit amet consectetuer eros sit quis mauris pretium. Phasellus penatibus interdum dolor Ut nisl.

  \section{Nam amet}%<<<

  Adipiscing est leo convallis nunc interdum Lorem hendrerit Vestibulum amet.%<<<

  Facilisi Nulla ultrices malesuada orci nibh eget ac Aliquam eros ut. 

  \section{Lorem gravida}

  Oorci sociis Nunc id hendrerit at ac amet Pellentesque. Eleifend risus orci sem Sed ac.

  A nec pellentesque Pellentesque Morbi fringilla accumsan et metus at enim. 

  Eu felis Curabitur quis nibh tellus.

\end{document}

...标记的部分变成...就可以了。

  <h3 class='myOne'>1.1 Nam amet</h3>
<p>Adipiscing est leo convallis nunc interdum Lorem hendrerit Vestibulum amet.
</p>

...但肯定不是...

  <h3 class='sectionHead'><span class='titlemark'>1.1   </span> <a id='x2-20001.1'></a>Nam amet</h3>
<!-- l. 12 --><p class='noindent'>Adipiscing est leo convallis nunc interdum Lorem hendrerit Vestibulum amet.
</p>

在 ASCII 编辑器中显示 pdf 文件时可能看到的任何其他内容在这里都是不需要的。

背景 1(现在几乎已经过时了):这是创建尽可能纯净(即最小化)的 HTML 的另一种尝试。我尝试过tex4ebook,这是一个很棒的工具,但不幸的是,它会添加各种额外的信息和样式,模仿 Latex 的外观,这是我不想要的,即使使用 tidy 选项也是如此。(也许我错过了一个摆脱它的选项?)

我认为这是一个两步过程:

  • ASCII 创建如上所述
  • 运行一些 Perl 脚本来解决剩余问题

Latex/Texmaker 的扩展功能很不错,例如可以扩展缩写(通过\newcommand),以及使用\ref\vref我需要的 HTML 方式来引用。我可以通过创建 pdf 并从中复制相关文本(即使用 HTML 标签“破坏”排版文本)来在一定程度上做到这一点 - 但这不是一个好的解决方案。

还有一些问题,例如提取和转换列表环境。但这应该可以用为此目的而开发的 Perl 来实现。

背景 2(现在几乎已经过时了):目标是创建一个大的 HTML 文件,我可以根据需要对其进行分解Sigil,以处理所有的 epub 内容。

背景 3(现在几乎已经过时了):我使用写作工具创建我的 Latex 文档Scrivener,方法是仅插入相关的 Latex 代码并将其作为纯文本编译到 Texmaker 中。这样,我就可以完全轻松地控制要包含、排除或修改的内容。

截屏,显示一个在 中打开的页面Sigil,演示不需要的额外信息和需要插入的缺失标签,例如通过我的 Perl 脚本。右上角:tex4ebook处理。// 这是一个简短的示例,其中为 epub 文件创建了太多输出。少即是多,多或少。

在此处输入图片描述

答案1

老实说,我认为你想要实现的功能没什么用。额外的 HTML 标签和属性包含有用的语义信息,可用于 CSS 样式等。

例如此代码:

<h3 class='sectionHead'><span class='titlemark'>1.1   </span> <a id='x2-20001.1'></a>Nam amet</h3>
<!-- l. 12 --><p class='noindent'>Adipiscing est leo convallis nunc interdum Lorem hendrerit Vestibulum amet.
</p>

<h3 class='sectionHead'>表示该标题由命令生成\section<span class='titlemark'>可用于特殊格式的章节编号。是指向此章节的命令<a id='x2-20001.1'></a>的链接目标,也是目录的链接目标。如果删除此标记,交叉引用将停止工作。是原始 TeX 文件的行号,这对于调试很有用,但我同意它不如其他标记有用。表示此段落不是原始文档中的本意。由于 HTML 文件是供机器使用的,机器不介意额外的信息,因此删除标记不会获得任何好处,但会损失很多。\ref<!-- l. 12 --><p class='noindent'>

话虽如此,如果您真的想删除所有这些信息,您可以。有两种可能的方法。一种是使用 TeX4th 配置文件来更改生成的标签,另一种是使用 LuaXML DOM 过滤器以编程方式删除标签。您还可以混合使用这些方法,使用配置文件来完成更简单的操作,并使用构建文件删除难以从 TeX 端删除的剩余元素。

您的特定示例只需使用配置文件即可解决。将以下代码保存为mycfg.cfg

\Preamble{xhtml}
\def\blocktag#1{\ifvmode\IgnorePar\fi\EndP\HCode{#1}}
\Configure{chapter}{}{}{\blocktag{<h2>}\chaptername\ \TitleMark\HCode{<br />\Hnewline}}{\blocktag{</h2>}}
\Configure{section}{}{}{\blocktag{<h3>}\TitleMark}{\blocktag{</h3>}}
\Configure{subsection}{}{}{\blocktag{<h4>}\TitleMark}{\blocktag{</h4>}}
\Configure{subsubsection}{}{}{\blocktag{<h5>}\TitleMark}{\blocktag{</h5>}}
\ConfigureMark{chapter}{\thechapter}
\ConfigureMark{section}{\thesection\ }
\ConfigureMark{subsection}{\thesubsection\ }
% subsubsection doesn't need mark configuration, as it doesn't produce a number
% handle paragraphs
\Configure{HtmlPar}{\EndP\HCode{<p>}}{\EndP\HCode{<p>}}{\HCode{</p>}}{\HCode{</p>}}
\Configure{textbf}{\HCode{<b>}\NoFonts}{\EndNoFonts\HCode{</b>}}
\Configure{textit}{\HCode{<i>}\NoFonts}{\EndNoFonts\HCode{</i>}}
\Configure{emph}{\HCode{<em>}\NoFonts}{\EndNoFonts\HCode{</em>}}
% handle the <a> tag inside sections

\catcode`\:=11

\def\Title:Link#1#2{}
\def\EndTitle:Link#1{}
% uncomment the following lines to get correct cross-references
%\LinkCommand\SectionLink{span,\noexpand\:gobble,id}
%\def\Title:Link{\SectionLink}
%\def\EndTitle:Link#1{\EndSectionLink}
\catcode`\:=12


\begin{document}
\EndPreamble

为了处理章节标题,我们需要为每种章节类型提供两个配置命令:

 \Configure{sectionname}{at start of section}{at end of section}{section title}{end section title}
 \ConfigureMark{sectionname}{code that prints section number}

因此要配置部分,我们需要使用:

\Configure{section}{}{}{\blocktag{<h3>}\TitleMark}{\blocktag{</h3>}}
\ConfigureMark{section}{\thesection\ }

这将删除 TeX4ht 产生的所有不必要的格式。

然后我们可以修复段落:

\Configure{HtmlPar}{\EndP\HCode{<p>}}{\EndP\HCode{<p>}}{\HCode{</p>}}{\HCode{</p>}}

这将删除带有行号和缩进信息的注释。该\EndP命令将插入上一段的结束标记。

我还提供了\textbf使用以下类似命令的一些更好的格式:

\Configure{textbf}{\HCode{<b>}\NoFonts}{\EndNoFonts\HCode{</b>}}

\NoFonts命令将阻止插入<span class="cmbex">等。每次使用非默认字体时都会插入这些标签。\NoFonts将阻止这种情况。您需要使用\EndNoFonts来再次打开它。如果您根本不想使用字体信息,您可以通过NoFonts向命令添加选项来禁用它\Preamble,例如:

 \Preamble{xhtml,NoFonts}

最后一点是最有争议的。<a>节标题中的元素是使用\Title:Link命令插入的。您可以重新定义它以丢弃链接。因为它:在名称中使用了,所以还需要更改\catcode此字符:

\catcode`\:=11
\def\Title:Link#1#2{}
\def\EndTitle:Link#1{}
\catcode`\:=12

通过此配置,您将获得以下结果

tex4ebook -c mycfg.cfg sample.tex
 <h2>Chapter 1<br /> 
Lorem ipsum</h2>
<p>   Dolor sit amet consectetuer eros sit quis mauris pretium. Phasellus penatibus
interdum dolor Ut nisl.
   </p>
   <h3>1.1 Nam amet</h3>
<p>   Adipiscing est leo convallis nunc interdum Lorem hendrerit Vestibulum
amet.
</p><p>   Facilisi Nulla ultrices malesuada orci nibh eget ac Aliquam eros ut.
</p><p>
   </p>
   <h3>1.2 Lorem gravida</h3>
<p>   Oorci sociis Nunc id hendrerit at ac amet Pellentesque. Eleifend risus orci sem
Sed ac.
</p><p>   A nec pellentesque Pellentesque Morbi fringilla accumsan et metus at
enim.
</p><p>   Eu felis Curabitur quis nibh tellus.
   </p> 

如果您希望交叉引用和目录正常工作,我建议对“\Title:Link”使用以下配置:

\LinkCommand\SectionLink{span,\noexpand\:gobble,id}
\def\Title:Link{\SectionLink}
\def\EndTitle:Link#1{\EndSectionLink}

定义\LinkCommand了使用 TeX4ht 交叉引用机制生成链接的新命令。<a>此版本生成 而不是元素<span>\noexpand\:gobble删除了可能的外部链接,并id保存指向该部分的链接的目标。

经过这种改变,你会得到以下结果:

  <h2 id='lorem-ipsum'>Chapter 1<br /> 
<span id='x2-10001'>Lorem ipsum</span></h2>
<p>   Dolor sit amet consectetuer eros sit quis mauris pretium. Phasellus penatibus
interdum dolor Ut nisl.
   </p>
   <h3 id='nam-amet'>1.1 <span id='x2-20001.1'>Nam amet</span></h3>
<p>   Adipiscing est leo convallis nunc interdum Lorem hendrerit Vestibulum
amet.
</p><p>   Facilisi Nulla ultrices malesuada orci nibh eget ac Aliquam eros ut.
</p><p>
   </p>
   <h3 id='lorem-gravida'>1.2 <span id='x2-30001.2'>Lorem gravida</span></h3>
<p>   Oorci sociis Nunc id hendrerit at ac amet Pellentesque. Eleifend risus orci sem
Sed ac.
</p><p>   A nec pellentesque Pellentesque Morbi fringilla accumsan et metus at
enim.
</p><p>   Eu felis Curabitur quis nibh tellus.
   </p>   

请注意,该部分现在如下所示:

  <h3 id='nam-amet'>1.1 <span id='x2-20001.1'>Nam amet</span></h3>

<span id='x2-20001.1'>Nam amet</span>通过改变配置添加的,并且id='nam-amet'是由 添加的tex4ebook,以便根据章节标题而不是更容易改变的章节位置提供稳定的链接目的地。

段落中还有一些额外的空白,这是由 DVI 文件中的空白生成的。为了消除这些空白,我会使用 DOM 过滤器。

此任务的简单 DOM 过滤器可能如下所示:

local domfilter = require "make4ht-domfilter"

local function remove_space(node, regex)
  -- remove whitespace only from the text nodes
  if node and node:is_text() then
    node._text = node._text:gsub(regex, "")
  end
end

local filter = domfilter {
  function(dom)
    -- loop over <p> elements
    for _, p in ipairs(dom:query_selector("p")) do
      -- remove <p> elements without text
      local children = p:get_children()
      if #children < 2 and p:get_text():match("^%s*$") then
        p:remove_node()
      else
        local first = children[1]
        local last  = children[#children]
        remove_space(first, "^%s+") -- remove whitespace at the beginning
        remove_space(last, "%s+$") -- remove whitespace at the end of paragraph
      end
    end
    return dom
  end
}

Make:match("html$", filter)

您可以要求使用以下-e选项:

$ tex4ebook -c mycfg.cfg -e build.lua sample.tex

结果如下:

   <h2 id='lorem-ipsum'>Chapter 1<br /> 
<span id='x2-10001'>Lorem ipsum</span></h2>
<p>Dolor sit amet consectetuer eros sit quis mauris pretium. Phasellus penatibus
interdum dolor Ut nisl.</p>
   <h3 id='nam-amet'>1.1 <span id='x2-20001.1'>Nam amet</span></h3>
<p>Adipiscing est leo convallis nunc interdum Lorem hendrerit Vestibulum
amet.</p><p>Facilisi Nulla ultrices malesuada orci nibh eget ac Aliquam eros ut.</p>
   <h3 id='lorem-gravida'>1.2 <span id='x2-30001.2'>Lorem gravida</span></h3>
<p>Oorci sociis Nunc id hendrerit at ac amet Pellentesque. Eleifend risus orci sem
Sed ac.</p><p>A nec pellentesque Pellentesque Morbi fringilla accumsan et metus at
enim.</p><p>Eu felis Curabitur quis nibh tellus.</p>  

相关内容