LaTeX コードを最小限の HTML に変換するにはどうすればよいですか?

LaTeX コードを最小限の HTML に変換するにはどうすればよいですか?

私は MikTex ディストリビューションの Texmaker を使用しています。

私がやりたいのは

  • Latexコードを作成する
  • Texmakerを実行してすべての置換を実行します。例:\newcommand
  • PDFではなく純粋なASCIIコードとして構築する

質問: 可能であれば、どのように実行し、Texmaker をどのように構成しますか?

皆様のコメントからの提案: 年代順に:

  • 使用または組み合わせるpdftotext

  • tex4ebook一緒に使うDOM-filters

  • lwarpパッケージを使用する

  • 使用pandoc

  • 使用markup

私の予備評価これらの提案のうち:

  1. pdftotextもちろん、 は機能します。また、 を使用して epub ファイルを 100 % (または部分的に) 手動でやり直す必要がある場合のフォールバック ソリューションとして役立つ可能性があります (以下のフローを参照)。 、 、はこの評価からSigil除外されます。lwarppandocmarkup

  2. 私は、a) tex4ebookmichal.h21 で提案されている設定ファイルを使用して実行し、b) を使用してScrivener事前にいくつかの置換を導入し (たとえば、 で行われた作業を保存する) \index{}、c)Sigilに魔法をかけ (再フォーマット、目次、メタデータなど)、という方法で目的を達成できると確信しています。// はい、半自動プロセスのままになります。

  3. 2a) のみを使用すると、作成された epub ファイルは Calibre の eBook リーダー (ソフトウェア) では正常に動作するようですが、iPad (ハードウェア) では奇妙な動作をします。詳しく調べていませんが、おそらく<guide>内部のセクションでcontent.opf何らかの理由で一部の情報が欠落しているのでしょう。そのような感じです。// 最小限のコーディング戦略に従う、つまり出力でできるだけ多くの装飾を避ける、もう 1 つの理由です。

  4. 同じ設定ファイルを使用してmake4ht、その HTML ファイルをSigil新しい epub で処理すると、iPad でも問題なく動作するようです。

プロセスを念頭に: あなたのコメントから、基本的なプロセス私は以下のことを念頭に置いています。現時点では、それを実現できるかどうか、また繰り返したときにどの程度信頼できるかは不明です。pdf部分は信頼できますが、epub作成は壊れやすい EPUB コード(一部のリーダーでは動作しますが、他のリーダーでは動作しません)。 // アプローチ:単一ソース、一度フリーズすると、PDFとEPUB出力。 //もちろん簡略化されています。// epub は有効な epub-content にすることはできません。問題を避けるためどの電子書籍リーダーでも。// "最小限の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}

...マークされた部分が...になればOKです。

  <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 オプションを使用しても、これは不要です。(おそらく、それを取り除くオプションが欠けているのでしょうか?)

私は2段階のプロセスを考えています:

  • 上記のASCII作成
  • 残りの問題を解決するためにPerlスクリプトを実行する

Latex/Texmaker の拡張機能があれば便利です。たとえば、 経由の略語や、 または を使用して必要な方法で HTML として参照を展開でき\newcommandます。PDF を作成し、そこから関連するテキストをコピーすることで、ある程度これを実現できます (つまり、HTML タグで「台無し」になるタイプセット テキスト)。ただし、これは良い解決策ではありません。\ref\vref

リスト環境の抽出や変換などの問題は残りますが、この目的のために作られた Perl なら実行できるはずです。

背景 2 (現在ではほぼ廃止)Sigil: 目的は、すべての epub 関連の処理を担当するによって必要に応じて分割できる 1 つの大きな HTML ファイルを作成することです。

背景 3 (現在ではほぼ廃止): 私は、ライティング ツールの を使用し、関連する Latex コードのみを挿入し、プレーン テキストとして Texmaker にコンパイルすることで、Latex ドキュメントを作成しますScrivener。これにより、何を含めるか、何を除外するか、何を変更するかを完全に簡単に制御できます。

スクリーンショット、で開かれたページを表示し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>からのリンク先、および TOC からのリンク先です\ref。このタグを削除すると、相互参照が機能しなくなります。<!-- l. 12 -->は、元の TeX ファイルの行番号です。これはデバッグには役立ちますが、他のタグほど便利ではないことに同意します。 は、<p class='noindent'>この段落が元のドキュメントでは意図されていなかったことを意味します。HTML ファイルは、余分な情報を気にしないマシンで消費されることを目的としているため、タグを削除しても何も得られず、かなり多くのものを失います。

そうは言っても、本当にこの情報をすべて削除したい場合は、削除できます。方法は 2 つあります。1 つは、TeX4th 構成ファイルを使用して生成されたタグを変更すること、もう 1 つは、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

セクション タイトルを処理するには、セクション タイプごとに 2 つの構成コマンドを提供する必要があります。

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

関連情報