Я думал об экспериментальном макете электронной книги, который бы использовал встроенныепрокручиваемые текстовые полядля того, что по сути будет функционировать как очень длинные сноски на полях или примечания по отношению к основному тексту.
Например, представьте себе страницу, разделенную на две колонки: основной текст слева и два текстовых поля одинаковой высоты справа (в каждом из которых находится фрагмент текста, который читатель может прокручивать и читать по своему усмотрению).
Можно ли создать электронный документ какого-либо рода с использованием 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"
Вы можете увидеть результатздесь
Хорошо то, что нажатие на номер сноски приведет к прокрутке к соответствующему тексту сноски.