% \iffalse THIS IS A META-COMMENT %<*dtx> \ProvidesFile %======================================================================== {XCPDFTIPS.DTX} %======================================================================== % %% Copyright (c) 2019 Mikica Kocic % % This program is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation, either version 3 of the License, or % (at your option) any later version. % % This program is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program. If not, see . % % This is a contributed file to the LaTeX2e system. % ------------------------------------------------- % This is a LaTeX package to do citations with PDF tooltips. % Installation: % LaTeX this file: creates docstrip installation file xcpdftips.ins % AND the LaTeX documentation % (La)TeX xcpdftips.ins: creates package file xcpdftips.sty, and optionally % the documentation driver xcpdftips.drv % (xcpdftips.ins and xcpdftips.drv may be edited as needed) % Docstrip options available: % package - to produce a (LaTeX2e) package .sty file % driver - to produce a driver file to print the documentation %-------------------------------------------------------------------------- % % *** Identify the package file:- % %\NeedsTeXFormat{LaTeX2e} % %\ProvidesPackage{xcpdftips} %[2019/03/18 xcpdftips.sty v1.1 - (c) 2019 Mikica Kocic] % %\RequirePackage{bibentry} %\RequirePackage{pdfcomment} %\RequirePackage{xparse} %\RequirePackage{etoolbox} % % *** Identify the driver file:- % %\NeedsTeXFormat{LaTeX2e} %\ProvidesFile{xcpdftips.drv} % % *** The DATE, VERSION, and other INFO % %\fi %\ProvidesFile{xcpdftips}[2019/03/18 1.1 (MK)] % \changes{1.0}{2019 Mar 10}{Initial version} % \changes{1.1}{2019 Mar 18}{Added support for PDF OCG} % % \CheckSum{282} % % \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 \~} % % \iffalse %<*install> % %^^A ============================================= %^^A Here is the docstrip installation file %^^A It is written on first LaTeX run if it %^^A does not already exist %^^A ============================================= % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{filecontents*}{xcpdftips.ins} % % File: xcpdftips.ins % % Copyright (c) 2019 Mikica Kocic % % This program is free software: you can redistribute it and/or modify % it under the terms of the GNU General Public License as published by % the Free Software Foundation, either version 3 of the License, or % (at your option) any later version. % % This program is distributed in the hope that it will be useful, % but WITHOUT ANY WARRANTY; without even the implied warranty of % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the % GNU General Public License for more details. % % You should have received a copy of the GNU General Public License % along with this program. If not, see . % % It is an installation file for extracting package and driver % files from the original source file. Simply process it under % TeX or LaTeX. It works with Docstrip versions before and after % December 1995. \def\batchfile{xcpdftips.ins} \input docstrip \preamble ============================================= IMPORTANT NOTICE: This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . This is a generated file. It may not be distributed without the original source file \inFileName. Full documentation can be obtained by LaTeXing that original file. Only a few abbreviated comments remain here to describe the usage. ============================================= \endpreamble \postamble <<<<< End of generated file <<<<<< \endpostamble \keepsilent % Docstrip before Dec 95 does not have \generate syntax, nor % \declarepreamble. Must redefine them. The \generateFile called % for each output file individually. % Docstrip before Dec 96 cannot interprete multiline \if..\fi % Thus for maximum compatibility, have only one-line conditionals \let\oldDS F\relax \expandafter\ifx\csname generate\endcsname\relax \let\oldDS T\relax\fi \if\oldDS T \def\declarepreamble#1{\preamble}\fi \if\oldDS T \def\declarepostamble#1{\postamble}\fi \if\oldDS T \generateFile{xcpdftips.sty}{f}{\from{xcpdftips.dtx}{package}} \fi \declarepreamble\driver ============================================ This is the driver file to produce the LaTeX documentation from the original source file \inFileName. Make changes to it as needed. (Never change the file \inFileName!) ============================================ \endpreamble \declarepostamble\driverq End of documentation driver file. \endpostamble \ifx\oldDS T \generateFile{xcpdftips.drv}{f}{\from{xcpdftips.dtx}{driver}}\fi \ifx\oldDS T \let\askforoverwritefalse\relax\def\generate#1{}\fi \askforoverwritefalse \generate{\file{xcpdftips.sty}{\from{xcpdftips.dtx}{package}} \file{xcpdftips.drv}{\usepreamble\driver\usepostamble\driverq \from{xcpdftips.dtx}{driver}} } \obeyspaces \Msg{********************************************}% \Msg{* For documentation, process xcpdftips.dtx *}% \Msg{* or the driver file xcpdftips.drv *}% \Msg{********************************************} \end{filecontents*} % %<*driver> \documentclass[a4paper]{ltxdoc} %%\documentclass[twoside]{ltxdoc} %%\documentclass[a4paper]{ltxdoc} %%\documentclass[twoside,a4paper]{ltxdoc} \raggedbottom %** To include the detailed explanation of the coding, comment out %** the next line % \OnlyDescription %** To produce a command index: add the following line for one run, %** then run makeindex -s gind.ist xcpdftips %** and reprocess, with or without this line (much faster without) %% \EnableCrossrefs\CodelineIndex %** To produce a change history: add the following line for one run, %** then run makeindex -s gglo.ist -o xcpdftips.gls xcpdftips.glo %** and reprocess, with or without this line (faster without) %% \RecordChanges \DisableCrossrefs %May stay; zapped by \EnableCrossrefs \CodelineNumbered %May stay %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \begin{document} \DocInput{xcpdftips.dtx} \end{document} % %\fi % % \DoNotIndex{\begin,\CodelineIndex,\CodelineNumbered,\def,\DisableCrossrefs} % \DoNotIndex{\DocInput,\documentclass,\EnableCrossrefs,\end,\GetFileInfo} % \DoNotIndex{\NeedsTeXFormat,\OnlyDescription,\RecordChanges,\usepackage} % \DoNotIndex{\ProvidesClass,\ProvidesPackage,\ProvidesFile,\RequirePackage} % \DoNotIndex{\filename,\fileversion,\filedate,\let} % \DoNotIndex{\@listctr,\@nameuse,\csname,\else,\endcsname,\expandafter} % \DoNotIndex{\gdef,\global,\if,\item,\newcommand,\nobibliography} % \DoNotIndex{\par,\providecommand,\relax,\renewcommand,\renewenvironment} % \DoNotIndex{\stepcounter,\usecounter,\nocite,\fi} % \DoNotIndex{\@fileswfalse,\@gobble,\@ifstar,\@unexpandable@protect} % \DoNotIndex{\AtBeginDocument,\AtEndDocument,\begingroup,\endgroup} % \DoNotIndex{\frenchspacing,\MessageBreak,\newif,\PackageWarningNoLine} % \DoNotIndex{\protect,\string,\xdef,\ifx,\texttt,\@biblabel,\bibitem} % % \setcounter{IndexColumns}{2} % \setlength{\IndexMin}{10cm} % \setcounter{StandardModuleDepth}{1} % % \GetFileInfo{xcpdftips} % % \title{\bfseries Citations with PDF tooltips} % % \author{Mikica Kocic} % % \date{\normalsize This paper describes package \texttt{\filename}\\[0.5ex] % version \fileversion{} from \filedate % } % % \maketitle % % \pagestyle{myheadings} % \markboth{M. Kocic}{PDF tooltips for natbib citations} % %^^A In order to keep all marginal notes on the one (left) side: %^^A (otherwise they switch sides disasterously with twoside option) % \makeatletter \@mparswitchfalse \makeatother % %\iffalse %<*package> % % PDF tooltips from natbib citations % %----------------------------------------------------------- % See documentation in the source .dtx file for more details. % %\fi % % \section{Introduction} % % This package allows one to be able to do \texttt{natbib} citations % with PDF tooltips. % % \section{Invoking the Package} % % The macros in this package are included in the main document % with the |\usepackage| command of \LaTeXe, % \begin{quote} % |\documentclass[..]{...}|\\ % |\usepackage|\oarg{options}|{|\texttt{\filename}|}| % \end{quote} % where \oarg{options} is one of: |redefcite|, |ocg|, or |tcolorbox|. % % The option |redefcite| replaces |natbib|'s |\cite| with |\xcpdfcite|. % % The option |ocg| puts tooltips on PDF layers using OCG. % % If |ocg| is used and |tcolorbox| is enabled, the package will use % |\tcolorbox| instead of |\fcolorbox|. % % \section{Usage} % % \newcommand\btx{\textsc{Bib}\TeX} % % This package must be used with \btx{} and \texttt{natbib}, not with a % hand-written \texttt{thebibliography} environment. % More precisely, there must be a \texttt{.bbl} file external to the \LaTeX\ % file; whether this is written by hand or by \btx\ is unimportant. % \vspace{2ex} % % \DescribeMacro{\xpdfcite} % \noindent A replacement for \texttt{natbib}'s |\cite| macro.\\~ % % \noindent Similarly to |\cite|, the command |\xpdfcite| may take one or two % optional arguments to add some text before and after the citation, % % \begin{quote} % |\xpdfcite|\marg{key(s)}\\[0.2ex] % |\xpdfcite|\oarg{post}\marg{key(s)}\\[0.2ex] % |\xpdfcite|\oarg{pre}\oarg{post}\marg{key(s)} % \end{quote} % % \section{Caveats} % % The \texttt{\filename} package will work with |natbib| with its % native |\bibitem| format, and with standard \LaTeX. % It will also work with |url| package. % % The OCG support requires |ocgbase| and |pdfbase| versions $\ge$ 2018/04/06 % % Nothing else can be guaranteed. % % \StopEventually{\PrintIndex\PrintChanges} % % \section{Options with \texttt{docstrip}} % % The source \texttt{.dtx} file is meant to be processed with % \texttt{docstrip}, for which a number of options are available: % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \begin{description} % % \item[\ttfamily package] to produce a \texttt{.sty} package file with most % comments removed; % % \item[\ttfamily driver] to produce a driver \texttt{.drv} file that will % print out the documentation under \LaTeXe. The documentation cannot % be printed under \LaTeX~2.09. % % \end{description} % % The source file \texttt{\filename.dtx} is itself a driver file and can % be processed directly by \LaTeXe. % % \section{The Coding} % % This section presents and explains the actual coding of the macros. % It is nested between |%<*package>| and |%|, which % are indicators to \texttt{docstrip} that this coding belongs to the package % file. % % \begin{macro}{Package options} % % |redefcite|, |ocg|, |tcolorbox| % % \begin{macrocode} \newif\ifXCP@redefcite\XCP@redefcitefalse \newif\ifXCP@useocg\XCP@useocgfalse \newif\ifXCP@usetcolorbox\XCP@usetcolorboxfalse \DeclareOption{redefcite}{\XCP@redefcitetrue} \DeclareOption{ocg}{\XCP@useocgtrue} \DeclareOption{tcolorbox}{\XCP@usetcolorboxtrue} \ProcessOptions\relax % \end{macrocode} % \end{macro} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \begin{macro}{\XCP@tooltipbox} % % Command for creating a tooltip box on the OCG layer. % The arguments are the same as for |\fcolorbox|. % % \begin{macrocode} \ifXCP@useocg \ifXCP@usetcolorbox \ifx\tcolorbox\undefined \RequirePackage{tcolorbox} \fi \newcommand{\XCP@tooltipbox}[3]{% \begin{tcolorbox}[colframe=#1, colback=#2,% width=1.02\columnwidth, arc=2pt,% boxsep=2pt, top=0ex, bottom=0ex, left=0.1em, right=0.1em% ]\normalfont\small #3\end{tcolorbox}% } \else \newcommand{\XCP@tooltipbox}[3]{% \fcolorbox{#1}{#2}% {\parbox[t]{\columnwidth}{\normalfont\small #3}}% } \fi \fi % \end{macrocode} % \end{macro} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \begin{macro}{\XCP@ocgtooltip} % % Usage: |\XCP@ocgtooltip|\marg{link text}\oarg{tooltip box color}\marg{tooltip text} % % \noindent Warning: Requires |pdfbase| and |ocgbase| $>=$ 2018/04/06 % % \begin{macrocode} \ifXCP@useocg \RequirePackage{pdfbase,ocgbase} \RequirePackage{expl3} \RequirePackage{calc,linegoal} \RequirePackage{xcolor} % Check the required versions of pdfbase and ocgbase \ExplSyntaxOn \msg_set:nnnn{xcpdftips}{support~outdated}{ Support~package~`#1'~too~old. }{ Get~an~up~to~date~version~of~`#1'.\\Aborting. } \@ifpackagelater{pdfbase}{2018/04/06}{}{ \msg_error:nnn{xcpdftips}{support~outdated}{pdfbase.sty} \tex_endinput:D } \@ifpackagelater{ocgbase}{2018/04/06}{}{ \msg_error:nnn{xcpdftips}{support~outdated}{ocgbase.sty} \tex_endinput:D } \let\XCP@pdfLink\pbs_pdflink:nn % Alias for the pdflink from pdfbase \ExplSyntaxOff % Patch hyperref (make the PDF annotations OCG-aware) \ifx\Hy@setpdfborder\undefined\else \let\Hy@setpdfborderOrig\Hy@setpdfborder \def\Hy@setpdfborder{\ocgbase@insert@oc\Hy@setpdfborderOrig}% \fi \newsavebox{\XCP@tipText} % Temporary savebox \newlength{\XCP@hOffset} \setlength\XCP@hOffset{-0.1em} \newlength{\XCP@vOffset} \setlength\XCP@vOffset{0.2ex} \newlength{\XCP@lineGoal} \NewDocumentCommand{\XCP@ocgtooltip}{% m % link text O{yellow!5} % tooltip box color m % tooltip text }{{% \leavevmode% % Create a new PDF layer \ocgbase@new@ocg{ref [\XCP@keys]}{% /Print<> % /Export<> % /View<> % }{invisible}% \edef\XCP@currentOcg{\ocgbase@last@ocg}% % Insert the PDF layer into the order hierarchy (shown in the 'Layers' tab) \ocgbase@tree@node@begin% \XCP@currentOcg% \ocgbase@tree@node@end% % Disable the simultaneous visibility of multiple tooltips \ocgbase@add@ocg@to@radiobtn@grp{tool@tips}{\ocgbase@last@ocg}% % Emit the using \pbs_pdflink:nn \XCP@pdfLink{% /Subtype/Link/Border[0 0 0]/A % <> % }{#1}% % Create a savebox for the on the PDF layer \sbox\XCP@tipText{% \ocgbase@oc@bdc{\XCP@currentOcg}% \ocgbase@open@stack@push{\XCP@currentOcg}% \XCP@tooltipbox{black!50}{#2}{#3}% \ocgbase@oc@emc% \ocgbase@open@stack@pop% \null% }% % Emit the savebox (at this point we have dimensions to calc the offset) \raisebox{% \heightof{#1} + \the\dp\XCP@tipText + \XCP@vOffset% }[0pt][0pt]{% \makebox[0pt][l]{\relax% \setlength\XCP@lineGoal{\linegoal}% \hspace{\dimexpr\XCP@lineGoal - \linewidth + \XCP@hOffset \relax}% \usebox{\XCP@tipText}% }% }% }} \fi%XCP@useocg % \end{macrocode} % \end{macro} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \begin{macro}{\XCP@enumeratetips} % % Gets \texttt{bibentry} for each key from the list of citations. % The output is stored into |\XCP@tips|, which can be directly used as % a tooltip text in |\pdftooltip|. % % \begin{macrocode} \newsavebox{\XCP@keynum} % Temp box for getting citation numbers using \citenum \ExplSyntaxOn \NewDocumentCommand{ \XCP@enumeratetips }% { > { \SplitList , } m }% {% \global\undef\XCP@tips% \global\undef\XCP@keys% \tl_map_inline:nn {#1}% {% \ifx\XCP@tips\undefined% \global\def\XCP@keys{}% \sbox\XCP@keynum{\citenum{##1}}% \expandafter\xdef\csname XCP@k@##1\endcsname{\NAT@num}% \xappto{\XCP@keys}{\NAT@num}% \global\def\XCP@tips{}% \gappto{\XCP@tips}{[\textbf{\@nameuse{XCP@k@##1}}]\ % {\@nameuse{BR@r@##1\@extra@b@citeb}}}% \else% \sbox\XCP@keynum{\citenum{##1}}% \expandafter\xdef\csname XCP@k@##1\@extra@b@citeb\endcsname{\NAT@num}% \xappto{\XCP@keys}{,\NAT@num}% \gappto{\XCP@tips}{,\textCR[\textbf{\@nameuse{XCP@k@##1}}]\ % {\@nameuse{BR@r@##1\@extra@b@citeb}}}% \fi% }% } \ExplSyntaxOff % \end{macrocode} % \end{macro} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \begin{macro}{\xcsetauthor} % % Set the author used for pdf comments (default: {}). % % \begin{macrocode} \gdef\XCP@opt@author{{}} \newcommand{\xcsetauthor}[1]{\gdef\XCP@opt@author{#1}} % \end{macrocode} % \end{macro} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \begin{macro}{\xcsetmarkup} % % Set the markup used for pdf comments (default: Underline). % % \begin{macrocode} \gdef\XCP@opt@markup{Underline} \newcommand{\xcsetmarkup}[1]{\gdef\XCP@opt@markup{#1}} % \end{macrocode} % \end{macro} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \begin{macro}{\xcsetcolor} % % Set the color used for pdf comments (default: yellow). % % \begin{macrocode} \gdef\XCP@opt@color{1 1 0} \newcommand{\xcsetcolor}[1]{\gdef\XCP@opt@color{#1}} % \end{macrocode} % \end{macro} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \begin{macro}{\xcsetopacity} % % Set the opacity used for pdf comments (default: 0). % % \begin{macrocode} \gdef\XCP@opt@opacity{0} \newcommand{\xcsetopacity}[1]{\gdef\XCP@opt@opacity{#1}} % \end{macrocode} % \end{macro} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \begin{macro}{\XCP@citetp} % % This macro is in fact |\xpdfcite|. \\ % It is a wrapper for |\XCP@@citetp| to handle variable number of arguments. % % \begin{macrocode} \newcommand\XCP@citetp{\@ifnextchar[{\XCP@@citetp}{\XCP@@citetp[]}} \newcommand\XCP@@citetp{} \def\XCP@@citetp[#1]{\@ifnextchar[{\XCP@citex[#1]}{\XCP@citex[][#1]}} % \end{macrocode} % \end{macro} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \begin{macro}{\XCP@citex} % % An internal macro that does the actual job for |\xpdfcite|. % % \begin{macrocode} \newcommand\XCP@citex{} \gdef\XCP@citex[#1][#2]#3% {%{\protect\NoHyper% \ifXCP@useocg% \let\textCR\par% \XCP@enumeratetips{#3}% \XCP@ocgtooltip% {{{\protect\NoHyper\XCP@oldcite[#1][#2]{#3}\protect\endNoHyper}}}% {\XCP@tips}% \else% \XCP@enumeratetips{#3}% \pdftooltip{\XCP@oldcite[#1][#2]{#3}}{\XCP@tips}% \pdfmarkupcomment[% author=\XCP@opt@author,% markup=\XCP@opt@markup,% color=\XCP@opt@color,% opacity=\XCP@opt@opacity,% ]{\vphantom{.}}{\XCP@tips}% \fi% }%\protect\endNoHyper}} \let\XCP@oldcite\citep % Save \citep (in the case if it becomes redefined) % \end{macrocode} % \end{macro} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \begin{macro}{\xpdfcite} % % A wrapper for |\citep| + |\pdftooltip|. % It has the same syntax as |\citep|. % % \begin{macrocode} \let\xpdfcite\XCP@citetp \robustify{\xpdfcite} \AtBeginDocument{\nobibliography*} % Necessary to get bibentries. \ifXCP@redefcite % Override \cite \let\cite\xpdfcite \robustify{\cite} % Required for, e.g., captions \fi % \end{macrocode} % \end{macro} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \Finale