我正在考虑一个实验性的电子书布局,使用嵌入式滚动文本框其本质上起到与正文相关的非常长的边注或脚注的作用。
举例来说,假设一个页面分成两列,左边是正文,右边是两个高度相等的文本框(每个文本框中都有一堆文本,读者可以根据需要滚动阅读)。
是否可以使用 LaTeX 创建某种可以这样运行的电子文档?也许可以导出到HTML
(可能使用一些 HTML 特定命令latex2html
?)然后将其转换为功能齐全的电子书?有没有办法不用 来做到这一点HTML
?
我意识到这可能是一个平凡的问题,但我从未将 LaTeX 与 结合使用过HTML
,甚至不知道它在任何情况下是否适合用来HTML
编写电子书。
无论如何,有什么想法吗?
答案1
更新 更灵活的版本
OP 想要一个包含各种数量滚动框的解决方案。我的想法是提供命令来声明新LaTeX
框,然后可以向其中添加一些材料。因此文档可以如下所示:
\documentclass{article}
\usepackage{lipsum}
\usepackage{infoboxes}
\newinfobox{dialogues}
\newinfobox{second}
\begin{document}
Some text, blah blah\footnote{hello} bla bla\footnote{\lipsum[2]}
\lipsum[2-8]
\addtoinfobox{dialogues}{Hello \emph{world}}
\addtoinfobox{dialogues}{Another line}
\addtoinfobox{second}{\lipsum[3-9]}
Another text\footnote{world}. %And now some\marginpar{Margin note. \lipsum[3-4]}
\end{document}
使用两个滚动(信息)框dialogues
和second
。任何材料都可以用宏添加\addtoinfobox
。我认为一个好主意是创建一些宏来隐藏此接口,并且\addtoinfobox
只在tex4ht
运行时调用,否则将信息直接打印到文本或边注中。
包裹infoboxes.sty
\ProvidesPackage{infoboxes}
\RequirePackage{etoolbox}
\newcounter{infoboxescnt}
\newcounter{tempinfbx}
\newcommand\newinfobox[1]{%
\stepcounter{infoboxescnt}
\expandafter\newbox\csname #1infobx\endcsname
\listcsgadd{@usedinfboxes}{#1}
}
\newcommand\addtoinfobox[2]{%
\global\expandafter\setbox\csname #1infobx\endcsname=\vtop\bgroup
\expandafter\ifvoid\csname #1infobx\endcsname%
\else\expandafter\unvbox\csname #1infobx\endcsname\fi#2\egroup
}
\newcommand\a@prntfbx[1]{}
\newcommand\b@prntfbx[1]{}
\newcommand\printinfobox[1]{\a@prntfbx{#1}\expandafter\copy\csname #1infobx\endcsname\b@prntfbx{#1}}
\newcommand\printinfoboxes{%
\setcounter{tempinfbx}{0}
\renewcommand\do[1]{%
\typeout{Print info box: ##1}
\stepcounter{tempinfbx}
\printinfobox{##1}
}
\dolistcsloop{@usedinfboxes}
%\forcsvlist{\if\relax\detokenize{##1}\relax Prazdny\else##1\fi}{\@usedinfboxes}
}
\endinput
和包装tex4ht
,infoboxes.4ht
\def\LeavePar{\ifvmode\IgnorePar\fi \EndP}
\NewConfigure{printinfobox}{2}
\renewcommand\a@prntfbx[1]{\def\:bxname{#1}\a:printinfobox}
\renewcommand\b@prntfbx[1]{\b:printinfobox}
\Configure{printinfobox}{\IgnorePar\HCode{
<div class="infobox \:bxname">\Hnewline}\ShowPar}{\EndP\HCode{</div>}}
\let\tmp:prtfbxs\printinfoboxes
\renewcommand\printinfoboxes{}
\NewConfigure{printinfoboxes}{2}
\newcommand\mathexpression[1]{
\strip@pt\dimexpr #1\relax
}
\newcommand\my:prntnfbxs{%
\setcounter{tempinfbx}{0}
\renewcommand\do[1]{%
\printinfobox{##1}\relax
\Css{%
.##1{margin-left:66\%;
height:\mathexpression{1pt / \value{infoboxescnt} * 100}\%;
top:\mathexpression{\value{tempinfbx}pt * 1 / \value{infoboxescnt} * 100}\%;
}
}
\stepcounter{tempinfbx}
}
\dolistcsloop{@usedinfboxes}
}
\Configure{@BODY}
{\LeavePar
\HCode{<article>\Hnewline}\par\ShowPar%
}
\Configure{@/BODY}
{\LeavePar
\HCode{</article>\Hnewline}
\par\ShowPar
\my:prntnfbxs
}
\Css{article,.infobox{margin:0;padding:0;}}
\Css{
article,.footnotes{width:66\%;}
}
\Css{
.infobox{
width:33\%;
float:right;
margin-left:66\%;
position:fixed;
overflow:scroll;
}
}
有趣的是
\renewcommand\do[1]{%
\printinfobox{##1}\relax
\Css{%
.##1{margin-left:66\%;
height:\mathexpression{1pt / \value{infoboxescnt} * 100}\%;
top:\mathexpression{\value{tempinfbx}pt * 1 / \value{infoboxescnt} * 100}\%;
}
}
\stepcounter{tempinfbx}
}
循环打印所有信息框,并为每个信息框添加css
声明,其中包含根据信息框计数计算的位置和高度信息。
使用以下方式编译
htlatex sample "xhtml, fn-in"
你可以看到结果
原始答案
我认为这不是一个好主意。电子书通常是在小屏幕设备上阅读的,其中整个区域都充满了主要内容。脚注或旁注通常放在独立文件中,并带有指向它们的文本链接,或者直接放在它们出现的段落之后,就像这样epub3 示例. 还存在一个问题,即一些电子书设备没有触摸界面,这种盒子将无法使用。
但是,如果您真的想制作这样的框,当然可以。使用tex4ht
,您可以选择将所有脚注放入正文下方的框中。使用几行css
,您可以将此框转换为位于页面固定位置的滚动框。
示例文件sample.tex
:
\documentclass{article}
\usepackage{lipsum}
\begin{document}
Some text, blah blah\footnote{hello} bla bla\footnote{\lipsum[2]}
\lipsum[2-8]
Another text\footnote{world}
\end{document}
带有 css 指令的配置文件scroll.cfg
:
\Preamble{xhtml}
\begin{document}
\Css{
body{
width:35em;
margin-left:auto;
margin-right:auto;
}
}
\Css{
.footnotes{
float:right;
width:10em;
height:10em;
overflow:scroll;
margin-left:42em;
position:fixed;
top:0;
}
}
\EndPreamble
编译
htlatex sample "scroll, fn-in"
你可以看到结果这里
好消息是,单击脚注编号将滚动到相应的脚注文本。