
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 com
pdftotext
usar
tex4ebook
comDOM-filters
use o
lwarp
pacoteusar
pandoc
usar
markup
Minha avaliação preliminardestas propostas:
pdftotext
funciona, é claro, e pode ser útil como uma solução substituta se eu precisar refazer o arquivo epub 100% (ou em partes) manualmente comSigil
, veja o fluxo abaixo. Excluídolwarp
e desta avaliaçãopandoc
.markup
Estou confiante de que alcançarei meu objetivo a) executando
tex4ebook
um arquivo de configuração conforme proposto por michal.h21, b) usandoScrivener
para introduzir algumas substituições de antemão, por exemplo, para preservar o trabalho realizado em\index{}
, c) deixarSigil
fazer sua mágica (reformatar , índice, metadados, etc.). // Sim, continuará sendo um processo semiautomático.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 internacontent.opf
perde 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.Usar
make4ht
o mesmo arquivo de configuração e processar esse arquivo HTML emSigil
um 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 pdflatex
que 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).
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 \ref
ou \vref
da 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 Scrivener
uma 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: tex4ebook
processamento. // Este é um pequeno exemplo onde muita saída é criada para o arquivo epub. Menos é mais, mais ou menos.
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 \section
comando, <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 \ref
comandos 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 \EndP
comando insere a tag de fechamento do parágrafo anterior.
Também forneci uma formatação melhor \textbf
e comandos semelhantes usando:
\Configure{textbf}{\HCode{<b>}\NoFonts}{\EndNoFonts\HCode{</b>}}
O \NoFonts
comando 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. \NoFonts
impedirá isso. Você precisa usar \EndNoFonts
para ligá-lo novamente. Se não quiser usar informações de fonte, você pode desativá-las adicionando NoFonts
uma opção ao \Preamble
comando, como:
\Preamble{xhtml,NoFonts}
A última parte é a mais controversa. O <a>
elemento nos títulos das seções é inserido usando o \Title:Link
comando. Você pode redefini-lo para descartar o link. Por usar o :
no nome também é necessário alterar \catcode
este 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 \LinkCommand
um 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\:gobble
remove o possível link de saída e id
manté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 -e
opçã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>