diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/tex4ebook/tex4ebook.4ht |
Initial commit
Diffstat (limited to 'support/tex4ebook/tex4ebook.4ht')
-rw-r--r-- | support/tex4ebook/tex4ebook.4ht | 433 |
1 files changed, 433 insertions, 0 deletions
diff --git a/support/tex4ebook/tex4ebook.4ht b/support/tex4ebook/tex4ebook.4ht new file mode 100644 index 0000000000..e4233fc55a --- /dev/null +++ b/support/tex4ebook/tex4ebook.4ht @@ -0,0 +1,433 @@ +%\NewConfigure{ncxtable}{} + +%Configure date meta info +\def\:zeropadtwo#1{% + \ifnum #1<10 0\fi + #1% Then output the argument +}% --- \zeroPadTwo --- +\def\time:round:corr{\ifnum\the\numexpr\the\time-\the\time/60*60\relax<0 1\else 0\fi} +\def\:iso:date{% + \the\year-% + \:zeropadtwo{\the\month}-% + \:zeropadtwo{\the\day}% + %Timestamp will be zero seconds + T\:zeropadtwo{\the\numexpr(\the\time/60)-\time:round:corr\relax}:% + \:zeropadtwo{\the\numexpr\the\time-((\the\time/60)-\time:round:corr)*60\relax}:% + 00Z} + +%General configuration +\Configure{DOCTYPE}{\HCode{<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">}} + +\NewConfigure{EpubVersion}{1} +\Configure{EpubVersion}{2.0} + +\NewConfigure{UniqueIdentifier}{1} +\Configure{UniqueIdentifier}{http://example.com/\jobname} + + +% allow configuration of the document language. babel's main language is used by default +% use this only if it doesn't work +\NewConfigure{DocumentLanguage}[1]{\def\GetLanguage{#1}} + +% definitions of commands ignored in \author +\def\a:@author{} +\NewConfigure{@author}[1]{\concat:config\a:@author{#1}} + +\NewConfigure{OpfScheme}{1} +\Configure{OpfScheme}{URI} + +\NewConfigure{OpfMetadata}[1]{ + \ifx\relax#1\relax% + \edef\a:OpfMetadata{} + \else + \edef\a:OpfMetadata{\a:OpfMetadata\HCode{\Hnewline}#1} + \fi +} +\Configure{OpfMetadata}{} + +% This commands add filenames to opf item list and spine +\edef\opf:htmlfiles{} +\newcount\opf:htmlid +\def\opf:registerfilename#1{% + \ifcsdef{opf:entry#1}{}{% + \global\advance\opf:htmlid by1\relax + %\ifcsdef{opf:entry#1}{}{\csxdef{opf:entry#1}{Neni opf}} + \csxdef{opf:entry#1}{file\the\opf:htmlid} + \xdef\opf:htmlfiles{\opf:htmlfiles, #1} + } +} + +\newcommand\OpfRegisterFile[1][\FileName]{\opf:registerfilename{#1}} + +\NewConfigure{OpfManifest}[1]{% + \ifx\relax#1\relax% + \edef\a:OpfManifest{} + \else + \edef\a:OpfManifest{\a:OpfManifest\HCode{\Hnewline}#1} + \fi +} +\Configure{OpfManifest}{} + +% This is for add properties like toc or cover image in opf manifest +% Property must be added from document usinf \opf:add:property, current output filename is used +\NewConfigure{OpfItemProperties}{2} +\Configure{OpfItemProperties}{}{} +\def\opf:properties#1{% +\ifcsdef{opf:properties:#1}{ +\a:OpfItemProperties\csuse{opf:properties:#1}\b:OpfItemProperties% +}{}% +} +\def\opf:add:property#1{% + \ifcsdef{opf:properties:\FileName #1}{}{% + \csxdef{opf:properties:\FileName #1}{#1}% + \ifcsdef{opf:properties:\FileName}{% + \edef\:opf:prop:tmp{\csuse{opf:properties:\FileName}} + \csxdef{opf:properties:\FileName}{\:opf:prop:tmp\space #1} + }{\csxdef{opf:properties:\FileName}{#1}} + } +} + +% enable simple configuration from the .cfg file +\newcommand\OpfAddProperty[1]{\opf:add:property{#1}} + +%Set property only once +\def\opf:set:property#1{} + +% This code will refister \maketitle page to the opf file list +\let\oldmktl\a:mktl +\def\a:mktl{\oldmktl\opf:registerfilename{\FileName}} + +% guide element is used in epub2, it is similar to epub3 properties +% in epub3, it is deprecated, but it can be present +\edef\opf:guide{\HCode{<guide>\Hnewline}} + +% register file to the guide. first argument is optional filename, current +% output name is used when empty. second is title and third type + +\NewConfigure{OpfGuide}{4} +\newcommand\OpfGuide[3][]{% + \ifx\relax#1\relax \let\opf:guide:file\FileName\else\def\opf:guide:file{#1}\fi + \edef\opf:guide{\opf:guide\a:OpfGuide#3\b:OpfGuide#2\c:OpfGuide\opf:guide:file\d:OpfGuide} +} + +\Configure{OpfGuide}{\HCode{<reference type="}}{\HCode{" title="}}{\HCode{" href="}}{\HCode{" />\Hnewline}} + +% is NavMap used anywhere? +\NewConfigure{NavMap}{2} +\NewConfigure{NavSection}{4} +%Interface for setting xmlns +\edef\t4ht:xmlns{} +\NewConfigure{xmlns}[2]{% + \ifx\relax#2\relax% + \edef\t4ht:xmlns{}% + \else% + %\def\:prefix:xmlns{\ifx\relax#1\relax\else:#1\fi} + \edef\t4ht:xmlns{\t4ht:xmlns xmlns\ifx\relax#1\relax\else :#1\fi="#2"}% + \fi% +} + +\NewConfigure{CoverImage}{2} +\Configure{CoverImage}{% +\ifvmode\IgnorePar\fi\EndP\HCode{<div class="cover-image">\Hnewline} +}{\HCode{</div>\Hnewline}\par} +\def\CoverMetadata#1{% +\special{t4ht+@File: #1}% +\Configure{OpfMetadata} +{\HCode{<meta name="cover" content="cover-image" />\Hnewline}} +\Configure{OpfManifest} +{\HCode{<item id="cover-image" +href="#1" media-type="\a:CoverMimeType" />}} +} +\renewcommand\coverimage[2][]{% +\edef\CoverImageName{#2}% +\CoverMetadata{#2} +\a:CoverImage% +\includegraphics[#1]{#2}% +\b:CoverImage% +} + +\NewConfigure{CoverMimeType}{1} +\Configure{CoverMimeType}{image/png} + +\TocAt-{part,chapter,section,subsection,subsubsection} +\Configure{crosslinks*}{} + +\NewConfigure{NcxDoctype}{1} +\Configure{NcxDoctype}{\HCode{<!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN"\Hnewline + "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd">\Hnewline}} + +%Get sanitized value of \title +%\def\Title{\Ref{TITLE+}} +% If title contains macros, SafeTitle should be configured +% in the custom cfg file +\NewConfigure{SafeTitle}[1]{\gdef\Title{#1}} + +% add main html as first file in the OPF +\opf:registerfilename{\jobname.\:html} % + +% register all sectioning commands in the OPF +\def\patch:sec:register#1{% +\csgappto{c:#1}{\OpfRegisterFile}% +} +\patch:sec:register{part} +\patch:sec:register{chapter} +\patch:sec:register{section} +\patch:sec:register{subsection} +\patch:sec:register{subsubsection} +\patch:sec:register{likechapter} +\patch:sec:register{likesection} +\patch:sec:register{likesubsection} +\patch:sec:register{likesubsubsection} + +\:CheckOption{epub} +\if:Option +%\Configure{crosslinks+}{}{}{}{} + +% add explicit table of contents to OPF +\let\old:toc\a:tableofcontents +\def\a:tableofcontents{\old:toc\OpfRegisterFile} +% Support for SVG isn't ready +%\Configure{Picture}{.svg} +\Configure{Picture}{.png} +\Configure{PicDisplay} + {\edef\MathPar{\ifvmode par-\fi}\IgnorePar\endgraf\EndP + \HCode{<div class="\MathPar math-display">}} + {\HCode{</div>}} {} {class="\MathPar math-display" } +\Configure{()}{$}{$} +\fi +\:CheckOption{kindle} \if:Option +\Configure{Picture}{.png} +\fi + +%% +% We must test, it tableofcontents is empty, if yes, we must take special care to navmap +\newbool{tocnoempty} + +\newcount\navpoint +\def\stepnavpoint{\advance\navpoint by1\relax\the\navpoint} + +% define points for breaking section units to html pages +% we need to break long documents to smaller chunks, because e-readers are +% generally pretty weak devices +% use no-cut option if you don't want to break sections, or if you +% use your own cutting scheme in your .cfg file +\:CheckOption{no-cut}\if:Option\else +\ifdef\chapter{% + %\CutAt{chapter}\CutAt{likechapter} + % copied from tex4ht-html4.tex + \CutAt{part,appendix} + \CutAt{chapter,likechapter,appendix,part} + \CutAt{likechapter,appendix,part} + \CutAt{appendix,chapter,likechapter,part} +}{% + %\CutAt{section}\CutAt{likesection}} + \CutAt{section,likesection,part} + \CutAt{likesection,part} + +} +\fi + +% Commands for support of hiearchical table of contents +% Support for: chapter, section, subsection + +\def\resettoclevels#1{% + \def\do##1{\csgdef{nav##1finish}{}} + \docsvlist{#1} +} +\def\usetoclevels#1{% + \def\do##1{\csuse{nav##1finish}}% + \docsvlist{#1}% +} +\def\finishtoclevel#1{% + \csgdef{nav#1finish}{\d:NavSection} +} + +\def\closelevels#1{ + \expandafter\usetoclevels\expandafter{#1} + \expandafter\resettoclevels\expandafter{#1} +} +% 1 - section type 2 - closed sections + +\def\navsection#1#2{ + \ConfigureToc{#1}% + {\expandafter\closelevels\expandafter{#2} + \a:NavSection\Ncx:Mark} + {\c:NavSection} + {} + {\b:NavSection% + \expandafter\finishtoclevel\expandafter{#1}% + } +} + +% define closing groups for all levels defined in \Configure{resettoclevels} + +\def\tmp:processlevel#1{ + \bgroup + \csxdef{tmp:resettoclevels#1}{} + \def\do##1{\csxdef{tmp:resettoclevels#1}{\csname tmp:resettoclevels#1\endcsname ##1,like##1,}} + \def\tmp:parse##1#1##2\nil{ + \docsvlist{#1##2} + } + \expandafter\tmp:parse\a:resettoclevels\nil + \egroup + \navsection{#1}{\csname tmp:resettoclevels#1\endcsname} + % define hierarchy also for starred sections + \navsection{like#1}{\csname tmp:resettoclevels#1\endcsname} +} + +% define children levels for each sectioning level +\def\confnavsections{% + \def\do##1{% + \tmp:processlevel{##1}% + } + \expandafter\docsvlist\expandafter{\a:resettoclevels} +} +% As reported by Nat Kuhn on http://tex.stackexchange.com/q/209312/2891 +% zeroes were printed as section numbers when secnumdepth counter was set to negative value +% so just strip then out +% \TitleMark does similar thing, but this solution is simpler, I hope it works correctly +\def\Ncx:Mark#1{% + \edef\:temp{#1} + \def\z@ro{0} + \ifx\:temp\z@ro\else#1\fi +} + + +% +\def\ncx:head{% +\HCode{<head>\Hnewline} +\HCode{<meta name="dtb:uid" content="\a:UniqueIdentifier"/>\Hnewline} +\HCode{<meta name="dtb:depth" content="3"/>\Hnewline} +\HCode{<meta name="dtb:totalPageCount" content="0"/>\Hnewline} +\HCode{<meta name="dtb:maxPageNumber" content="0"/>\Hnewline} +\HCode{</head>\Hnewline} +} + +\def\ncx:title{% + \HCode{<docTitle>\Hnewline<text>}\Title\HCode{</text>\Hnewline</docTitle>\Hnewline} +} + +% Get filename from tableofcontents anchor +\def\ncx:hfile#1{\Ref{)F\Ref{)Q#1}F-}} + +% define toc levels which should be included in the NCX file +\NewConfigure{resettoclevels}{1} +\Configure{resettoclevels}{part,appendix,chapter,appendixsec,section,appendixsubsec,subsection,appendixsubsubsec,subsubsection,paragraph} + +\def\:tempa{% +\EndP +\HtmlParOff +\setcounter{tocdepth}{3} +\special{t4ht>\jobname.ncx} +% We don't want crosslinks in xml +% Basic sctructure of the ncx file +\NoFonts +{\HCode{<?xml version="1.0" encoding="utf-8"?>\Hnewline}} +{\a:NcxDoctype} +{\Tg<ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">}{} +% To print document map, we customize the tableofcontents. We don't want TOC title, +% so: +\let\contentsname=\empty +\Configure{tableofcontents}{\boolfalse{tocnoempty}\Tg<navMap>}{% + \usetoclevels{part,appendix,chapter,likechapter,appendixsec,section,likesection,subsection,appendixsubsec,likesubsection,subsubsection,likesubsubsection,appendixsubsubsec,subsubsubsection,paragraph}% + \ifbool{tocnoempty}{}% + {\HCode{<navPoint id="mainentry" playOrder="1"> + <navLabel><text>Document</text></navLabel> + <content src="\jobname.\:html" /> + </navPoint>}}% + \Tg</navMap>}{}{}{} + % We need to configure TocLink + % in navmapsrc is link to the file and anchor, where chapter or section is located + \def\navmapsrc{} + \Configure{TocLink}{\def\navmapsrc{\ncx:hfile{##2}\:sharp ##2}\opf:registerfilename{\ncx:hfile{##2}}##4} + % Configuraion of entries + \expandafter\resettoclevels\expandafter{\a:resettoclevels}% + \confnavsections% + \HtmlParOff% + \Configure{toTocLink}{}{}% + \Configure{NavSection}{\booltrue{tocnoempty}\HCode{\Hnewline<navPoint id="navPoint-}% + \stepnavpoint\HCode{" playOrder="}% + \the\navpoint\HCode{">\Hnewline<navLabel>\Hnewline<text>}% +}{\HCode{</text>\Hnewline% + </navLabel>\Hnewline}% + \HCode{<content src="\navmapsrc" />}% +}{ }{\HCode{</navPoint>\Hnewline}} +% Meta inf +\ncx:head +% Book title +\ncx:title +\tableofcontents%[part,chapter,likechapter,section,likesection,subsection,likesubsection]% +%Hack to get close tag working +\HCode{</ncx>} +\EndNoFonts +\special{t4ht<\jobname.ncx} + \HtmlParOn +} +\let\ncxtable\:tempa +%\else +%\fi + +\def\print:opf:scheme#1{ opf:scheme="#1"} +\def\:tempa{% +\bgroup +\setcounter{tocdepth}{3} +% Basic sctructure of the opf file +\special{t4ht>content.opf} +\NoFonts +\HtmlParOff +{\HCode{<?xml version="1.0" encoding="utf-8"?>\Hnewline}} +\HCode{<package xmlns="http://www.idpf.org/2007/opf" unique-identifier="dcidid" + version="\a:EpubVersion">\Hnewline} +{\HCode{<metadata\Hnewline xmlns:dc="http://purl.org/dc/elements/1.1/"\Hnewline xmlns:opf="http://www.idpf.org/2007/opf">\Hnewline}} +{\HCode{<dc:title>}\Title\HCode{</dc:title>\Hnewline}} +{\HCode{<dc:language>}\GetLanguage\HCode{</dc:language>\Hnewline}} +%Add interface for such things +{\HCode{<dc:identifier id="dcidid" \print:opf:scheme\a:OpfScheme>\a:UniqueIdentifier}\HCode{</dc:identifier>\Hnewline}} +\def\and{\HCode{</dc:creator>\Hnewline<dc:creator>}} +{\HCode{<dc:creator>}{\a:@author\Author}\HCode{</dc:creator>\Hnewline}} +%{\HCode{<dc:contributor>\HP:file</dc:contributor>\Hnewline}} +{\HCode{<dc:date>}\:iso:date\HCode{</dc:date>}} +\a:OpfMetadata +\Tg</metadata> +% To print document map, we customize the tableofcontents. We don't want TOC title, +% so: +\let\contentsname=\empty +%\Configure{tableofcontents}{\Tg<navMap>}{\usetoclevels{part,chapter,section,subsection,subsubsection}\Tg</navMap>}{}{}{} +% We need to configure TocLink +% in navmapsrc is link to the file and anchor, where chapter or section is located +\def\navmapsrc{} +\HCode{\Hnewline<manifest>\Hnewline} +\HCode{<item id="ncx" href="\jobname.ncx" media-type="application/x-dtbncx+xml" />\Hnewline} +\HCode{<item id="stylesheet" href="\jobname.css" media-type="text/css"/>\Hnewline} +\renewcommand\do[1]{\HCode{<item id="\csuse{opf:entry##1}" \opf:properties{##1} href="##1" media-type="application/xhtml+xml" />\Hnewline}} +\expandafter\docsvlist\expandafter{\opf:htmlfiles} +\a:OpfManifest +%\Tg<manifest> +\special{t4ht<content.opf} +\special{t4ht>content-part2.opf} +\HCode{</manifest>\Hnewline} +\renewcommand\do[1]{\HCode{<itemref idref="\csuse{opf:entry##1}" />\Hnewline}} +\HCode{\Hnewline<spine toc="ncx">\Hnewline} +\expandafter\docsvlist\expandafter{\opf:htmlfiles} +% Next line is pattern to be replaced by lua code +\HCode{\Hnewline$\string{spine\string}\Hnewline} +\HCode{</spine>\Hnewline} +% insert guide +\opf:guide +\HCode{</guide>} +% Hack to get close tag working +\HCode{</package>} +\special{t4ht<content-part2.opf} +\HtmlParOn +\EndNoFonts +\egroup +%Hack!! +%\Configure{BODY}{}{\Tg</body>} +%\Configure{HTML}{}{\HCode{\Hnewline</html>\Hnewline}}%<!-- -->\Hnewline}} +} +\let\opftable\:tempa + +\:CheckOption{epub3} +\if:Option +\input tex4ebook-epub3.4ht +\fi |