diff options
author | Karl Berry <karl@freefriends.org> | 2013-12-05 00:09:12 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2013-12-05 00:09:12 +0000 |
commit | ff27a4afbbe5da5f18f62fc47cce84e746c8ce6c (patch) | |
tree | 97d0d3b63e4cdbf1495bdd35bf68af5988bfe657 /Master/texmf-dist/tex/latex/lexref/lexref.sty | |
parent | 1f584cd4b06d66903c0ff82dcd1a7f03066a081d (diff) |
lexref (4dec13)
git-svn-id: svn://tug.org/texlive/trunk@32323 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/lexref/lexref.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/lexref/lexref.sty | 433 |
1 files changed, 433 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/lexref/lexref.sty b/Master/texmf-dist/tex/latex/lexref/lexref.sty new file mode 100644 index 00000000000..3a91e00d712 --- /dev/null +++ b/Master/texmf-dist/tex/latex/lexref/lexref.sty @@ -0,0 +1,433 @@ +%------------ identification -------------- +\ProvidesPackage{lexref}[2013/12/03 v1.0a]% +\NeedsTeXFormat{LaTeX2e}% +%------------ package loading -------------- +\RequirePackage{etoolbox}% +\RequirePackage{xargs}% +\RequirePackage{xstring}% +\RequirePackage{nomencl}% +\RequirePackage{splitidx}% +%------------ initial code -------------- +% Toggle and counter creation +\newtoggle{lexnoprint} +\newtoggle{lexindexing} +\newtoggle{lexnomencl} +\newtoggle{lexpluralform} +\newtoggle{lexaltoverride} +\newtoggle{lexshortcutstolist} +\newtoggle{lexrefCHfr} +\newtoggle{lexrefCHde} +\newtoggle{lexrefDE} +\newcounter{lexcitecountinteger} +% Error messages setting +\newcommand{\lexcite@err@invalidthirdarg@DeclareLex}{\PackageError{lexref}{% +Third argument of \protect\DeclareLex\space must +be either 'alt' or nothing. Check your \protect\DeclareCite\space macros}} +%------------ declaration of options -------------- +\DeclareOption{noprint}{\toggletrue{lexnoprint}} +\DeclareOption{indexing}{\toggletrue{lexindexing}\makeindex} +\DeclareOption{nomencl}{\toggletrue{lexnomencl}\robustify{\nomenclature}\makenomenclature} +\DeclareOption{shortcutstolist}{\toggletrue{lexshortcutstolist}\makenomenclature} +\DeclareOption{CHfr}{\toggletrue{lexrefCHfr}} +\DeclareOption{CHde}{\toggletrue{lexrefCHde}} +\DeclareOption{DE}{\toggletrue{lexrefDE}} +%------------ execution of options -------------- +\ProcessOptions +%------------ main code -------------- +% DEFINITION OF LITERAL PREFIXES AND SHORTCUTS +\newcommandx{\NewLexShortcut}[3][3]{% +\ifdef{#1}{% This test makes sure an already defined command is overrided, ensuring the nomenclature tests will work properly +\renewrobustcmd{#1}{#2% +\iftoggle{lexshortcutstolist}{% Entry in nomenclature, if option activated and #3 defined. + \ifstrempty{#3}% + {}% + {\ifcsdef{nomalreadydef#2}% Nomencl crashes if the same act is already passed to \nomenclature in another page, so this test ensures it won't be passed more than once + {}% + {% + \nomenclature{#2}{#3}% + \expandafter\newcommand\csname nomalreadydef#2\endcsname\relax% + }% + }% + }% + {}% +}}% +{% +\newrobustcmd{#1}{#2% +\iftoggle{lexshortcutstolist}{% Entry in nomenclature, if option activated and #3 defined. + \ifstrempty{#3}% + {}% + {\ifcsdef{nomalreadydef#2}% Nomencl crashes if the same act is already passed to \nomenclature in another page, so this test ensures it won't be passed more than once + {}% + {% + \nomenclature{#2}{#3}% + \expandafter\newcommand\csname nomalreadydef#2\endcsname\relax% + }% + }% + }% + {}% +}}% +}% +% Following shortcuts may be redefined using \RenewLexShortcut +\newcommandx{\RenewLexShortcut}[3][3]{% +\renewrobustcmd{#1}{#2% +\iftoggle{lexshortcutstolist}{% Entry in nomenclature, if option activated and #3 defined. + \ifstrempty{#3}% + {}% + {\ifcsdef{nomalreadydef#2}% Nomencl crashes if the same act is already passed to \nomenclature in another page, so this test ensures it won't be passed more than once + {}% + {% + \nomenclature{#2}{#3}% + \expandafter\newcommand\csname nomalreadydef#2\endcsname\relax% + }% + }% + }% + {}% +}} +% Default shortcuts: english +\NewLexShortcut{\DispPrefixMain}{art.}[article(s)]% +\NewLexShortcut{\DispsPrefixMain}{art.}% +\NewLexShortcut{\DispPrefixAlt}{\S}% +\NewLexShortcut{\DispsPrefixAlt}{\S\S}% +\NewLexShortcut{\SubPrefix}{par.}[paragraph(s)] +\NewLexShortcut{\SubSubPrefixNumber}{nr.}[number(s)] +\NewLexShortcut{\SubSubPrefixLetter}{let.}[letter(s)] +\NewLexShortcut{\sq}{sq.}[sequiturque] +\NewLexShortcut{\sqq}{sqq.}[sequunturque] +\NewLexShortcut{\analog}{by an.}[by analogy] +% french shortcuts +\iftoggle{lexrefCHfr}{% +\RenewLexShortcut{\DispPrefixMain}{art.}[article(s)]% +\RenewLexShortcut{\DispsPrefixMain}{art.}% +\RenewLexShortcut{\DispPrefixAlt}{\S}% +\RenewLexShortcut{\DispsPrefixAlt}{\S\S}% +\RenewLexShortcut{\SubPrefix}{al.}[alin\'ea(s)] +\RenewLexShortcut{\SubSubPrefixNumber}{ch.}[chiffre(s)] +\RenewLexShortcut{\SubSubPrefixLetter}{let.}[lettre(s)] +\RenewLexShortcut{\sq}{s.}[et suivant(e)] +\RenewLexShortcut{\sqq}{ss}[et suivant(e)s] +\RenewLexShortcut{\analog}{p. an.}[par analogie] +\renewrobustcmd{\nomname}{Abr\'eviations} +}{} +% german CH shortcuts +\iftoggle{lexrefCHde}{% +\RenewLexShortcut{\DispPrefixMain}{Art.}[Artikel]% +\RenewLexShortcut{\DispsPrefixMain}{Art.}% +\RenewLexShortcut{\DispPrefixAlt}{\S}% +\RenewLexShortcut{\DispsPrefixAlt}{\S\S}% +\RenewLexShortcut{\SubPrefix}{Abs.}[Absatz, -\"{ }e] +\RenewLexShortcut{\SubSubPrefixNumber}{Ziff.}[Ziffer(n)] +\RenewLexShortcut{\SubSubPrefixLetter}{lit.}[litera] +\RenewLexShortcut{\sq}{f.}[und die folgende] +\RenewLexShortcut{\sqq}{ff.}[und die folgenden] +\RenewLexShortcut{\analog}{analog} +\renewrobustcmd{\nomname}{Abk\"urzungen} +}{} +% german DE shortcuts +\iftoggle{lexrefDE}{% +\RenewLexShortcut{\DispPrefixMain}{\S}% +\RenewLexShortcut{\DispsPrefixMain}{\S\S}% +\RenewLexShortcut{\DispPrefixAlt}{Art.}[Artikel]% +\RenewLexShortcut{\DispsPrefixAlt}{Art.}% +\RenewLexShortcut{\SubPrefix}{Abs.}[Absatz, -\"{ }e] +\RenewLexShortcut{\SubSubPrefixNumber}{Ziff.}[Ziffer(n)] +\RenewLexShortcut{\SubSubPrefixLetter}{lit.}[litera] +\RenewLexShortcut{\sq}{f.}[und die folgende] +\RenewLexShortcut{\sqq}{ff.}[und die folgenden] +\RenewLexShortcut{\analog}{analog} +\renewrobustcmd{\nomname}{Abk\"urzungen} +}{} +% Latin shortcuts +\NewLexShortcut{\bis}{$^{bis}$} +\NewLexShortcut{\ter}{$^{ter}$} +\NewLexShortcut{\quater}{$^{quater}$} +\NewLexShortcut{\quinquies}{$^{quinquies}$} +\NewLexShortcut{\sexies}{$^{sexies}$} +\NewLexShortcut{\septies}{$^{septies}$} +\NewLexShortcut{\octies}{$^{octies}$} +\NewLexShortcut{\nonies}{$^{nonies}$} + +% FRONT-END USER INTERFACE + + % #1 = Act abbr. + % #2 = Act full name + % #3 = alt option + +\newcommandx{\DeclareLex}[3][2,3]{% +\protecting{% +% 1) Creation of \newindex, if needed +\iftoggle{lexindexing}{\newindex[#2]{#1}}{}% +% 2) Creation of \#1 command +\expandafter\newcommandx\csname#1\endcsname[4][2,3,4]{% +\ifstrempty{#3}{\togglefalse{lexaltoverride}}{\ifstrequal{#3}{alt}{\toggletrue{lexaltoverride}}{\lexcite@err@invalidthirdarg@DeclareLex}}%Checking whether #3 is blank or set to 'alt', else: error +\iftoggle{lexnoprint}{}{\LexRef{#1}{##1}[##2][##3][##4]}% Printing, unless noprint option activated +\iftoggle{lexnomencl}{% Entry in nomenclature, if option activated and #2 defined. + \ifstrempty{#2}% + {}% + {\ifcsdef{nomalreadydef#1}% Nomencl crashes if the same act is already passed to \nomenclature in another page, so this test ensures it won't be passed more than once + {}% + {% + \nomenclature{#1}{#2}% + \expandafter\newcommand\csname nomalreadydef#1\endcsname\relax}% + }% + }% + {}% +\iftoggle{lexindexing}{\LexIndex{#1}{##1}[##2][##3][##4]}{}% Indexing, if option activated +}% +% 3) Creation of \#1ns command +\expandafter\newcommandx\csname #1ns\endcsname[4][2,3,4]{% +\ifstrempty{#3}{\togglefalse{lexaltoverride}}{\ifstrequal{#3}{alt}{\toggletrue{lexaltoverride}}{\lexcite@err@invalidthirdarg@DeclareLex}}%Checking whether #3 is blank or set to 'alt', else: error +\iftoggle{lexnoprint}{}{\LexRefns{#1}{##1}[##2][##3][##4]}% Printing, unless noprint option activated +\iftoggle{lexindexing}{\LexIndex{#1}{##1}[##2][##3][##4]}{}% Indexing, if option activated +}% +% 4) Creation of \np#1 command +\expandafter\newcommandx\csname np#1\endcsname[4][2,3,4]{% +\iftoggle{lexnoprint}{}{\npLexRef{#1}{##1}[##2][##3][##4]}% Printing, unless noprint option activated +\iftoggle{lexnomencl}{% Entry in nomenclature, if option activated and #2 defined. + \ifstrempty{#2}% + {}% + {\ifcsdef{nomalreadydef#1}% Nomencl crashes if the same act is already passed to \nomenclature in another page, so this test ensures it won't be passed more than once + {}% + {% + \nomenclature{#1}{#2}% + \expandafter\newcommand\csname nomalreadydef#1\endcsname\relax}% + }% + }% + {}% +\iftoggle{lexindexing}{\LexIndex{#1}{##1}[##2][##3][##4]}{}% Indexing, if option activated +}% +% 5) Creation of \np#1ns command +\expandafter\newcommandx\csname np#1ns\endcsname[4][2,3,4]{% +\iftoggle{lexnoprint}{}{\npLexRefns{#1}{##1}[##2][##3][##4]}% Printing, unless noprint option activated +\iftoggle{lexindexing}{\LexIndex{#1}{##1}[##2][##3][##4]}{}% Indexing, if option activated +}% +% 6) Creation of \idx#1 command +\iftoggle{lexindexing}{\expandafter\newcommandx\csname idx#1\endcsname[4][2,3,4]{% +\LexIndex{#1}{##1}[##2][##3][##4]}}{}% Indexing, if option activated +}} + +% PRINTING MACROS + +\newrobustcmd{\LexRefPrefixTests}[1]{% +% Testing if singular or plural profix needed +\IfSubStr{#1}{\sq}% First testing if string contains \sq or \sqq + {\toggletrue{lexpluralform}}% if yes, plural form + {% else + \IfSubStr{#1}{-}% testing if string contains a dash + {\toggletrue{lexpluralform}}% if yes, plural form + {% else + \IfSubStr{#1}{,}% testing if string contains a comma + {\toggletrue{lexpluralform}}% if yes, plural form + {\togglefalse{lexpluralform}}% else singular form + }% + }% +% Printing MAIN or ALT Prefix depending on lexaltoverride, and singular/plural depending on previous test +\iftoggle{lexpluralform}% + {\iftoggle{lexaltoverride}% + {\DispsPrefixAlt}% + {\DispsPrefixMain}% + }% + {\iftoggle{lexaltoverride}% + {\DispPrefixAlt}% + {\DispPrefixMain}% + }% +} + +% Macro with prefix and suffix +\newcommandx{\LexRef}[5][3,4,5]{% +\LexRefPrefixTests{#2} % +#2% +\ifstrempty{#3}{}{ \SubPrefix{} #3}% +\ifstrempty{#4}{}{ \SubSubPrefixNumber{} #4}% +\ifstrempty{#5}{}{ \SubSubPrefixLetter{} #5}% +{} #1% +} + +% Macro with prefix, without suffix +\newcommandx{\LexRefns}[5][3,4,5]{% +\LexRefPrefixTests{} % +#2% +\ifstrempty{#3}{}{ \SubPrefix{} #3}% +\ifstrempty{#4}{}{ \SubSubPrefixNumber{} #4}% +\ifstrempty{#5}{}{ \SubSubPrefixLetter{} #5}% +} + +% Macro without prefix, with suffix +\newcommandx{\npLexRef}[5][3,4,5]{% +#2% +\ifstrempty{#3}{}{ \SubPrefix{} #3}% +\ifstrempty{#4}{}{ \SubSubPrefixNumber{} #4}% +\ifstrempty{#5}{}{ \SubSubPrefixLetter{} #5}% +{} #1% +} + +% Macro without prefix nor suffix +\newcommandx{\npLexRefns}[5][3,4,5]{% +#2% +\ifstrempty{#3}{}{ \SubPrefix{} #3}% +\ifstrempty{#4}{}{ \SubSubPrefixNumber{} #4}% +\ifstrempty{#5}{}{ \SubSubPrefixLetter{} #5}% +} + + +% INDEXING MACRO + +\newcommandx{\LexIndex}[5][3,4,5]{% +% 1) First cleaning +\noexpandarg% +\IfSubStr{#2}{\sq}% Test \sq + {\StrBefore{#2}{\sq}[\lexciteindextempone]\fullexpandarg\StrGobbleRight{\lexciteindextempone}{1}[\lexciteindextempone]\noexpandarg}% if true, take everything before and remove the space + {% else + \IfSubStr{#2}{\sqq}% Test \sqq + {\StrBefore{#2}{\sqq}[\lexciteindextempone]\fullexpandarg\StrGobbleRight{\lexciteindextempone}{1}[\lexciteindextempone]\noexpandarg}% if true, take everything before and remove the space + {% + \IfSubStr{#2}{-}% Test dash + {\StrBefore{#2}{-}[\lexciteindextempone]}% if true, take everything before + {\ifdef{\lexciteindextempone}{\renewcommand{\lexciteindextempone}{#2}}{\newcommand{\lexciteindextempone}{#2}}} + }% + }% else take everything +% 2) Second cleaning +\fullexpandarg% +\IfInteger{\lexciteindextempone}% Test if integer + {}% if true do nothing + {% else + \StrGobbleRight{\lexciteindextempone}{1}[\lexciteindextempone]% delete last char in string + \IfInteger{\lexciteindextempone} + {}% if true do nothing + {% else + \StrGobbleRight{\lexciteindextempone}{1}[\lexciteindextempone]% delete last char in string + \IfInteger{\lexciteindextempone} + {}% + {% else + \StrGobbleRight{\lexciteindextempone}{1}[\lexciteindextempone]% delete last char in string + \IfInteger{\lexciteindextempone} + {}% + {% else + \StrGobbleRight{\lexciteindextempone}{1}[\lexciteindextempone]% delete last char in string + \IfInteger{\lexciteindextempone} + {}% + {% else + \StrGobbleRight{\lexciteindextempone}{1}[\lexciteindextempone]% delete last char in string + \IfInteger{\lexciteindextempone} + {}% + {% else + \StrGobbleRight{\lexciteindextempone}{1}[\lexciteindextempone]% delete last char in string + \IfInteger{\lexciteindextempone} + {}% + {% else + \StrGobbleRight{\lexciteindextempone}{1}[\lexciteindextempone]% delete last char in string + \IfInteger{\lexciteindextempone} + {}% + {% else + \StrGobbleRight{\lexciteindextempone}{1}[\lexciteindextempone]% delete last char in stringe + \IfInteger{\lexciteindextempone} + {}% + {% else + \StrGobbleRight{\lexciteindextempone}{1}[\lexciteindextempone]% delete last char in string + \IfInteger{\lexciteindextempone} + {}% + {% else + \StrGobbleRight{\lexciteindextempone}{1}[\lexciteindextempone]% delete last char in string + \IfInteger{\lexciteindextempone} + {}% + {}% + }% + }% + }% + }% + }% + }% + }% + }% + }% + }% +% 3) Counting the cleaned integer +\StrLen{\lexciteindextempone}[\lexciteindextemptwo]% +% 4) Proper indexation, sorting (1, 10, 100 or 1000) depending of integer length (1, 2, 3, 4) and of opt args of each entry +\ifdefstring{\lexciteindextemptwo}{1}% integer length = 1 + {\ifboolexpr{% if #3, #4 and #5 are defined + not test {\ifstrempty{#3}}% + and% + not test {\ifstrempty{#4}}% + and% + not test {\ifstrempty{#5}}% + }% + {\sindex[#1]{1@#1 #2!-- \SubPrefix{} #3}}% index only takes #3 as subentry + {% + \sindex[#1]{1@#1 #2% else: indexing everything + \ifstrempty{#3}{}{!-- \SubPrefix{} #3}% + \ifstrempty{#4}{}{!-- \SubSubPrefixNumber{} #4}% + \ifstrempty{#5}{}{!-- \SubSubPrefixLetter{} #5}% + }}% + }% + {\ifdefstring{\lexciteindextemptwo}{2}% integer length = 2 + {\ifboolexpr{% if #3, #4 and #5 are defined + not test {\ifstrempty{#3}}% + and% + not test {\ifstrempty{#4}}% + and% + not test {\ifstrempty{#5}}% + }% + {\sindex[#1]{10@#1 #2!-- \SubPrefix{} #3}}% index only takes #3 as subentry + {% + \sindex[#1]{10@#1 #2% else: indexing everything + \ifstrempty{#3}{}{!-- \SubPrefix{} #3}% + \ifstrempty{#4}{}{!-- \SubSubPrefixNumber{} #4}% + \ifstrempty{#5}{}{!-- \SubSubPrefixLetter{} #5}% + }}% + }% + {\ifdefstring{\lexciteindextemptwo}{3}% integer length = 3 + {\ifboolexpr{% if #3, #4 and #5 are defined + not test {\ifstrempty{#3}}% + and% + not test {\ifstrempty{#4}}% + and% + not test {\ifstrempty{#5}}% + }% + {\sindex[#1]{100@#1 #2!-- \SubPrefix{} #3}}% index only takes #3 as subentry + {% + \sindex[#1]{100@#1 #2% else: indexing everything + \ifstrempty{#3}{}{!-- \SubPrefix{} #3}% + \ifstrempty{#4}{}{!-- \SubSubPrefixNumber{} #4}% + \ifstrempty{#5}{}{!-- \SubSubPrefixLetter{} #5}% + }}% + }% + {\ifdefstring{\lexciteindextemptwo}{4}% integer length = 4 + {\ifboolexpr{% if #3, #4 and #5 are defined + not test {\ifstrempty{#3}}% + and% + not test {\ifstrempty{#4}}% + and% + not test {\ifstrempty{#5}}% + }% + {\sindex[#1]{1000@#1 #2!-- \SubPrefix{} #3}}% index only takes #3 as subentry + {% + \sindex[#1]{1000@#1 #2% else: indexing everything + \ifstrempty{#3}{}{!-- \SubPrefix{} #3}% + \ifstrempty{#4}{}{!-- \SubSubPrefixNumber{} #4}% + \ifstrempty{#5}{}{!-- \SubSubPrefixLetter{} #5}% + }}% + }% + {\ifdefstring{\lexciteindextemptwo}{5}% integer length = 5 + {\ifboolexpr{% if #3, #4 and #5 are defined + not test {\ifstrempty{#3}}% + and% + not test {\ifstrempty{#4}}% + and% + not test {\ifstrempty{#5}}% + }% + {\sindex[#1]{10000@#1 #2!-- \SubPrefix{} #3}}% index only takes #3 as subentry + {% + \sindex[#1]{10000@#1 #2% else: indexing everything + \ifstrempty{#3}{}{!-- \SubPrefix{} #3}% + \ifstrempty{#4}{}{!-- \SubSubPrefixNumber{} #4}% + \ifstrempty{#5}{}{!-- \SubSubPrefixLetter{} #5}% + }}% + }% + {}% + }% + }% + }% + }% +} + +\endinput
\ No newline at end of file |