Как преобразовать код LaTeX в минимальный HTML?

Как преобразовать код LaTeX в минимальный HTML?

Я использую Texmaker из дистрибутива MikTex.

Что я хотел бы сделать, так это

  • создать код Latex
  • запустите Texmaker, чтобы сделать все замены, например, из\newcommand
  • построить его как чистый ASCII-код, а не как PDF

Вопрос: Как это сделать, как настроить Texmaker, если это возможно?

Предложения из ваших комментариев: В хронологическом порядке:

  • использовать или комбинировать сpdftotext

  • использовать tex4ebookсDOM-filters

  • использовать lwarpпакет

  • использоватьpandoc

  • использоватьmarkup

Моя предварительная оценкаиз этих предложений:

  1. pdftotextработает, конечно, и может быть полезным в качестве запасного решения, если мне понадобится переделать файл epub на 100 % (или по частям) вручную с помощью Sigil, см. поток ниже. Исключено lwarp, pandocи markupиз этой оценки.

  2. Я уверен, что достигну своей цели, если а) запущу tex4ebookфайл конфигурации, как предложил michal.h21, б) Scrivenerзаранее внесу некоторые замены, например, чтобы сохранить проделанную работу \index{}, в) позволю Sigilему сделать свое дело (переформатировать, оглавление, метаданные и т. д.). // Да, это останется полуавтоматическим процессом.

  3. Используя только 2a), созданный epub-файл, кажется, отлично ведет себя с eBook-ридером Calibre (программное обеспечение), но странно ведет себя на моем iPad (аппаратное обеспечение). Не копался в этом, но, вероятно, в <guide>разделе внутри content.opfпо какой-то причине отсутствует какая-то информация. Что-то вроде этого. // Еще одна причина следовать стратегии минимального кодирования, т. е. избегать как можно большего количества причудливых вещей в выходных данных.

  4. Использование make4htтого же файла конфигурации и обработка этого HTML-файла в Sigilновом epub, похоже, работает нормально, даже на моем iPad.

Процесс в уме: Из ваших комментариев, пожалуйста, найдитеосновной процессЯ имею в виду ниже. На данный момент не ясно, смогу ли я это реализовать, и насколько это будет надежно при повторении. PDF-часть надежна, а вот создание epub может привести кхрупкий код epub(работает на некоторых ридерах, но не на других). // Подход: один источник, однажды замороженный, вывод в формате PDF И EPUB. //примерупрощено, конечно. // epub не может быть любым допустимым epub-content,чтобы избежать проблемна любой электронной книге-ридере. // "Минимальный epub" означает: не включайте ничего необычного в выходной файл. //примермогут быть HTML-комментариями, которые разрешены, но, к сожалению, раздражают некоторых пользователей электронных книг (требуется целая вечность, чтобы просто загрузить их). //Украшениес <p> </p>- тегами делается Sigil, если я правильно помню. Так же как и разбиение на разделы, создание TOC, таблицы стилей и т. д. Т. е. многие вещи, которые 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>

Все остальное, что вы можете увидеть при отображении PDF-файла в редакторе ASCII, здесь нежелательно.

Предыстория 1 (сейчас почти устарела): Это альтернативная попытка создать HTML, который является максимально чистым, т.е. минимальным. Я попробовал tex4ebook, это отличный инструмент, но, к сожалению, он вставляет всевозможную дополнительную информацию и стили, имитируя внешний вид Latex, что мне не нужно, даже с опцией tidy. (Возможно, я упускаю опцию, чтобы избавиться от нее?)

Я думаю, что процесс состоит из двух этапов:

  • Создание ASCII, как указано выше
  • запустить Perl-скрипт для решения оставшихся проблем

Было бы неплохо иметь функцию расширения от Latex/Texmaker, например, для расширения сокращений (через \newcommand), и ссылок с использованием \refили \vrefтак, как мне нужно в HTML. Я могу сделать это в какой-то степени, создав pdf И скопировав из него соответствующий текст (т. е. набрать текст, "портящий" HTML-теги) - но это не очень хорошее решение.

Останутся проблемы, такие как извлечение и преобразование, например, list-environments. Но это должно быть выполнимо с помощью 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>является местом назначения для ссылок из \refкоманд, указывающих на этот раздел, а также из TOC. Если удалить этот тег, перекрестные ссылки перестанут работать. <!-- l. 12 -->является номером строки исходного файла TeX, это может быть полезно для отладки, но я согласен, что это не так полезно, как другие теги. <p class='noindent'>означает, что этот абзац не был предусмотрен в исходном документе. Поскольку файлы HTML предназначены для использования машинами, которые не против дополнительной информации, вы ничего не выигрываете, удаляя теги, но теряете довольно много.

С учетом сказанного, если вы действительно хотите удалить всю эту информацию, вы можете это сделать. Есть два возможных способа. Один из них — использовать файл конфигурации 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удаляет возможную ссылку out и 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>  

Связанный контент