diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/wtref/wtref.sty |
Initial commit
Diffstat (limited to 'macros/latex/contrib/wtref/wtref.sty')
-rw-r--r-- | macros/latex/contrib/wtref/wtref.sty | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/macros/latex/contrib/wtref/wtref.sty b/macros/latex/contrib/wtref/wtref.sty new file mode 100644 index 0000000000..a196692ae3 --- /dev/null +++ b/macros/latex/contrib/wtref/wtref.sty @@ -0,0 +1,179 @@ +% +% wtref.sty +% + +% Package declaration +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{wtref}[2017/01/17 v0.3.2 Extend cross-reference system] +\def\wtrf@pkgname{WTRef} +\RequirePackage{xkeyval} + +% Messages +\def\wtrf@info{\PackageInfo\wtrf@pkgname} +\def\wtrf@warn{\PackageWarningNoLine\wtrf@pkgname} +\def\wtrf@error{\PackageError\wtrf@pkgname} + +% New ifs and counts +\newif\if@wtrf@use@scope@ +\newif\if@wtrf@use@namespace@ +\newif\if@wtrf@set@namespace@ +\newcount\wtrf@tempcnta +\newcount\wtrf@tempcntb + +% Utilities +\def\wtrf@name@def#1{\expandafter\def\csname #1\endcsname} +\def\wtrf@name@edef#1{\expandafter\edef\csname #1\endcsname} +\def\wtrf@name@use#1{\csname #1\endcsname} +\def\wtrf@if@option@exists{\@ifnextchar[} +\def\wtrf@if@reftype@not@exists#1{\@ifundefined{wtrf@#1@namespace}} + +% Check commands +\def\wtrf@check@counter#1{% + \@ifundefined{c@#1}{% + \wtrf@error + {Undefined LaTeX counter '#1'} + {Check the spelling or declare new LaTeX counter}% + }{}} +\def\wtrf@check@command#1{% + \@ifundefined{#1}{}{% else + \wtrf@warn{Redefining \expandafter\string\csname#1\endcsname}}} + +% Trimming spaces +\def\wtrf@inner@setkeys#1{\setkeys[wtrf]{inner}{key=#1}} +\def\wtrf@trimming@spaces#1{% + \define@key[wtrf]{inner}{key}{\def#1{##1}}% + \expandafter\wtrf@inner@setkeys\expandafter{#1}% + \disable@keys[wtrf]{inner}{key}} + +% Define keys for \newref command +\define@key[wtrf]{ns}{namespace}{% + \@wtrf@set@namespace@true + \def\wtrf@namespace@temp{#1}} +\define@key[wtrf]{ns}{nonamespace}[\@empty]{% + \@wtrf@use@namespace@false} +\define@key[wtrf]{ns}{scope}{% + \wtrf@check@counter{#1}% + \@wtrf@use@scope@true + \def\wtrf@scope@temp{#1}} + +% Define \newref command +\newcommand{\newref}{% + \let\wtrf@namespace@temp\@empty + \@wtrf@use@namespace@true + \@wtrf@set@namespace@false + \@wtrf@use@scope@false + \wtrf@if@option@exists + {\wtrf@set@namespace} + {\wtrf@@newref}} +\@onlypreamble\newref +\def\wtrf@set@namespace[#1]{% + \setkeys[wtrf]{ns}{#1}% + \wtrf@@newref} +\def\wtrf@@newref#1{% + \@for\wtrf@temp@ref@type:=#1\do{% + \wtrf@trimming@spaces\wtrf@temp@ref@type + \expandafter\wtrf@newref@pre\expandafter{\wtrf@temp@ref@type}}} +\def\wtrf@newref@pre#1{% + \wtrf@if@reftype@not@exists{#1}{% + \wtrf@newref{#1}% + }{% else + \wtrf@error + {ref type '#1' already exists} + {You can declare ref type only once}% + }} +\def\wtrf@newref#1{% + % define namespace + \if@wtrf@use@namespace@ + \ifx\wtrf@namespace@temp\@empty + \@wtrf@set@namespace@false + \def\wtrf@namespace@temp{#1}% + \fi + \wtrf@name@edef{wtrf@#1@namespace}{\wtrf@namespace@temp:}% + \else + \wtrf@name@def{wtrf@#1@namespace}{}% + \fi + % define scope + \if@wtrf@use@scope@ + \wtrf@name@edef{wtrf@#1@scope@cmd}{the\wtrf@scope@temp}% + \wtrf@name@def{wtrf@#1@scope}{\csname\wtrf@name@use{wtrf@#1@scope@cmd}\endcsname:}% + \else + \wtrf@name@def{wtrf@#1@scope}{}% + \fi + % define keys for setting styles + \define@key[wtrf]{#1-style}{refcmd}{\wtrf@name@def{wtrf@#1@refcmd}####1{##1}}% + \define@key[wtrf]{#1-style}{last sep}[\wtrf@name@use{wtrf@#1@sep}]{% + \wtrf@name@def{wtrf@#1@last@sep}{##1}}% + \define@cmdkeys[wtrf]{#1-style}[wtrf@#1@]{sep, prefix, suffix}% + % default key settings + \setkeys[wtrf]{#1-style}{% + refcmd=\ref{##1}, + sep={,\space}, last sep, + prefix={}, suffix={}}% + % define label command + \wtrf@check@command{#1label}% + \wtrf@name@def{#1label}{\protect\wtrf@name@use{wtrf@#1label}} + \wtrf@name@def{wtrf@#1label}##1{% + \label{\wtrf@name@use{wtrf@#1@namespace}\wtrf@name@use{wtrf@#1@scope}##1}}% + % define ref command + \wtrf@check@command{#1ref}% + \wtrf@name@def{#1ref}{\protect\wtrf@name@use{wtrf@#1ref}} + \wtrf@name@def{wtrf@#1ref}{% + \wtrf@if@option@exists + {\wtrf@name@use{wtrf@#1ref@with@option}} + {\def\wtrf@scope{\wtrf@name@use{wtrf@#1@scope}}\wtrf@name@use{wtrf@#1@print}}}% + % when option exists + \if@wtrf@use@scope@ + \wtrf@name@def{wtrf@#1ref@with@option}[##1]##2{% + \def\wtrf@scope{##1:}% + \wtrf@name@use{wtrf@#1@print}{##2}}% + \else + \wtrf@name@def{wtrf@#1ref@with@option}[##1]##2{% + \let\wtrf@scope\@empty + \wtrf@name@use{wtrf@#1@print}{##2}}% + \fi + % print refs + \wtrf@name@def{wtrf@#1@print}##1{% + \wtrf@tempcnta\z@ + \@for\wtrf@member:=##1\do{\advance\wtrf@tempcnta\@ne}% + \ifnum\wtrf@tempcnta<\tw@ + \wtrf@name@use{wtrf@#1@prefix}% + \wtrf@name@use{wtrf@#1@refcmd}{% + \wtrf@name@use{wtrf@#1@namespace}\wtrf@scope##1}% + \wtrf@name@use{wtrf@#1@suffix}% + \else + \wtrf@tempcntb\@ne + \advance\wtrf@tempcnta\m@ne + \wtrf@name@use{wtrf@#1@prefix}% + \@for\wtrf@temp@label:=##1\do{% + \wtrf@trimming@spaces\wtrf@temp@label + \wtrf@name@use{wtrf@#1@refcmd}{% + \wtrf@name@use{wtrf@#1@namespace}\wtrf@scope\wtrf@temp@label}% + \ifnum\wtrf@tempcnta>\wtrf@tempcntb + \wtrf@name@use{wtrf@#1@sep}% + \else\ifnum\wtrf@tempcnta=\wtrf@tempcntb + \wtrf@name@use{wtrf@#1@last@sep}% + \fi\fi + \advance\wtrf@tempcntb\@ne}% + \wtrf@name@use{wtrf@#1@suffix}% + \fi}% + % reset \wtrf@namespace@temp + \if@wtrf@set@namespace@\else + \let\wtrf@namespace@temp\@empty + \fi} + +% Define \setrefstyle command +\newcommand{\setrefstyle}[2]{% + \@for\wtrf@temp@ref@type:=#1\do{% + \wtrf@trimming@spaces\wtrf@temp@ref@type + \expandafter\wtrf@setrefstyle\expandafter{\wtrf@temp@ref@type}{#2}}} +\def\wtrf@setrefstyle#1#2{% + \wtrf@if@reftype@not@exists{#1}{% + \wtrf@error + {ref type '#1' does not exist} + {You can declare ref type only once}% + }{% else + \setkeys[wtrf]{#1-style}{#2}% + }} + +% EOF +\endinput |