
Я использую Texmaker из дистрибутива MikTex.
Что я хотел бы сделать, так это
- создать код Latex
- запустите Texmaker, чтобы сделать все замены, например, из
\newcommand
- построить его как чистый ASCII-код, а не как PDF
Вопрос: Как это сделать, как настроить Texmaker, если это возможно?
Предложения из ваших комментариев: В хронологическом порядке:
использовать или комбинировать с
pdftotext
использовать
tex4ebook
сDOM-filters
использовать
lwarp
пакетиспользовать
pandoc
использовать
markup
Моя предварительная оценкаиз этих предложений:
pdftotext
работает, конечно, и может быть полезным в качестве запасного решения, если мне понадобится переделать файл epub на 100 % (или по частям) вручную с помощьюSigil
, см. поток ниже. Исключеноlwarp
,pandoc
иmarkup
из этой оценки.Я уверен, что достигну своей цели, если а) запущу
tex4ebook
файл конфигурации, как предложил michal.h21, б)Scrivener
заранее внесу некоторые замены, например, чтобы сохранить проделанную работу\index{}
, в) позволюSigil
ему сделать свое дело (переформатировать, оглавление, метаданные и т. д.). // Да, это останется полуавтоматическим процессом.Используя только 2a), созданный epub-файл, кажется, отлично ведет себя с eBook-ридером Calibre (программное обеспечение), но странно ведет себя на моем iPad (аппаратное обеспечение). Не копался в этом, но, вероятно, в
<guide>
разделе внутриcontent.opf
по какой-то причине отсутствует какая-то информация. Что-то вроде этого. // Еще одна причина следовать стратегии минимального кодирования, т. е. избегать как можно большего количества причудливых вещей в выходных данных.Использование
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>