Como posso converter código LaTeX em HTML mínimo?

Como posso converter código LaTeX em HTML mínimo?

Estou usando o Texmaker da distribuição MikTex.

O que eu gostaria de fazer é

  • criar código Latex
  • execute o Texmaker para fazer todas as substituições, por exemplo, de\newcommand
  • construa-o como código ASCII puro em vez de pdf

Pergunta: Como fazer, como configurar o Texmaker, desde que seja possível?

Propostas de seus comentários: Em ordem cronológica:

  • usar ou combinar compdftotext

  • usar tex4ebookcomDOM-filters

  • use o lwarppacote

  • usarpandoc

  • usarmarkup

Minha avaliação preliminardestas propostas:

  1. pdftotextfunciona, é claro, e pode ser útil como uma solução substituta se eu precisar refazer o arquivo epub 100% (ou em partes) manualmente com Sigil, veja o fluxo abaixo. Excluído lwarpe desta avaliação pandoc.markup

  2. Estou confiante de que alcançarei meu objetivo a) executando tex4ebookum arquivo de configuração conforme proposto por michal.h21, b) usando Scrivenerpara introduzir algumas substituições de antemão, por exemplo, para preservar o trabalho realizado em \index{}, c) deixar Sigilfazer sua mágica (reformatar , índice, metadados, etc.). // Sim, continuará sendo um processo semiautomático.

  3. Usando 2a) sozinho, o arquivo epub criado parece se comportar bem com o leitor de e-books do Calibre (software), mas apresenta um comportamento estranho no meu iPad (hardware). Não investiguei isso, mas provavelmente a <guide>seção interna content.opfperde algumas informações por algum motivo. Algo. assim. // Apenas mais uma razão para seguir uma estratégia de codificação mínima, ou seja, evitando o máximo possível de coisas sofisticadas na saída.

  4. Usar make4hto mesmo arquivo de configuração e processar esse arquivo HTML em Sigilum novo epub parece funcionar bem, mesmo no meu iPad.

Processo em mente: Nos seus comentários, encontre oprocesso básicoque tenho em mente abaixo. No momento não está claro se posso ou não realizá-lo e quão confiável será quando repetido. A parte pdf é confiável, enquanto a criação de epub pode levar acódigo epub frágil(funciona em alguns leitores, mas não em outros). // Abordagem: fonte única, uma vez congelada, saída em pdf E epub. // Oexemploé simplificado, é claro. // epub não pode ser nenhum conteúdo epub válido,para evitar problemasem qualquer leitor de e-book. //"EPUB mínimo" significa: não inclua coisas sofisticadas no arquivo de saída. // Umexemplopodem ser comentários em HTML, que são permitidos, mas, com azar, irritam alguns leitores de e-books (leva uma eternidade para carregá-los). //Decoraçãowith <p> </p>- tags é feito por Sigil, se bem me lembro. O mesmo acontece com o particionamento, a criação de TOC, folhas de estilo, etc. Ou seja, muitas coisas pdflatexque seriam fornecidas são meio redundantes.

Fonte única congelada, pdf E epub (rodando em qualquer leitor de e-book) derivada dela.

Resumindo, preciso me livrar de bytes menos úteis e ter mais controle para inserir classes, tags div etc. Confie em mim: isso pode ser feito parcialmente com facilidade usando Scrivener, se necessário. (Se você não conhece este programa, pense em uma ferramenta para criar, organizar, modificar e coletar um enorme conjunto de notas de vários tamanhos.)

O problema é que programas/ferramentas tendem a colocar muita coisa em um arquivo epub... que é um formato muito fraco (pode funcionar rápido e bem em um leitor, mas causa problemas em outro).

insira a descrição da imagem aqui

Exemplo (quase obsoleto agora): Infelizmente deixei espaço para alguma confusão sobre o que meu requisito "ASCII" pode ou não significar.Esperando que os leitores não acionem mais 'ascii' ou 'pdf',e começando com este simples documento 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}

... estaria tudo bem se a parte marcada se transformasse em ...

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

... mas certamente não em ...

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

Qualquer outra coisa que você possa ver ao exibir um arquivo PDF em um editor ASCII não é desejada aqui.

Antecedentes 1 (quase obsoleto agora): Esta é uma tentativa alternativa de criar HTML que seja tão puro, ou seja, mínimo quanto possível. Eu tentei o tex4ebook, que é uma ótima ferramenta, mas infelizmente coloca todo tipo de informação extra e estilos, imitando a aparência do Latex, o que não quero, mesmo com a opção arrumada. (Talvez esteja faltando uma opção para me livrar dele?)

Penso em um processo de duas etapas:

  • Criação ASCII conforme fornecido acima
  • execute algum script Perl para resolver os problemas restantes

O recurso de expansão do Latex/Texmaker seria bom, por exemplo, para expandir abreviações (via \newcommand) e referências de uso \refou \vrefda maneira que preciso como HTML. Eu posso fazer isso até certo ponto criando um pdf E copiando texto relevante dele (ou seja, texto digitado "estragando" com tags HTML) - mas esta não é uma boa solução.

Haverá questões restantes como extrair e transformar, por exemplo, ambientes de lista. Mas isso deveria ser possível com Perl, que foi feito para esse propósito.

Antecedentes 2 (quase obsoleto agora): O objetivo é criar apenas um grande arquivo HTML, que eu possa dividir conforme necessário Sigil, que cuida de todo o material epub.

Antecedentes 3 (quase obsoleto agora): Eu crio meu documento Latex usando Scriveneruma ferramenta de escrita, inserindo apenas código Latex relevante E compilando como texto simples no Texmaker. Isso me dá controle total e fácil sobre o que incluir, excluir ou modificar coisas.

Captura de tela, mostrando uma página aberta em Sigil, demonstrando informações extras, que não são necessárias, e tags ausentes, que precisam ser inseridas, por exemplo, através do meu script Perl. Canto superior direito: tex4ebookprocessamento. // Este é um pequeno exemplo onde muita saída é criada para o arquivo epub. Menos é mais, mais ou menos.

insira a descrição da imagem aqui

Responder1

Honestamente, não acho que o que você deseja alcançar seja muito útil. As tags e atributos HTML extras carregam informações semânticas úteis que podem ser usadas para estilo CSS, etc.

Por exemplo este código:

<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'>significa que este título foi produzido pelo \sectioncomando, <span class='titlemark'>pode ser usado para formatação especial do número da seção. <a id='x2-20001.1'></a>é um destino para links de \refcomandos que apontam para esta seção e também do TOC. Se você remover esta tag, as referências cruzadas deixarão de funcionar. <!-- l. 12 -->é o número da linha do arquivo TeX original, isso pode ser útil para depuração, mas concordo que não é tão útil quanto as outras tags. <p class='noindent'>significa que este parágrafo não foi pretendido no documento original. Como os arquivos HTML são destinados ao consumo de máquinas, que não se importam com informações extras, você não ganha nada removendo as tags, mas perde bastante.

Dito isto, se você realmente deseja remover todas essas informações, você pode. Existem duas maneiras possíveis. Uma é usar o arquivo de configuração TeX4th para alterar as tags geradas, a outra é usar filtros DOM LuaXML para remover tags programaticamente. Você também pode misturar essas abordagens, para usar o arquivo de configuração para coisas mais fáceis e o arquivo de construção para remover elementos restantes que são difíceis de remover do lado do TeX.

Seu exemplo específico pode ser resolvido usando apenas o arquivo de configuração. Salve o seguinte código como 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

Para lidar com títulos de seção, precisamos fornecer dois comandos de configuração para cada tipo de seção:

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

Então, para configurar a seção, precisamos usar:

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

Isto remove toda a formatação desnecessária produzida pelo TeX4ht.

Então podemos corrigir parágrafos:

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

Isso remove o comentário com números de linha e informações sobre recuo. O \EndPcomando insere a tag de fechamento do parágrafo anterior.

Também forneci uma formatação melhor \textbfe comandos semelhantes usando:

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

O \NoFontscomando impedirá a inserção de <span class="cmbex">etc. Essas tags são inseridas toda vez que você usa uma fonte não padrão. \NoFontsimpedirá isso. Você precisa usar \EndNoFontspara ligá-lo novamente. Se não quiser usar informações de fonte, você pode desativá-las adicionando NoFontsuma opção ao \Preamblecomando, como:

 \Preamble{xhtml,NoFonts}

A última parte é a mais controversa. O <a>elemento nos títulos das seções é inserido usando o \Title:Linkcomando. Você pode redefini-lo para descartar o link. Por usar o :no nome também é necessário alterar \catcodeeste caractere:

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

Com esta configuração, você obterá o seguinte resultado com

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> 

Se você deseja que as referências cruzadas e o TOC funcionem corretamente, sugiro usar a seguinte configuração para `\Title:Link:

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

Define \LinkCommandum novo comando que usa o mecanismo de referência cruzada TeX4ht para produzir links. Em vez do <a>elemento, esta versão produz <span>, \noexpand\:gobbleremove o possível link de saída e idmantém o destino dos links que apontam para a seção.

Com essa alteração, você obterá o seguinte resultado:

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

Observe que a seção agora está assim:

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

O <span id='x2-20001.1'>Nam amet</span>foi adicionado pela configuração alterada e id='nam-amet'foi adicionado por tex4ebook, para fornecer um destino de link estável com base no título da seção, em vez da posição da seção, que tem maior probabilidade de mudar.

Há também alguns espaços em branco extras nos parágrafos, que são gerados a partir dos espaços em branco no arquivo DVI. Para me livrar disso, eu usaria os filtros DOM.

O filtro DOM simples para esta tarefa poderia ser assim:

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)

Você pode exigir usando a -eopção:

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

Este é o resultado:

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

informação relacionada