
我正在使用 MikTex 發行版中的 Texmaker。
我想做的是
- 創建乳膠代碼
- 運行 Texmaker 進行所有替換,例如
\newcommand
- 將其建置為純 ASCII 代碼而不是 pdf
問題:如果可以的話,怎麼做,如何配置Texmaker?
根據您的意見提出的建議: 依年代順序:
使用或結合
pdftotext
tex4ebook
與使用DOM-filters
使用該
lwarp
包使用
pandoc
使用
markup
我的初步評價這些建議中:
pdftotext
當然,如果我需要使用 手動重做 epub 檔案 100%(或部分),並且可能作為後備解決方案有用Sigil
,請參閱下面的流程。排除在本次評估之外lwarp
。pandoc
markup
我有信心透過以下方式實現我的目標:a) 使用
tex4ebook
michal.h21 提出的配置文件運行,b) 使用Scrivener
預先引入一些替換,例如保存在 上完成的工作\index{}
,c) 讓其Sigil
發揮魔力(重新格式化、目錄、元資料等)。 // 是的,這將仍然是一個半自動過程。單獨使用 2a) 創建的 epub 檔案似乎在 Calibre 的電子書閱讀器(軟體)上表現良好,但在我的 iPad(硬體)上卻表現得很奇怪。還沒有深入研究它,但
<guide>
裡面的部分可能content.opf
由於某種原因遺漏了一些資訊。某事。像那樣。 // 這是遵循最小編碼策略的另一個原因,即在輸出中避免盡可能多的花哨的東西。使用
make4ht
相同的設定檔並在Sigil
新的 epub 上處理該 HTML 檔案似乎工作正常,即使在我的 iPad 上也是如此。
流程牢記於心: 從您的評論請找到基本流程我心裡記在下面。目前還不清楚我能否實現它,以及重複時它的可靠性如何。 pdf 部分是可靠的,而 epub 創建可能會導致脆弱的 epub 程式碼(適用於某些讀者,但不適用於其他讀者)。 // 方法:單一來源,一旦凍結,pdf 和 epub 輸出。 // 這例子當然,是簡化的。 // epub 不能是任何有效的 epub 內容,以避免問題在任何電子書閱讀器上。 //「最小的 epub" 的意思是:不要在輸出檔中包含奇特的東西。 // An例子可以是 HTML 註釋,這是允許的,但是運氣不好的話,會激怒一些電子書閱讀器(需要很長時間才能加載它)。 //裝飾如果我沒記錯的話,with <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>
此處不需要在 ASCII 編輯器中顯示 pdf 檔案時可能看到的任何其他內容。
背景1(現在幾乎已經過時):這是創建盡可能純粹(即最小化)HTML 的另一種嘗試。我嘗試過tex4ebook
,這是一個很棒的工具,但不幸的是它提供了各種額外的資訊和樣式,模仿乳膠外觀,這是我不想要的,即使有整潔的選項。 (也許我缺少擺脫它的選項?)
我想到了一個兩步驟過程:
- 上面給出的 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>
的連結的目標。\ref
如果刪除此標籤,交叉引用將停止運作。<!-- 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
,以根據章節標題提供穩定的連結目的地,而不是更可能發生變化的章節位置。
還有一些額外的空白 i 段落,這是由 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>