diff options
Diffstat (limited to 'macros/latex/contrib/jumplines/jumplines.sty')
-rw-r--r-- | macros/latex/contrib/jumplines/jumplines.sty | 562 |
1 files changed, 562 insertions, 0 deletions
diff --git a/macros/latex/contrib/jumplines/jumplines.sty b/macros/latex/contrib/jumplines/jumplines.sty new file mode 100644 index 0000000000..bc72672dfe --- /dev/null +++ b/macros/latex/contrib/jumplines/jumplines.sty @@ -0,0 +1,562 @@ +\NeedsTeXFormat{LaTeX2e}% +\ProvidesPackage{jumplines}[2015/06/02 v0.2 -- Teaser/Continued articles with hyperlinks] +%%% +%% ------------------------------------------------------------------------------------------- +%% Copyright (c) 2015 by Dr. Christian Hupfer <christian dot hupfer at yahoo dot de> +%% ------------------------------------------------------------------------------------------- +%% +%% 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 this license is in +%% http://www.latex-project.org/lppl.txt +%% and version 1.3 or later is part of all distributions of LaTeX +%% version 2005/12/01 or later. +%% +%% This work has the LPPL maintenance status `maintained'. +%% +%% This work consists of all files listed in README +%% + +\RequirePackage{etoolbox}[2011/01/03 2.2]% +\RequirePackage{xparse}% +\RequirePackage{xkeyval}[2012/10/14 v2.6b]% +\RequirePackage[dvipsnames,x11names]{xcolor}% +\PassOptionsToPackage{svgnames}{xcolor}% +\RequirePackage[breakable]{tcolorbox}% + +\DeclareOptionX{languages}[english]{% + \def\JLPackageMacroLanguages{#1}% +}% + +\DeclareOptionX*{\PackageWarning{jumplines}{Option '\CurrentOption ' ignored}}% + +\ExecuteOptionsX{languages={spanish,french,ngerman,english}} + +\ProcessOptionsX% + + +\RequirePackage[strings,ngerman,english,\JLPackageMacroLanguages]{babel} + +\RequirePackage{tocloft} + +\RequirePackage{ifluatex} +\RequirePackage[bookmarksopen=true]{hyperref} +\RequirePackage{bookmark} + +\ifluatex +\RequirePackage{luacolor}% Recommended +\fi + +%%%% Provide dummy macros for unknown languages +\newcommand{\listofarticlesname}{} +\newcommand{\listofcontinuedarticlesname}{} +\newcommand{\articlesname}{} +\newcommand{\JLArticleName}{} +\newcommand{\ContinuedOn}{} +\newcommand{\ContinuedFrom}{} +\newcommand{\OnPage}{} +\newcommand{\Pagename}{} +\newcommand{\byauthor}{} + + +\StartBabelCommands{english}{extras} +\SetString\JLArticleName{Article\xspace} +\SetString\articlesname{Articles} % plural +\SetString\Pagename{Page\xspace} +\SetString\ContinuedOn{Continued on\xspace} +\SetString\ContinuedFrom{Continued from\xspace} +\SetString\OnPage{on \Pagename\xspace} +\SetString\listofarticlesname{List of Articles}% +\SetString\listofcontinuedarticlesname{List of continued \articlesname}% +\SetString\byauthor{By\xspace} +\EndBabelCommands + +\StartBabelCommands{ngerman}{extras} +\SetString\JLArticleName{Artikel\xspace} +\SetString\articlesname{Artikel\xspace} +\SetString\Pagename{Seite\xspace} +\SetString\ContinuedOn{Weiterlesen auf\xspace} +\SetString\ContinuedFrom{Fortsetzung von\xspace} +\SetString\OnPage{auf \Pagename\xspace} +\SetString\listofarticlesname{Artikelverzeichnis}% +\SetString\listofcontinuedarticlesname{Fortgesetzte \articlesname} +\SetString\byauthor{Von\xspace} +\EndBabelCommands + +\StartBabelCommands{french}{extras} +\SetString\JLArticleName{Article\xspace} +\SetString\articlesname{Articles} % plural +\SetString\Pagename{Page\xspace} +\SetString\ContinuedOn{Suite \`{a} la page\xspace} +\SetString\ContinuedFrom{Continu\'ee de\xspace} +\SetString\OnPage{\`a la \Pagename\xspace} +\SetString\listofarticlesname{Liste des articles}% +\SetString\listofcontinuedarticlesname{Liste des articles continu\'ee}% +\SetString\byauthor{Ecrit par\xspace} +\EndBabelCommands + +\StartBabelCommands{spanish}{extras} +\SetString\JLArticleName{Art\'iculo\xspace} +\SetString\articlesname{Art\'iculos} % plural +\SetString\Pagename{P\'agina\xspace} +\SetString\ContinuedOn{Continuo en la p\'agina\xspace} +\SetString\ContinuedFrom{Continuado de\xspace} +\SetString\OnPage{la \Pagename\xspace} +\SetString\listofarticlesname{Lista de los art\'iculos}% +\SetString\listofcontinuedarticlesname{Lista des art\'iculos continuado}% +\SetString\byauthor{By\xspace} +\EndBabelCommands + + +\NewDocumentCommand{\DefaultTeaserTocExt}{}{% +teaser% +}% + +\NewDocumentCommand{\DefaultContinuedArticleTocExt}{}{% +continued% +}% + + +\newlistof{article}{\DefaultTeaserTocExt}{\listofarticlesname}% +\newlistof{contarticle}{\DefaultContinuedArticleTocExt}{\listofcontinuedarticlesname}% + + +\@ifpackageloaded{bookmark}{% + \NewDocumentCommand{\@@jumpline@@bookmark}{O{}+mO{}}{% + \bookmark[#1]{#2}% + }% +}{% + \@ifpackageloaded{hyperref}{% + \NewDocumentCommand{\@@jumpline@@bookmark}{O{}+mO{}}{% + \pdfbookmark[#1]{#2}{#3}% + }% + }{% + \NewDocumentCommand{\@@jumpline@@bookmark}{O{}+mO{}}{% + % \pdfbookmark[#1]{#2}{#3}% + }% + }% +} + + +%%%% Key - Value definitions + + + +\define@key{jumpline}{ArticleHeadline}{% + \def\JLKVMacroArticleHeadline{#1}% +}% + +\define@key{jumpline}{toc}{% + \def\JLKVMacroToc{#1}% +}% + + +\define@key{jumpline}{ArticleAuthor}{% + \def\JLKVMacroArticleAuthor{#1}% +}% + +% Length related keys + +\define@key{jumpline}{ArticleFullHeight}{% + \def\JLKVMacroArticleFullHeight{#1}% +}% + +\define@key{jumpline}{TeaserHeight}[2in]{% + \def\JLKVMacroTeaserHeight{#1}% +}% + +\define@key{jumpline}{ContinuedArticleHeight}{% + \def\JLKVMacroContinuedArticleHeight{#1}% +}% + +\define@key{jumpline}{ContinuedFromTopskip}{% + \def\JLKVMacroContinuedFromTopskip{#1}% +}% +\define@key{jumpline}{ContinuedFromBottomskip}{% + \def\JLKVMacroContinuedFromBottomskip{#1}% +}% + +\define@key{jumpline}{ContinuedOnTopskip}{% + \def\JLKVMacroContinuedOnTopskip{#1}% +}% + +\define@key{jumpline}{ContinuedOnBottomskip}{% + \def\JLKVMacroContinuedOnBottomskip{#1}% +}% + +\define@key{jumpline}{ContinuedArticleBottomskip}{% + \def\JLKVMacroContinuedArticleBottomskip{#1}% +}% + +% Keys for optional teaser/continued article content and options + +\define@key{jumpline}{TeaserHeaderColor}{% + \def\JLKVMacroTeaserHeaderColor{#1}% +}% + +\define@key{jumpline}{ContinuedHeaderColor}{% + \def\JLKVMacroContinuedHeaderColor{#1}% +}% + + +\define@key{jumpline}{TeaserHeaderContent}{% + \def\JLKVMacroTeaserHeaderContent{#1}% +}% + +\define@key{jumpline}{TeaserHeaderOptions}{% + \def\JLKVMacroTeaserHeaderOptions{#1}% +}% + +\define@key{jumpline}{ContinuedArticleHeaderContent}{% + \def\JLKVMacroContinuedArticleHeaderContent{#1}% +}% + + +\define@key{jumpline}{ContinuedArticleHeaderOptions}{% + \def\JLKVMacroContinuedArticleHeaderOptions{#1}% +}% + +\define@boolkey{jumpline}{RightHere}[false]{% +}% + +\define@boolkey{jumpline}{autobookmark}[true]{% +}% + +\define@key{jumpline}{BookmarkEntry}{% + \def\JLKVMacroBookmarkEntry{#1}% +}% + + +\define@key{jumpline}{genericbookmarklevel}{% + \def\JLKVMacroGenericBookmarkLevel{#1}% +}% + +\define@key{jumpline}{genericbookmarkdest}{% + \def\JLKVMacroGenericBookmarkDest{#1}% +}% + + +\define@boolkey{jumpline}{emptyarticleintoc}[false]{% +}% + +\define@boolkey{jumpline}{emptyarticleinbookmarks}[false]{% +}% + + +\define@key{jumpline}{teasertoclevel}[section]{% +\def\JLKVMacroTeaserTocLevel{#1}% +}% + +\define@key{jumpline}{continuedtoclevel}[section]{% +\def\JLKVMacroContinuedTocLevel{#1}% +}% + + +\define@key{jumpline}{teaserbookmarklevel}[section]{% +\def\JLKVMacroTeaserBookmarkLevel{#1}% +}% + +\define@key{jumpline}{continuedbookmarklevel}[section]{% +\def\JLKVMacroContinuedBookmarkLevel{#1}% +}% + + +\define@key{jumpline}{teasertocext}{% +\def\JLKVMacroTeaserTocExt{#1}% +}% + +\define@key{jumpline}{continuedtocext}{% +\def\JLKVMacroContinuedTocExt{#1}% +}% + +\define@key{jumpline}{internalmode}{% +\def\JLKVMacroInternalMode{#1}% +}% + + + +\presetkeys{jumpline}{TeaserHeight=2in, + ContinuedOnTopskip={0.4\baselineskip}, + ContinuedOnBottomskip={0pt}, + ContinuedFromTopskip={0.4\baselineskip}, + ContinuedFromBottomskip={0pt},% + ContinuedArticleBottomskip={20pt},% + TeaserHeaderColor={white}, + ContinuedHeaderColor={white}, + TeaserHeaderContent={}, + ContinuedArticleHeaderContent={}, + TeaserHeaderOptions={leftlower=0pt,rightlower=0pt,boxrule=0pt,left=0pt,right=0pt, arc=0pt,auto outer arc,colbacktitle=black,coltitle=white,toptitle=2mm,bottomtitle=2mm}, + ContinuedArticleHeaderOptions={leftlower=0pt,rightlower=0pt,boxsep=0pt,boxrule=0pt,left=0pt,right=0pt, + arc=0pt,auto outer arc,colbacktitle=black,coltitle=white,toptitle=2mm,bottomtitle=2mm,righttitle=1mm,colback=black}, + emptyarticleintoc=false, + emptyarticleinbookmarks=false, + autobookmark=true, + teasertoclevel=subsection, + continuedtoclevel=subsection, + teaserbookmarklevel=subsection, + continuedbookmarklevel=subsection, + teasertocext=\DefaultTeaserTocExt, + continuedtocext=\DefaultContinuedArticleTocExt + }{}% + + + + +\newcounter{@@jumplines@@internaldocounter}% +\newlength{\@@jumplines@@articleheight}% +\newlength{\@@jumplines@@teaserboxheight}% + + +\xdef\ContinuedArticleList{}% +\xdef\TeaserBoxList{}% +\xdef\JumplineOptionsList{}% + +\listcsadd{ContinuedArticleList}{}% +\listcsadd{TeaserBoxList}{}% +\listcsxadd{JumplineOptionsList}{}% + + +\NewDocumentCommand\JumplineArticle{+o+o+m}{% Provide later on for a starred version + \refstepcounter{article}% + \newbox\@@jumplines@@articlebox% + \newbox\@@jumplines@@teaserbox% + \begingroup% + \IfValueTF{#1}{% + \setkeys{jumpline}{#1}% + }{% + \typeout{Nothing!}% + }% + \setlength{\@@jumplines@@teaserboxheight}{\JLKVMacroTeaserHeight}% + \global\setbox\@@jumplines@@articlebox=\vbox{\noindent#3}% + \setlength{\@@jumplines@@articleheight}{\the\ht\@@jumplines@@articlebox}% + \global\setbox\@@jumplines@@teaserbox=\vsplit\@@jumplines@@articlebox to \@@jumplines@@teaserboxheight% Split the input to teaser box and a continued box + \listcsxadd{TeaserBoxList}{\number\@@jumplines@@teaserbox}% + \listcsxadd{ContinuedArticleList}{\number\@@jumplines@@articlebox}% + % Transfer options to the child box handlers + \IfValueTF{#2}{% + \listcsxadd{JumplineOptionsList}{\unexpanded{#1},ContinuedArticleHeight={\the\ht\@@jumplines@@articlebox},ArticleFullHeight={\the\@@jumplines@@articleheight},toc={#2}}% + }{% + \listcsxadd{JumplineOptionsList}{\unexpanded{#1},ContinuedArticleHeight={\the\ht\@@jumplines@@articlebox},ArticleFullHeight={\the\@@jumplines@@articleheight}}% + }% + \endgroup% +}% + + + + +\NewDocumentCommand{\@@jumpline@@bookmarkwrapper}{+O{}}{% + \begingroup + \setkeys{jumpline}{#1}% + \gdef\JLBookmarkEntry{}% Empty macro + \ifdef{\JLKVMacroBookmarkEntry}{% + \def\JLBookmarkEntry{\JLKVMacroBookmarkEntry}% + }{% Nope, use (if defined !) the article headline, otherwise empty + \ifdef{\JLKVMacroArticleHeadline}{% + \gdef\JLBookmarkEntry{\JLKVMacroArticleHeadline}% + }{% + }% + }% + \ifdefempty{\JLBookmarkEntry}{% + \ifKV@jumpline@autobookmark % Check if autobookmark is on + \ifKV@jumpline@emptyarticleinbookmarks% Check if empty bookmark entry is allowed + \@@jumpline@@bookmark[level=\JLKVMacroGenericBookmarkLevel,dest=\JLKVMacroGenericBookmarkDest]{\thearticle}% + \fi% + \fi% + }{% + \ifKV@jumpline@autobookmark% + \@@jumpline@@bookmark[level=\JLKVMacroGenericBookmarkLevel,dest=\JLKVMacroGenericBookmarkDest]{\thearticle~\JLBookmarkEntry}% + \fi% + }% + \undef\JLBookmarkEntry% +\endgroup% +}% + + + +\NewDocumentCommand{\@@jumpline@@addcontentsline}{+O{}}{% + \begingroup + \setkeys{jumpline}{#1}% + \gdef\JLTocEntry{}% Empty macro + \ifdef{\JLKVMacroToc}{% + \gdef\JLTocEntry{\JLKVMacroToc}% + }{% + \ifdef{\JLKVMacroArticleHeadline}{% + \gdef\JLTocEntry{\JLKVMacroArticleHeadline}% + }{% + }% + }% + \ifdefempty{\JLTocEntry}{% + \ifKV@jumpline@emptyarticleintoc% + \addcontentsline{\csuse{JLKVMacro\JLKVMacroInternalMode TocExt}}{\csuse{JLKVMacro\JLKVMacroInternalMode TocLevel}}{\thearticle}% + \fi% + \@@jumpline@@bookmarkwrapper[genericbookmarklevel=\csuse{JLKVMacro\JLKVMacroInternalMode BookmarkLevel},genericbookmarkdest=jlarticle::\JLKVMacroInternalMode::\number\value{article},#1]% + }{% + \addcontentsline{\csuse{JLKVMacro\JLKVMacroInternalMode TocExt}}{\csuse{JLKVMacro\JLKVMacroInternalMode TocLevel}}{\thearticle~\JLTocEntry}% + \@@jumpline@@bookmarkwrapper[genericbookmarklevel=\csuse{JLKVMacro\JLKVMacroInternalMode BookmarkLevel},genericbookmarkdest={jlarticle::\JLKVMacroInternalMode::\number\value{article}},#1] + }% + \endgroup% + \undef{\JLTocEntry}% +}% + + +\NewDocumentCommand{\@@jumpline@@addcontentslineold}{+O{}}{% + \begingroup + \setkeys{jumpline}{#1}% + \gdef\JLTocEntry{}% Empty macro + \ifdef{\JLKVMacroToc}{% + \gdef\JLTocEntry{\JLKVMacroToc}% + }{% + \ifdef{\JLKVMacroArticleHeadline}{% + \gdef\JLTocEntry{\JLKVMacroArticleHeadline}% + }{% + }% + }% + + \ifdefempty{\JLTocEntry}{% + \ifKV@jumpline@emptyarticleintoc% + \addcontentsline{\JLKVMacroTeaserTocExt}{\JLKVMacroTeaserTocLevel}{\thearticle}% + \fi% + \@@jumpline@@bookmarkwrapper[genericbookmarklevel=\JLKVMacroTeaserBookmarkLevel,genericbookmarkdest=jlarticle::teaser::\number\value{article},#1]% + }{% + \addcontentsline{\JLKVMacroTeaserTocExt}{\JLKVMacroTeaserTocLevel}{\thearticle~\JLTocEntry}% + \@@jumpline@@bookmarkwrapper[genericbookmarklevel=\JLKVMacroTeaserBookmarkLevel,genericbookmarkdest=jlarticle::teaser::\number\value{article},#1] + }% + \endgroup% + \undef{\JLTocEntry}% +}% + + + +\NewDocumentCommand{\@@jumpline@@addcontentslinecontinuedarticle}{+O{}}{% + \begingroup + \setkeys{jumpline}{#1}% + \gdef\JLTocEntry{}% Empty macro + \ifdef{\JLKVMacroToc}{% + \gdef\JLTocEntry{\JLKVMacroToc}% + }{% + \ifdef{\JLKVMacroArticleHeadline}{% + \gdef\JLTocEntry{\JLKVMacroArticleHeadline}% + }{% + }% + }% + \ifdefempty{\JLTocEntry}{% + \ifKV@jumpline@emptyarticleintoc% + \addcontentsline{\JLKVMacroContinuedTocExt}{\JLKVMacroTeaserTocLevel}{\thearticle}% + \fi% + \@@jumpline@@bookmarkwrapper[genericbookmarklevel=\JLKVMacroContinuedBookmarkLevel,genericbookmarkdest=jlarticle::\number\value{article},#1]% + }{% + \addcontentsline{\JLKVMacroContinuedTocExt}{\JLKVMacroTeaserTocLevel}{\thearticle~\JLTocEntry}% + \@@jumpline@@bookmarkwrapper[genericbookmarklevel=\JLKVMacroTeaserBookmarkLevel,genericbookmarkdest=jlarticle::\number\value{article},#1] + }% + \endgroup% + \undef{\JLTocEntry}% +}% + + + +\NewDocumentCommand{\DisplayJumplineTeaser}{+m+m}{% + \begingroup% + \setkeys{jumpline}{#1,internalmode={Teaser}}% + \begin{tcolorbox}[colback=black,code={\pgfkeysalsofrom\JLKVMacroTeaserHeaderOptions}] + \textcolor{\JLKVMacroTeaserHeaderColor}{\JLArticleName\thearticle~\ifdef{\JLKVMacroArticleHeadline}{\JLKVMacroArticleHeadline}{}} + \end{tcolorbox}% + % Typesetting possible additional header content + \ifdefempty{\JLKVMacroTeaserHeaderContent}{}{% + \begin{tcolorbox}[colback=white,boxrule=0pt,sharp corners,nobeforeafter]% + \JLKVMacroTeaserHeaderContent% + \end{tcolorbox}% + }% + \phantomsection% + \label{jlarticle::\JLKVMacroInternalMode::\number\value{article}}% + \hypertarget{jlarticle::\JLKVMacroInternalMode::\number\value{article}}{}% + \@@jumpline@@addcontentsline[#1]% + % Now unbox it + \begingroup% + \noindent\unvbox#2% + \endgroup% + \vskip\JLKVMacroContinuedOnTopskip% + \ifdef{\JLKVMacroArticleAuthor}{\raggedleft \byauthor\JLKVMacroArticleAuthor\par}{}% + \ifdimless{\JLKVMacroArticleFullHeight}{\JLKVMacroTeaserHeight}{% + }{% + \raggedleft\textit{\bfseries\ContinuedOn\Pagename~\pageref{jlarticle::\number\value{article}}} % Change later on to be more configurable! + }% + \vskip\JLKVMacroContinuedOnBottomskip% + \endgroup% +}% + + + +\NewDocumentCommand{\DisplayContinuedArticle}{+m+m}{% + \begingroup% + \setkeys{jumpline}{#1,internalmode=Continued}% + \ifdimgreater{\JLKVMacroArticleFullHeight}{\JLKVMacroTeaserHeight}{% + \begin{tcolorbox}[code={\pgfkeysalsofrom\JLKVMacroContinuedArticleHeaderOptions}]% + \textcolor{\JLKVMacroContinuedHeaderColor}{{\raggedleft\ContinuedFrom\JLArticleName\ref{jlarticle::Teaser::\number\value{article}} \OnPage \pageref{jlarticle::Teaser::\number\value{article}}}}% + \end{tcolorbox} + \ifdefempty{\JLKVMacroContinuedArticleHeaderContent}{}{% + \noindent\begin{tcolorbox}[boxsep=0pt,boxrule=0pt,colback=white,sharp corners,nobeforeafter]% + \JLKVMacroContinuedArticleHeaderContent% + \end{tcolorbox}% + }% + \phantomsection\label{jlarticle::\number\value{article}}% + \hypertarget{jlarticle::\JLKVMacroInternalMode::\number\value{article}}{}% + \@@jumpline@@addcontentsline[#1]% + \noindent\unvbox#2% + }{}% + \endgroup% +}% + +\NewDocumentCommand{\@@jumplines@@showcontinuedarticle}{+m}{% + \refstepcounter{article}% + \begingroup% + \setcounter{@@jumplines@@internaldocounter}{0}% + \renewcommand{\do}[1]{% + \stepcounter{@@jumplines@@internaldocounter}% + \ifnumequal{\value{@@jumplines@@internaldocounter}}{\value{article}}{% + \DisplayContinuedArticle{##1}{#1}% + \listbreak% + }{}}% + \dolistcsloop{JumplineOptionsList}% + \endgroup% +}% + +\NewDocumentCommand{\@@jumplines@@showteaser}{+m}{% + \refstepcounter{article}% + \begingroup% + \setcounter{@@jumplines@@internaldocounter}{0}% + \renewcommand{\do}[1]{% + \stepcounter{@@jumplines@@internaldocounter}% + \ifnumequal{\value{@@jumplines@@internaldocounter}}{\value{article}}{% + \DisplayJumplineTeaser{##1}{#1}% + \listbreak% + }{% + % Do nothing in this case + }% + }% End of \do definition + \dolistcsloop{JumplineOptionsList}% + \endgroup% +}% + + + +\NewDocumentCommand{\ShipoutArticleTeasers}{}{% + % Do it for safety reasons% + \setcounter{article}{0}% + \phantomsection\hypertarget{teaserarticlesstart}{}% + \@@jumpline@@bookmark[level=section,dest=teaserarticlesstart]{\articlesname}% + \forlistcsloop{\@@jumplines@@showteaser}{TeaserBoxList}% +}% + +\NewDocumentCommand{\ShipoutArticleHangingArticles}{}{% + \setcounter{article}{0}% + \phantomsection\hypertarget{continuedarticlesstart}{}% + \@@jumpline@@bookmark[level=section,dest=continuedarticlesstart]{\listofcontinuedarticlesname} + \forlistcsloop{\@@jumplines@@showcontinuedarticle}{ContinuedArticleList}% +}% + + + + + +\endinput
\ No newline at end of file |