summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/xcpdftips
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/xcpdftips
Initial commit
Diffstat (limited to 'macros/latex/contrib/xcpdftips')
-rw-r--r--macros/latex/contrib/xcpdftips/README.md62
-rw-r--r--macros/latex/contrib/xcpdftips/xcpdftips.dtx647
-rw-r--r--macros/latex/contrib/xcpdftips/xcpdftips.pdfbin0 -> 149926 bytes
3 files changed, 709 insertions, 0 deletions
diff --git a/macros/latex/contrib/xcpdftips/README.md b/macros/latex/contrib/xcpdftips/README.md
new file mode 100644
index 0000000000..90612c97be
--- /dev/null
+++ b/macros/latex/contrib/xcpdftips/README.md
@@ -0,0 +1,62 @@
+# xcpdftips
+
+This is a LaTeX package for natbib citations with PDF tooltips.
+
+## Manifest
+
+The xcpdftips package contains the following files:
+
+### `xcpdftips.dtx`
+
+Documented source file that may be LaTeXed to get the
+detailed description and/or coding documentation.
+
+May be docstripped with option "package,all" to get the
+`xcpdftips.sty` package file, or processed with `xcpdftips.ins`.
+
+### `xcpdftips.ins`
+
+A docstrip batch job to extract `xcpdftips.sty` from the source file
+`xcpdftips.dtx`. Simply TeX or LaTeX this file.
+
+This file is embedded in `xcpdftips.dtx`. If it is missing, then
+LaTeXing `xcpdftips.dtx` will extract it.
+
+## Generation
+
+Simply run TeX or LaTeX on `xcpdftips.ins`, which extracts
+`xcpdftips.sty` from the documented source `xcpdftips.dtx`. If
+`xcpdftips.ins` has been lost, it may be regenerated by
+running LaTeX on `xcpdftips.dtx`.
+
+## Documentation
+
+Run LaTeX on `xcpdftips.dtx` or `xcpdftips.ltx`. The latter may be edited
+as needed to conform to local requirements (paper size, duplex or not,
+with or without entire coding). Alternatively, a `ltxdoc.cfg` file can
+contain local configurations.
+
+For full details, print out the documentation in `xcpdftips.dtx`
+by LaTeXing it.
+
+## List of changes
+
+v1.0 2019/03/10 Initial release
+v1.1 2019/03/10 Added support for tooltips on PDF layers (using OCG)
+
+## License
+
+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 <https://www.gnu.org/licenses/>.
+
+
diff --git a/macros/latex/contrib/xcpdftips/xcpdftips.dtx b/macros/latex/contrib/xcpdftips/xcpdftips.dtx
new file mode 100644
index 0000000000..ead1422810
--- /dev/null
+++ b/macros/latex/contrib/xcpdftips/xcpdftips.dtx
@@ -0,0 +1,647 @@
+% \iffalse THIS IS A META-COMMENT
+%<*dtx>
+\ProvidesFile
+%========================================================================
+ {XCPDFTIPS.DTX}
+%========================================================================
+%</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 <https://www.gnu.org/licenses/>.
+%
+% 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:-
+%<package>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>
+%<package>\ProvidesPackage{xcpdftips}
+%<package>[2019/03/18 xcpdftips.sty v1.1 - (c) 2019 Mikica Kocic]
+%<package>
+%<package>\RequirePackage{bibentry}
+%<package>\RequirePackage{pdfcomment}
+%<package>\RequirePackage{xparse}
+%<package>\RequirePackage{etoolbox}
+%
+% *** Identify the driver file:-
+%
+%<driver>\NeedsTeXFormat{LaTeX2e}
+%<driver>\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 <https://www.gnu.org/licenses/>.
+%
+% 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 <https://www.gnu.org/licenses/>.
+
+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*}
+%</install>
+%<*driver>
+\documentclass[a4paper]{ltxdoc}
+%<driver>%\documentclass[twoside]{ltxdoc}
+%<driver>%\documentclass[a4paper]{ltxdoc}
+%<driver>%\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)
+%<driver>% \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)
+%<driver>% \RecordChanges
+
+\DisableCrossrefs %May stay; zapped by \EnableCrossrefs
+\CodelineNumbered %May stay
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\begin{document}
+ \DocInput{xcpdftips.dtx}
+\end{document}
+%</driver>
+%\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.
+%</package>
+%\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 |%</package>|, 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<</PrintState/OFF>> %
+ /Export<</ExportState/OFF>> %
+ /View<</ViewState/OFF>> %
+ }{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 <link text> using \pbs_pdflink:nn
+ \XCP@pdfLink{%
+ /Subtype/Link/Border[0 0 0]/A %
+ <</S/SetOCGState/State [/Toggle \XCP@currentOcg]>> %
+ }{#1}%
+ % Create a savebox for the <tooltip text> 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
diff --git a/macros/latex/contrib/xcpdftips/xcpdftips.pdf b/macros/latex/contrib/xcpdftips/xcpdftips.pdf
new file mode 100644
index 0000000000..6ec5aa4610
--- /dev/null
+++ b/macros/latex/contrib/xcpdftips/xcpdftips.pdf
Binary files differ