% \iffalse
% $Id: issuulinks.dtx,v 1.6 2012-03-22 22:54:19 boris Exp $
%
% Copyright 2012, Boris Veytsman <borisv@lk.net>
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
% version 1.3 of this license or (at your option) any 
% later version.
% The latest version of the license is in
%    http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of
% LaTeX version 2003/06/01 or later.
%
% This work has the LPPL maintenance status `maintained'.
%
% The Current Maintainer of this work is Boris Veytsman
%
% This work consists of the file issuulinks.dtx and the
% derived files issuulinks.sty, issuulinks.dtx. 
%
% \fi 
% \CheckSum{106}
%
%
%% \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         \~} 
%
% \MakeShortVerb{|}
%
%\GetFileInfo{issuulinks.dtx}
% \title{Produce External Links Instead of Internal
% Ones\thanks{\copyright Boris Veytsman, 2012}}  
% \author{Boris Veytsman\thanks{This work was partially supported by
% The Food and Agriculture Organization of the United Nations}}
% \date{\filedate, \fileversion}
% \maketitle
%
% \begin{abstract}
%   A package to change automatic internal links in a document into
%   external ones in the form
%   \path{http://issue.com/action/page=PAGENUMBER} as required by
%   \url{http://issuu.com}.
% \end{abstract}
%
% \tableofcontents
%
% \clearpage
%
%\section{Introduction}
%\label{sec:intro}
%
% PDF visualizer ISSUU (\url{http://issuu.com}) is a popular service
% allowing to show PDF documents ``one page a time''.  Due to the way
% it is implemented, internal links in these documents are not
% allowed.  Instead, they must be converted to external ones in the
% form \path{http://issuu.com/action/page?page=PAGENUMBER}.  
%
% This package patches \textsf{hyperref} to produce external links in
% the required form instead of internal links created by |\ref|,
% |\cite| and other commands.
%
% Since the package redefines the internals of \textsf{hyperref}, you
% need to call it \emph{after} \textsf{hyperref}.
% 
% The author is grateful to FAO UN which partially funded this work
% and to Matthieu Stigler, Adam Prakash \& Filippo Gheri for
% suggesting and testing this package.
% 
%\section{Usage}
%\label{sec:usage}
%
%  To use this package just add |\usepackage{issuulinks}| \emph{after}
%  calling \textsf{hyperref}.  By default all links will be converted
%  into the form required by ISSUU.
%
% \DescribeMacro{\issuusetup}
% The command |\issuusetup|\marg{setup commands} might be used to
% customize the behavior of the package.  At present the only
% customizable command is |prefix|, that sets the part of the link
% before |PAGENUMBER|by default 
% |http://issuu.com/action/page?page=|.  You can change it, for example,
% \begin{verbatim}
% \issuusetup{prefix={http://www.issuu.com/action/page?page=}}
% \end{verbatim}
%
% Otherwise the work of the package should be transparent for the
% user.   
%
%\StopEventually{}
%
% \clearpage
% 
% \section{Implementation}
% \label{sec:implementation}
% 
%
%\subsection{Algorithm}
%\label{sec:alg}
%
% The idea is following.  Whenever \textsf{hyperref} creates an
% internal anchor \marg{name}, we write to the aux file the command
% \cmd{\newISSUUlink}\marg{name}\marg{abspage}, where \marg{abspage}
% is the absolute page number (as different from the displayed page
% number).  Then when \textsf{hyperref} creates an internal link to
% \marg{name}, we substitute this to a call to \url{http://issuu.com}
% with the corresponding page number. 
%
%\subsection{Declarations}
%\label{sec:decl}
% 
%  We start with declaration, who we are:
%
% \changes{v1.0}{2012/02/27}{First released version}
%    \begin{macrocode}
%<style>\NeedsTeXFormat{LaTeX2e}
%<*gobble>
\ProvidesFile{issuulinks.dtx}
%</gobble>
%<style>\ProvidesPackage{issuulinks}
[2012/03/22 v1.1 Links in ISSUU style]
%    \end{macrocode}
%
%    \begin{macrocode}
%<*gobble>
\documentclass{ltxdoc}
\usepackage{hypdoc}
\usepackage{url}
\CodelineIndex
\RecordChanges
\EnableCrossrefs
\begin{document}
  \DocInput{issuulinks.dtx}
\end{document}
%</gobble> 
%<*style>
%    \end{macrocode}
%
%
%\subsection{Parameters}
%\label{sec:params}
%
% We use \textsf{keyval} to process options:
%    \begin{macrocode}
\RequirePackage{xkeyval}
%    \end{macrocode}
% 
% \begin{macro}{\issuusetup}
%   The shorthand for setting options:
%    \begin{macrocode}
\def\issuusetup#1{\setkeys{ISL}{#1}}
%    \end{macrocode}
% \end{macro}
%
% \begin{macro}{\ISL@prefix}
%   The |prefix| macro:
%    \begin{macrocode}
\define@key{ISL}{prefix}{\def\ISL@prefix{#1}}
\issuusetup{prefix={http://issuu.com/action/page?page=}}
%    \end{macrocode}
%   
% \end{macro}
%
%
%\subsection{Working with Aux File}
%\label{sec:file}
%
%
% \begin{macro}{\newISSUUlink}
% \changes{v1.1}{2012/03/22}{Added check for undefined/changed references} 
% The page numbers in |\Hy@abspage| start from zero, so we need to
% increment them:
%    \begin{macrocode}
\def\newISSUUlink#1#2{\@tempcnta=#2\relax\advance\@tempcnta by1\relax
  \expandafter\xdef\csname ISL@link#1\endcsname{\the\@tempcnta}}
%    \end{macrocode}
% Someone can use an aux file from the previous run, so we provide a
% safety valve:
%    \begin{macrocode}
\AtBeginDocument{%
  \if@filesw
  \immediate\write\@mainaux{\string\providecommand\string\newISSUUlink[2]{}}%
  \fi}
%    \end{macrocode}   
% At the end of document \LaTeX{} checks whether references might
% been changed or undefined.  Here we plug in into this mechanism:
%    \begin{macrocode}
\AtEndDocument{\let\newISSUUlink\@testISSUUlink}
%    \end{macrocode}
% \end{macro}
% 
% \begin{macro}{\@testISSUUlink}
% \changes{v1.1}{2012/03/22}{Added macro} 
%   Test whether this link is defined.  If not, set |\@tempswa| to
%   true---this will cause \LaTeX{} to issue a warning:
%    \begin{macrocode}
\def\@testISSUUlink#1#2{\@tempcnta=#2\relax\advance\@tempcnta by1\relax
  \edef\reserved@a{\the\@tempcnta}%
  \expandafter\ifx\csname ISL@link#1\endcsname\reserved@a\else
     \@tempswatrue
  \fi}
%    \end{macrocode}
%   
% \end{macro}
%
% 
%
%\subsection{Writing the Internal Link Information}
%\label{sec:writing}
%
% \begin{macro}{\new@pdflink}
%   We patch |\new@pdflink| to write its argument into the aux file.
%   Note that the counter |\Hy@abspage| stores the absolute page
%   position in \textsl{hyperref}.  We do not prevent writing the
%   internal anchor in the catalog---probably a waste of time and
%   bits, but somebody might rely on this for some other
%   purpose\footnote{Actually I am too lazy to do otherwise\dots}.
%    \begin{macrocode}
\let\new@pdflink@ISLorig=\new@pdflink
\def\new@pdflink#1{%
  \@bsphack
  \protected@write\@mainaux{}%
         {\string\newISSUUlink{#1}{\the\Hy@abspage}}%
  \@esphack
  \new@pdflink@ISLorig{#1}}
%    \end{macrocode}   
% \end{macro}
%
%
%\subsection{Patching Internal Links}
%\label{sec:patching}
% 
%
% \begin{macro}{\Hy@StartlinkName}
%   The standard |\Hy@StartlinkName| is defined like this:
% \begin{verbatim}
% \def\Hy@StartlinkName#1#2{%
%   \pdfstartlink attr{#1}goto name{#2}\relax
% }
% \end{verbatim}
% Here we are patching it.  Note that we can have bad links if we use
% `old' aux file
%    \begin{macrocode}
\def\Hy@StartlinkName#1#2{%
  \expandafter\ifx\csname ISL@link#2\endcsname\relax
    \PackageWarning{issuulinks}{The page number for an external link
      is not defined.  Setting it to 1.  You need to rerun LaTeX to
      get the page numbers right.}%
    \expandafter\def\csname ISL@link#2\endcsname{1}\fi
  \edef\Hy@pstringURI{\ISL@prefix\csname ISL@link#2\endcsname}%
  \pdfstartlink attr{#1}%
  user{%
       /Subtype/Link%
       \ifHy@pdfa /F 4\fi
       /A<<%
         /Type/Action%
         /S/URI%
         /URI(\Hy@pstringURI)%
         \ifHy@href@ismap
           /IsMap true%
         \fi
         \Hy@href@nextactionraw
       >>%
      }%
      \relax
}
%    \end{macrocode}
% 
%
%  
% \end{macro}
%
%
%
%    \begin{macrocode}
%</style>
%    \end{macrocode}
%\Finale
%\clearpage
%
%\PrintChanges
%\clearpage
%\PrintIndex
%
\endinput
