diff options
Diffstat (limited to 'Master/texmf-dist/source/latex/threadcol/threadcol.dtx')
-rw-r--r-- | Master/texmf-dist/source/latex/threadcol/threadcol.dtx | 489 |
1 files changed, 489 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/threadcol/threadcol.dtx b/Master/texmf-dist/source/latex/threadcol/threadcol.dtx new file mode 100644 index 00000000000..7b257d368b7 --- /dev/null +++ b/Master/texmf-dist/source/latex/threadcol/threadcol.dtx @@ -0,0 +1,489 @@ +% \iffalse meta-comment +% +% Copyright (C) 2013 by Scott Pakin <scott+thrcl@pakin.org> +% ------------------------------------------------------- +% +% This file may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3c +% of this license or (at your option) any later version. +% The latest version of this license is in: +% +% http://www.latex-project.org/lppl.txt +% +% and version 1.3c or later is part of all distributions of LaTeX +% version 2008/05/04 or later. +% +% \fi +% +% \iffalse +%<*driver> +\ProvidesFile{threadcol.dtx} +%</driver> +%<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01] +%<package>\ProvidesPackage{threadcol} +%<*package> + [2013/01/06 v1.0 Convert columns to PDF article threads] +%</package> +% +%<*driver> +\documentclass{ltxdoc} +\usepackage{threadcol} +\usepackage{graphicx} +\usepackage{hyperref} +\EnableCrossrefs +\CodelineIndex +\RecordChanges +\setthreadname{User documentation} +\begin{document} + \sloppy + \DocInput{threadcol.dtx} + \setthreadname{Developer documentation} +% \PrintChanges + \setthreadname{} + \makeatletter + \let\orig@index@prologue=\index@prologue + \def\index@prologue{% + \phantomsection\addcontentsline{toc}{section}{Index} + \orig@index@prologue + }% + \makeatother + \PrintIndex +\end{document} +%</driver> +% \fi +% +% \CheckSum{119} +% +% \CharacterTable +% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +% Digits \0\1\2\3\4\5\6\7\8\9 +% Exclamation \! Double quote \" Hash (number) \# +% Dollar \$ Percent \% Ampersand \& +% Acute accent \' Left paren \( Right paren \) +% Asterisk \* Plus \+ Comma \, +% Minus \- Point \. Solidus \/ +% Colon \: Semicolon \; Less than \< +% Equals \= Greater than \> Question mark \? +% Commercial at \@ Left bracket \[ Backslash \\ +% Right bracket \] Circumflex \^ Underscore \_ +% Grave accent \` Left brace \{ Vertical bar \| +% Right brace \} Tilde \~} +% +% +% \changes{v1.0}{2013/01/06}{Initial version} +% +% \GetFileInfo{threadcol.dtx} +% +% \DoNotIndex{\@empty,\box,\copy,\def,\else,\fi,\gdef,\global} +% \DoNotIndex{\hss,\ifx,\let} +% \DoNotIndex{\MessageBreak,\newcommand,\protect} +% \DoNotIndex{\setbox,\space,\vbox} +% +% ^^A Define a few helper commands. +% \DeclareRobustCommand{\pkgname}[1]{\mbox{\textsf{#1}}\SortIndex{#1}{\textsf{#1}}} +% \DeclareRobustCommand{\acro}[1]{\textsc{\MakeLowercase{#1}}} +% \DeclareRobustCommand{\menu}[1]{\textit{#1}~$\to$ } +% \DeclareRobustCommand{\menuentry}[1]{\textit{#1}} +% \makeatletter +% \DeclareRobustCommand{\panel}[1]{\textit{#1}} +% \DeclareRobustCommand{\kbd}[1]{\textit{#1}} +% \DeclareRobustCommand{\AAR}{Adobe Acrobat\slash Reader} +% +% ^^A Specify this document's metadata. +% \title{The \textsf{threadcol} package\thanks{This document +% corresponds to \textsf{threadcol}~\fileversion, dated \filedate.}} +% \author{Scott Pakin \\ \texttt{scott+thrcl@pakin.org}} +% \hypersetup{^^A +% pdftitle={The threadcol package}, +% pdfauthor={Scott Pakin}, +% pdfsubject={Organize document columns into PDF "article threads"}, +% pdfkeywords={LaTeX, PDF, article threads, beads, automatic column scrolling} +% } +% +% \maketitle +% +% \section{Introduction} +% \label{sec:introduction} +% +% Consider the following situation: You have a two-column \acro{PDF} +% file that you want to read on your computer (or tablet or whatever). +% Because you have a relatively small screen---and/or less-than-perfect +% eyesight---you zoom in to more easily read the text. You read the +% first column of the first page, then scroll back to the top of the +% page and over to the right to read the second column, then scroll left +% to read the first column of the second page, then scroll up and over +% to read the second column, and so forth. With all this distracting +% scrolling, it's easy to lose track of where you were or what you were +% reading. +% +% The \pkgname{threadcol} package helps you avoid this situation for the +% \LaTeX\ documents you create. It puts every column into a \acro{PDF} +% ``article thread''. A user can then opt to have his \acro{PDF} reader +% automatically scroll through the document in proper reading order. In +% \AAR\ this is accomplished simply by clicking any place in the +% document window where the mouse pointer is shown as a hand with an +% arrow in it. The user can scroll forward by clicking in the document +% window or pressing \kbd{Enter} and backward by shift-clicking or +% pressing \kbd{Shift}+\kbd{Enter}. See the \AAR\ \menuentry{Help} +% documents for more information. +% +% \AAR\ provide an \Acrobatmenu{ArticleThreads}{Articles navigation +% panel} that lists all of the document's article threads and lets the +% user jump to a specified thread. Figure~\ref{fig:articles-ar9} shows +% what the \panel{Articles} panel looks like in Adobe Reader~9 on Linux. +% The panel may have to be displayed explicitly by the user. This can +% be done by right-clicking on the navigation-panel button list and +% selecting \menuentry{Articles}. Alternatively, in \AAR~9, one can +% also follow the \menu{View}\menu{Navigation +% Panels}\menuentry{Articles} menu path or in \AAR~X and~XI the +% \menu{View}\menu{Show/Hide}\menu{Navigation +% Panels}\menuentry{Articles} menu path. If \panel{Articles} appears +% as a pop-up, it can be docked simply by dragging the tab to the +% navigation panel. +% +% \begin{figure}[htbp] +% \centering +% \includegraphics[width=\linewidth]{articles-ar9} +% \caption{The \panel{Articles} button and navigation panel in Adobe Reader~9} +% \label{fig:articles-ar9} +% \end{figure} +% +% I don't know if any \acro{PDF} readers other than Adobe's provide +% special viewing of threads. +% +% \bigskip +% +% Although \pkgname{threadcol} is most beneficial to two-column +% documents, it nevertheless also works with single-column +% documents---and even documents that switch between the two using +% |\onecolumn| and |\twocolumn|. In fact, although it is typeset in a +% single column, this document is itself threaded using +% \pkgname{threadcol}. Section~\ref{sec:implementation}, which presents +% the commented \pkgname{threadcol} source code, lies in a thread +% entitled, ``Developer documentation''. +% Sections~\ref{sec:introduction}--\ref{sec:limitations} +% and~\ref{sec:future-work} lie in a thread entitled, ``User +% documentation''. What this structure implies is that you can +% double-click ``User documentation'' in the +% \Acrobatmenu{ArticleThreads}{Articles navigation panel} then +% repeatedly click (or press \kbd{Enter}) on the document's text to read +% all of the user documentation while automatically skipping the +% developer documentation. Likewise, double-clicking on ``Developer +% documentation'' takes you right to that, bypassing all of the user +% documentation. +% +% Indexes are not normally read from start to finish so this document's +% index is omitted from both the ``User documentation'' and ``Developer +% documentation'' threads. +% +% +% \section{Usage} +% \label{sec:usage} +% +% One of the \pkgname{threadcol} package's goals is simplicity. All you +% have to do is include a +% \begin{verbatim} + \usepackage{threadcol} +% \end{verbatim} +% \unskip\noindent +% in your document's preamble for \pkgname{threadcol} to do its work. +% +% \bigskip +% +% \DescribeMacro{\setthreadname} +% One bit of customization that \pkgname{threadcol} does provide, +% however, is control over the name of the article thread. By default, +% this is ``Entire document''. However, if you prefer a different name, +% you can write |\setthreadname{|\meta{name}|}| to change the name of +% the article thread to \meta{name}. It is in fact permissible to +% invoke |\setthreadname| multiple times and with different names. In +% this case, \pkgname{threadcol} produces one thread per unique name. +% For example, the document shown in Figure~\ref{fig:articles-ar9} used +% two threads in the following manner: +% +% \bigskip +% \begingroup +% \obeylines +% |\setthreadname{Some thread}| +% \meta{Text for the first thread} +% |\setthreadname{Another thread}| +% \meta{Text for the second thread} +% |\setthreadname{Some thread}| +% \meta{More text for the first thread} +% \endgroup +% \bigskip +% +% \noindent +% When the user clicks on the ``Some thread'' thread, navigation +% automatically bypasses all text in the ``Another thread'' thread and +% vice versa. One caveat is that in the current version of +% \pkgname{threadcol}, |\setthreadname| issues a |\clearpage| command to +% ensure that text is assigned to the correct thread. Hence, +% \pkgname{threadcol} cannot currently be used for sophisticated +% magazine- or newspaper-style documents with intertwined threads +% weaving through the pages. Still, it may be useful for coarsely +% divided units of text. +% +% As a special case, specifying an empty thread name +% (i.e.,~|\setthreadname{}|) stops adding text to threads. This can be +% useful for a document's front matter and back matter, which may not +% belong in any thread's normal reading order. +% +% +% \section{Limitations} +% \label{sec:limitations} +% +% \pkgname{threadcol} is a fairly simple package. As such, it has a +% number of limitations, including the following: +% +% \begin{enumerate} +% \item \pkgname{threadcol} requires pdf\LaTeX\ or Lua\LaTeX; it does +% nothing when used with ordinary \LaTeX\ or +% X\lower0.5ex\hbox{\kern-.15em\reflectbox{E}}\kern-0.1667em\LaTeX\@. +% The package also relies on \pkgname{etoolbox}, which requires +% \mbox{$\varepsilon$-\TeX} support, but this is provided by all +% modern \TeX\ distributions. +% +% \item \pkgname{threadcol} is incompatible with the +% \pkgname{fixltx2e} and \pkgname{cuted} packages. These packages +% redefine \LaTeX's text-output routines in a manner that confuses +% \pkgname{threadcol}. +% +% \item Marginal notes (|\marginpar|) are not included in threads. +% The same is true for text that sticks out into the margin +% (e.g.,~using |\llap| or |\rlap|), such as the macro names in +% Section~\ref{sec:implementation}. +% +% \item As mentioned in Section~\ref{sec:usage}, threads currently +% must begin on their own page. Hence, |\setthreadname| forces a +% page break, which is often undesirable. +% +% \item \pkgname{threadcol} does not recognize columns created using +% the |multicols| environment from the \pkgname{multicol} package. +% These appear to \pkgname{threadcol} as a single column. +% +% \item No attempt is made to preserve proper reading order beyond +% page and column order. For example, if a page ends with the first +% part of a sentence and the next page begins with a top float, the +% thread will present the text in that same order: the first part of +% the sentence, then the float, then the second part of the +% sentence. Even worse, \pkgname{threadcol} is oblivious to +% footnotes that span columns; it will show the first column of +% text, including the first part of a long footnote, then the second +% column of text, which ends with the second part of the long +% footnote. +% +% \item The package has not been tested thoroughly. Consequently, +% there are probably many more limitations than those listed above. +% \end{enumerate} +% +% +% \StopEventually{^^A +% +% \setthreadname{User documentation} +% +% \section{Future work} +% \label{sec:future-work} +% +% A future version of \pkgname{threadcol} may address some of the +% limitations described in Section~\ref{sec:limitations}. In addition, +% it would great if the package could integrate seamlessly with the +% \pkgname{flowfram} package, where \acro{PDF} article threads would +% make a lot of sense. +% +% One far more difficult change to implement would be to make +% \pkgname{threadcol} cognizant of the ``true'' reading order, perhaps +% with help from the author. For example, the author could specify the +% point at which the thread should jump to a floating figure before +% jumping back to the corresponding text. +% +% In practice, \LaTeXe's output routines can be quite arcane, especially +% with regards to the handling of inserts (e.g.,~floats and footnotes). +% Getting \pkgname{threadcol} to do more than what it currently does is +% likely beyond my current level of \LaTeX\ expertise. +% +% } +% +% \setthreadname{Developer documentation} +% +% \section{Implementation} +% \label{sec:implementation} +% +% This section is intended for developers and advanced users to learn +% how \pkgname{threadcol} is implemented. Most readers can ignore this +% section. +% +% \bigskip +% +% We begin by loading a few helper packages upon which we rely: +% \pkgname{ifpdf} to ensure that we have access to |\pdfstartthread| and +% |\pdfendthread| and \pkgname{etoolbox} for the |\patchcmd| macro. +% \begin{macrocode} +\RequirePackage{ifpdf} +\RequirePackage{etoolbox} +% \end{macrocode} +% +% \begin{macro}{\thrcl@thread@name} +% Define the name of the current thread. This is what shows up in the +% \Acrobatmenu{ArticleThreads}{\panel{Articles} navigation panel} in +% Adobe Acrobat and Adobe Reader. +% \begin{macrocode} +\def\thrcl@thread@name{Entire document} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\setthreadname} +% Let the author change the name of the current thread +% (i.e.,~|\thrcl@thread@name|). The starred version suppresses the +% |\clearpage|. +% \begin{macrocode} +\newcommand*{\setthreadname}{% + \@ifstar{\gdef\thrcl@thread@name}{\clearpage\gdef\thrcl@thread@name}% +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thrcl@threaded@box} +% This is a copy of the column box but surrounded by |\pdfstartthread| +% and |\pdfendthread|. +% \begin{macrocode} +\newbox\thrcl@threaded@box +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thrcl@box} +% Mimic \TeX's |\box| primitive but wrap the given box within a +% |\pdfstartthread| and |\pdfendthread|. If |\thrcl@thread@name| is +% empty, however, invoke |\box| directly. +% \begin{macrocode} +\def\thrcl@box#1{% + \ifx\thrcl@thread@name\@empty + \box#1 + \else + \setbox\thrcl@threaded@box=\vbox{% + \pdfstartthread name {\thrcl@thread@name}% + \copy#1 + \pdfendthread + }% + \box\thrcl@threaded@box + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thrcl@orig@outputpage} +% We want |\thrcl@outputdblcol| to use the original |\@outputpage| but +% all other invocations to use our modified |\@outputpage|. +% \begin{macrocode} +\let\thrcl@orig@outputpage=\@outputpage +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thrcl@patchcmd} +% Wrap \pkgname{etoolbox}'s 5-argument |\patchcmd| with a 3-argument +% version that uses hard-wired success and failure operations. The +% whole command is executed only if all of the previous +% |\thrcl@patchcmd| commands succeeded. +% \begin{macrocode} +\def\thrcl@patchcmd#1#2#3{% + \ifx\thrcl@patches@succeeded Y + \patchcmd{#1}{#2}{#3}{}{\let\thrcl@patches@succeeded=N}% + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\thrcl@outputdblcol} +% \begin{macro}{\thrcl@outputpage} +% \begin{macro}{\thrcl@comdblflelt} +% \begin{macro}{\thrcl@patches@succeeded} +% Replace |\box| with |\thrcl@box| in \LaTeXe's |\@outputdblcol| and +% |\@outputpage| macros, which are used to output a column in, +% respectively, a two-column document or a one-column document. To +% avoid nesting of |\pdfstartthread|\dots\linebreak[0]|\pdfendthread|, +% we replace calls to |\@outputpage| with calls to +% |\thrcl@orig@outputpage| in |\@outputdblcol|. +% +% Because there we need to apply multiple patches, we attempt to patch +% copies of |\@outputdblcol|, |\@outputpage|, and |\@comdblflelt| and +% replace the originals only if all changes are successful. We store +% ``|Y|'' in |\thrcl@patches@succeeded| if this is the case, +% otherwise~``|N|''. +% \begin{macrocode} +\let\thrcl@outputdblcol=\@outputdblcol +\let\thrcl@outputpage=\@outputpage +\let\thrcl@comdblflelt=\@comdblflelt +\let\thrcl@patches@succeeded=Y +\ifpdf +% \end{macrocode} +% We're in \acro{PDF}-generating mode. Apply all of our patches. +% \begin{macrocode} + \thrcl@patchcmd + {\thrcl@outputdblcol}% + {\box\@leftcolumn\hss}% + {\thrcl@box\@leftcolumn\hss}% + \thrcl@patchcmd + {\thrcl@outputdblcol}% + {\box\@outputbox\hss}% + {\thrcl@box\@outputbox\hss}% + \thrcl@patchcmd + {\thrcl@outputdblcol}% + {\@outputpage}% + {\thrcl@orig@outputpage}% + \thrcl@patchcmd + {\thrcl@outputdblcol}% + {\@outputpage}% + {\thrcl@orig@outputpage}% + \thrcl@patchcmd + {\thrcl@outputpage}% + {\box\@outputbox}% + {\thrcl@box\@outputbox}% + \thrcl@patchcmd + {\thrcl@comdblflelt}% + {\box}% + {\thrcl@box}% + \ifx\thrcl@patches@succeeded Y +% \end{macrocode} +% All of our patches succeeded. We can finally redefine +% |\@outputdblcol|, |\@outputpage|, and |\@comdblflelt| for real. +% \begin{macrocode} + \global\let\@outputdblcol=\thrcl@outputdblcol + \global\let\@outputpage=\thrcl@outputpage + \global\let\@comdblflelt=\thrcl@comdblflelt + \else +% \end{macrocode} +% Issue a warning message if any patch failed. This should happen only +% if a class or package redefines |\@outputdblcol|, |\@outputpage|, or +% |\@comdblflelt| in a manner incompatible with \LaTeXe's default +% definition. +% \begin{macrocode} + \PackageError{threadcol}{Failed to patch the output routine}{% + The threadcol package needs to modify LaTeX's + \protect\@outputdblcol\space macro to\MessageBreak + incorporate support for PDF article threads. These + modifications failed,\MessageBreak + presumably due to a class or package that redefined + \protect\@outputdblcol\space in a\MessageBreak + form incompatible with what threadcol expects.% + }% + \fi +\else +% \end{macrocode} +% We're not in \acro{PDF}-generating mode. Warn the author that +% the package will do nothing. +% \begin{macrocode} + \PackageWarningNoLine{threadcol}{% + This package has an effect only when running\MessageBreak + pdfLaTeX or LuaLaTeX and only when in\MessageBreak + PDF-generating mode% + }% +\fi +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \Finale +\endinput |