summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/wtref/wtref.sty
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/wtref/wtref.sty
Initial commit
Diffstat (limited to 'macros/latex/contrib/wtref/wtref.sty')
-rw-r--r--macros/latex/contrib/wtref/wtref.sty179
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