From 7c8d0edea78bbaa87a816da41a6351a7cb7edd0f Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Tue, 20 Nov 2012 01:12:02 +0000 Subject: glossaries (19nov12) git-svn-id: svn://tug.org/texlive/trunk@28305 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/scripts/glossaries/glossaries.perl | 4460 ++++++++++++++++++++ .../texmf-dist/scripts/glossaries/makeglossaries | 17 +- .../scripts/glossaries/makeglossaries.bat | 6 +- Master/texmf-dist/scripts/glossaries/mfirstuc.perl | 129 + 4 files changed, 4604 insertions(+), 8 deletions(-) create mode 100644 Master/texmf-dist/scripts/glossaries/glossaries.perl create mode 100644 Master/texmf-dist/scripts/glossaries/mfirstuc.perl (limited to 'Master/texmf-dist/scripts/glossaries') diff --git a/Master/texmf-dist/scripts/glossaries/glossaries.perl b/Master/texmf-dist/scripts/glossaries/glossaries.perl new file mode 100644 index 00000000000..d615d83ab08 --- /dev/null +++ b/Master/texmf-dist/scripts/glossaries/glossaries.perl @@ -0,0 +1,4460 @@ +# File : glossaries.perl +# Author : Nicola L.C. Talbot +# Date : 14th June 2007 +# Last Modified : 2012-09-21 +# Version : 1.05 +# Description : LaTeX2HTML (limited!) implementation of glossaries +# package. Note that not all the glossaries.sty +# macros have been implemented. + +# This is a LaTeX2HTML style implementing the glossaries package, and +# is distributed as part of that package. +# Copyright 2007 Nicola L.C. Talbot +# This work may be distributed and/or modified under the +# conditions of the LaTeX Project Public License, either version 1.3 +# of this license of (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'. +# +# The Current Maintainer of this work is Nicola Talbot. + +# This work consists of the files glossaries.dtx and glossaries.ins +# and the derived files glossaries.sty, glossary-hypernav.sty, +# glossary-list.sty, glossary-long.sty, glossary-super.sty, +# glossaries.perl, mfrstuc.perl. Also makeglossaries and makeglossaries.bat + +package main; + +&do_require_package("mfirstuc"); + + %glossary_style = (); + &set_glossarystyle('altlist');# default style + + $CURRENT_STYLE='altlist'; + +&process_commands_nowrap_in_tex( <<_RAW_ARG_CMDS_); +newglossarystyle # {} # {} +_RAW_ARG_CMDS_ + +# These are the only package options implemented. + +sub do_glossaries_style_altlist{ +} + +sub do_glossaries_toc{ +} + +sub do_glossaries_toc_true{ +} + +$INDEXONLYFIRST=0; + +sub do_glossaries_indexonlyfirst{ + $INDEXONLYFIRST=1; +} + +$gls_nonumberlist{'main'} = 0; + +sub do_glossaries_nonumberlist{ + $gls_nonumberlist{'main'} = 1; +} + +$GLSCURRENTFORMAT="textrm" if (!defined($GLSCURRENTFORMAT)); +$GLOSSARY_END_DESCRIPTION = '.' if (!defined($GLOSSARY_END_DESCRIPTION)); + +sub do_cmd_glossaryname{ + "Glossary$_[0]" +} + +$gls_mark{'main'} = ""; +$gls_file_mark{'main'} = ""; +$gls_title{'main'} = "\\glossaryname"; +$gls_toctitle{'main'} = "\\glossaryname"; +$delimN{'main'} = ", "; +$glsnumformat{'main'} = $GLSCURRENTFORMAT; +@{$gls_entries{'main'}} = (); +$gls_displayfirst{'main'} = "glsdisplayfirst"; +$gls_display{'main'} = "glsdisplay"; + + %glsentry = (); + +$acronymtype = 'main'; + +sub do_glossaries_acronym{ + &do_glossaries_acronym_true +} + +sub do_glossaries_acronym_true{ + &make_newglossarytype("acronym", "\\acronymname"); + $acronymtype = 'acronym'; +} + +sub do_glossaries_acronym_false{ + $acronymtype = 'main'; +} + +sub do_cmd_acronymname{ + join('', 'Acronyms', $_[0]); +} + +sub do_cmd_acronymtype{ + join('', $acronymtype, $_[0]); +} + +$global{'glossaryentry'} = 0; +$global{'glossarysubentry'} = 0; + +sub do_cmd_theglossaryentry{ + join('', $global{'glossaryentry'}, $_[0]); +} + +sub do_cmd_theglossarysubentry{ + join('', $global{'glossarysubentry'}, $_[0]); +} + +sub do_glossaries_entrycounter{ + &do_glossaries_entrycounter_true +} + +sub do_glossaries_entrycounter_true{ + eval(<<'_END_DEF'); + sub do_cmd_glsresetentrycounter{ + $global{'entrycounter'} = 0; + $_[0]; + } +_END_DEF +} + +sub do_glossaries_entrycounter_false{ + eval(<<'_END_DEF'); + sub do_cmd_glsresetentrycounter{ + $_[0]; + } +_END_DEF +} + +sub do_cmd_glsresetentrycounter{$_[0];} + +sub do_glossaries_subentrycounter{ + &do_glossaries_subentrycounter_true +} + +sub do_glossaries_subentrycounter_true{ + eval(<<'_END_DEF'); + sub do_cmd_glsresetsubentrycounter{ + $global{'subentrycounter'} = 0; + $_[0]; + } +_END_DEF +} + +sub do_glossaries_subentrycounter_false{ + eval(<<'_END_DEF'); + sub do_cmd_glsresetsubentrycounter{ + $_[0]; + } +_END_DEF +} + +sub do_cmd_glsresetsubentrycounter{ $_[0]; } + +# modify set_depth_levels so that glossary is added + +sub replace_glossary_markers{ + foreach $type (keys %gls_mark) + { + if (defined &add_gls_hook) + {&add_gls_hook if (/$gls_mark{$type}/);} + else + {&add_gls($type) if (/$gls_mark{$type}/);} + + s/$gls_file_mark{$type}/$glsfile{$type}/g; + } +} + +# there must be a better way of doing this +# other than copying the original code and adding to it. +sub replace_general_markers { + if (defined &replace_infopage_hook) {&replace_infopage_hook if (/$info_page_mark/);} + else { &replace_infopage if (/$info_page_mark/); } + if (defined &add_idx_hook) {&add_idx_hook if (/$idx_mark/);} + else {&add_idx if (/$idx_mark/);} + &replace_glossary_markers; + + if ($segment_figure_captions) { +s/$lof_mark/$segment_figure_captions/o + } else { s/$lof_mark/$figure_captions/o } + if ($segment_table_captions) { +s/$lot_mark/$segment_table_captions/o + } else { s/$lot_mark/$table_captions/o } + &replace_morelinks(); + if (defined &replace_citations_hook) {&replace_citations_hook if /$bbl_mark/;} + else {&replace_bbl_marks if /$bbl_mark/;} + if (defined &add_toc_hook) {&add_toc_hook if (/$toc_mark/);} + else {&add_toc if (/$toc_mark/);} + if (defined &add_childs_hook) {&add_childs_hook if (/$childlinks_on_mark/);} + else {&add_childlinks if (/$childlinks_on_mark/);} + &remove_child_marks; + + if (defined &replace_cross_references_hook) {&replace_cross_references_hook;} + else {&replace_cross_ref_marks if /$cross_ref_mark||$cross_ref_visible_mark/;} + if (defined &replace_external_references_hook) {&replace_external_references_hook;} + else {&replace_external_ref_marks if /$external_ref_mark/;} + if (defined &replace_cite_references_hook) {&replace_cite_references_hook;} + else { &replace_cite_marks if /$cite_mark/; } + if (defined &replace_user_references) { + &replace_user_references if /$user_ref_mark/; } + +} + +sub add_gls{ + local($sidx_style, $eidx_style) =('',''); + if ($INDEX_STYLES) { +if ($INDEX_STYLES =~/,/) { +local(@styles) = split(/\s*,\s*/,$INDEX_STYLES); + $sidx_style = join('','<', join('><',@styles) ,'>'); + $eidx_style = join('',''); +} else { + $sidx_style = join('','<', $INDEX_STYLES,'>'); + $eidx_style = join('',''); +} + } + &add_real_gls +} + +sub gls_compare{ + local($x, $y) = @_; + + if ($x eq '' or $y eq '') + { + if ($x ne '') + { + # y is the shorter string + return 1; + } + elsif ($y ne '') + { + # x is the shorter string + return -1; + } + else + { + # both empty + return 0; + } + } + + local($x0) = ''; + local($y0) = ''; + + if ($x=~s/^(&#(?:\d+|x[\da-f]+);)//) + { + $x0 = $1; + } + elsif ($x=~s/^(.)//) + { + $x0 = $1; + } + + if ($y=~s/^(&#(?:\d+|x[\da-f]+);)//) + { + $y0 = $1; + } + elsif ($y=~s/^(.)//) + { + $y0 = $1; + } + + local($numx); + + if ($x0=~/&#(\d+|x[\da-f]+);/) + { + $numx = $1; + + $numx = hex("0$numx") if $numx=~/^x/; + } + else + { + $numx = ord($x0); + } + + local($numy); + + if ($y0=~/&#(\d+|x[\da-f]+);/) + { + $numy = $1; + + $numy = hex("0$numy") if $numy=~/^x/; + } + else + { + $numy = ord($y0); + } + + if ($numx == $numy) + { + return &gls_compare($x, $y); + } + elsif ($numx >= 48 and $numx <= 57) # x in range '0' ... '9' + { + if ($numy >= 48 and $numy <= 57) # y in range '0' ... '9' + { + return $numx <=> $numy; + } + elsif (($numy >= 97 and $numy <= 122) or ($numy >= 65 and $numy <= 90)) # y a letter + { + # digits are less than letters + return -1; + } + else + { + # digits are greater than symbols + return 1; + } + } + elsif (($numx >= 97 and $numx <= 122) or ($numx >= 65 and $numx <= 90)) # x a letter + { + if (($numy >= 97 and $numy <= 122) or ($numy >= 65 and $numy <= 90)) # y a letter + { + if (($numx <= 90 and $numy <= 90) or ($numx >= 97 and $numy >= 97)) + { + # same case (already checked if they are equal) + + return $numx <=> $numy; + } + + # are they upper/lower case versions of each other? + + if (($numx >= 97 and $numy == $numx-32)) + { + # x is upper case version of y + + if ($x or $y) + { + return &gls_compare($x, $y); + } + else + { + return -1; + } + } + + if (($numy >= 97 and $numx == $numy-32)) + { + # y is upper case version of x + + if ($x or $y) + { + return &gls_compare($x, $y); + } + else + { + return 1; + } + } + + # compare lower case values + return lc(chr($numx)) cmp lc(chr($numy)); + } + else + { + # a-z greater than symbols and digits + return 1; + } + } + elsif ($numy >= 48 and $numy <= 57) # y in range '0' ... '9' + { + # already checked for '0' < x < '9' and '0' < y < '9' + # already checked for 'a' < x < 'z' and '0' < y < '9' + + # digits greater than symbols + return 1; + } + elsif (($numy >= 97 and $numy <= 122) or ($numy >= 65 and $numy <= 90)) # y is a letter + { + # already checked for x is digit and y a is letter + # already checked for x is letter and y a is letter + + # symbols and digits are less than letters + + return -1; + } + + $numx <=> $numy +} + +sub gloskeysort{ + + $a=~/^(.*)###(\d+)$/; + + local($labelx) = $1; + local($x_id) =$2; + + $b=~/^(.*)###(\d+)$/; + + local($labely) = $1; + local($y_id) = $2; + + local($sortx) = &gls_get_sort($labelx); + local($sorty) = &gls_get_sort($labely); + + local($n); + + # are they case-insensitive equivalent? + + if (lc($sortx) eq lc($sorty)) + { + $n = ($sortx cmp $sorty); + } + else + { + $n = &gls_compare($sortx, $sorty); + } + + unless ($n) + { + $n = ($x_id <=> $y_id); + } + + $n +} + +sub add_parent_if_required{ + local($label) = @_; + + local($parent) = &gls_get_parent($label); + + if ($parent) + { + local($type) = &gls_get_type($parent); + + # does this parent have a backlink? + + for my $key (keys %{$glossary{$type}}) + { + return if $key=~/^$parent###\d+$/; + } + + # none found, so add empty one + + my $id = ++$global{'max_id'}; + + $glossary{$type}{"$parent###$id"} = ''; + $glossary_entry{$type}{"$parent###$id"} = $parent; + + # check if parent also has a parent + + &add_parent_if_required($parent); + } +} + +sub add_real_gls{ + local($type) = @_; + print "\nDoing glossary '$type' ..."; + local($key, $str, @keys, $thisglsentry, $level, $count, + $previous, $current, $id, $linktext, $delimN); + + $TITLE = $gls_toctitle{$type}; + + local($oldstyle) = $CURRENT_STYLE; + + if ($gls_style{$type}) + { + &set_glossarystyle($gls_style{$type}); + } + + # add any parent entries that haven't been referenced + + for my $key (keys %{$glossary{$type}}) + { + my $label = $key; + $label =~ s/###\d+$//o; # Remove the unique id's + + &add_parent_if_required($label); + } + + @keys = keys %{$glossary{$type}}; + + @keys = sort gloskeysort @keys; + + $level = 0; + + $delimN = $delimN{$type}; + + $previous = ''; + + local($previousentry) = ''; + + my $glossaryentryfield = ''; + + my $previouscat = ''; + + local ($entry); + + foreach $key (@keys) + { + $current = $key; + $current =~ s/\#\#\#\d+$//o; # Remove the unique id's + + my $issame = ($current eq $previous ? 1 : 0); + + $previous = $current; + + $entry = $glossary_entry{$type}{$key}; + + unless ($issame) + { + if ($glossaryentryfield) + { + $id = ++$global{'max_id'}; + + my $level = &gls_get_level($previousentry); + + if ($level > 0) + { + my $id2 = ++$global{'max_id'}; + + $thisglsentry .= + "\\glossarysubentryfield $OP$id2$CP$level$OP$id2$CP$glossaryentryfield$OP$id$CP$linktext$OP$id$CP"; + } + else + { + $thisglsentry .= + "\\glossaryentryfield $glossaryentryfield$OP$id$CP$linktext$OP$id$CP"; + } + + $glossaryentryfield = ''; + } + + $linktext = ''; + + my $currentcat = substr(&gls_get_sort($current), 0, 1); + + if ($currentcat=~/[a-zA-Z]/) + { + $currentcat = uc($currentcat); + } + elsif ($currentcat=~/[0-9]/) + { + $currentcat = 'glsnumbers'; + } + else + { + $currentcat = 'glssymbols'; + } + + unless ($previouscat eq $currentcat) + { + $id = ++$global{'max_id'}; + $thisglsentry .= "\\glsgroupheading$OP$id$CP$currentcat$OP$id$CP"; + + $previouscat = $currentcat; + } + } + + $previousentry = $entry; + + # Back ref + + if ($gls_nonumberlist{$type}) + { + $linktext = ''; + } + elsif ($glossary{$type}{$key}) + { + $id = ++$global{'max_id'}; + + $linktext .= $delimN if ($linktext); + + $linktext .= "$glossary{$type}{$key}\\$glossary_format{$type}{$key}${OP}$id${CP}$glossary_linktext{$type}{$key}${OP}$id${CP}"; + + } + + unless ($issame) + { + $id = ++$global{'max_id'}; + local($name) = &translate_commands( + "\\glsnamefont $OP$id$CP$glsentry{$entry}{name}$OP$id$CP"); + + local($symbol) = ($glsentry{$entry}{'symbol'} ? + " $glsentry{$entry}{symbol}" : ''); + + $id = ++$global{'max_id'}; + my $id2 = ++$global{'max_id'}; + my $id3 = ++$global{'max_id'}; + my $id4 = ++$global{'max_id'}; + + $glossaryentryfield = "$OP$id$CP$entry$OP$id$CP" # label + . "$OP$id2$CP$name$OP$id2$CP" # name + . "$OP$id3$CP$glsentry{$entry}{description}$OP$id3$CP" # description + . "$OP$id4$CP$symbol$OP$id4$CP" # symbol + } + + } + + if ($glossaryentryfield and $entry) + { + my $level = &gls_get_level($entry); + + if ($level > 0) + { + my $id2 = ++$global{'max_id'}; + + $thisglsentry .= + "\\glossarysubentryfield $OP$id2$CP$level$OP$id2$CP$glossaryentryfield$OP$id$CP$linktext$OP$id$CP"; + } + else + { + $id = ++$global{'max_id'}; + $thisglsentry .= + "\\glossaryentryfield $glossaryentryfield$OP$id$CP$linktext$OP$id$CP"; + } + } + + $str = &do_env_theglossary($thisglsentry) . &translate_commands("\\glossarypostamble"); + + if ($gls_style{$type}) + { + &set_glossarystyle($oldstyle); + } + + s/$gls_mark{$type}/$preglossary\n$str\n/s; +} + +sub do_cmd_glstarget{ + local($_) = @_; + + local($id, $label, $text); + + $label = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$label=$2;''/eo; + + $text = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$text=$2;''/eo; + + "$text$_"; +} + +sub do_cmd_newglossarystyle{ + local($_) = @_; + + local($id,$style,$defs); + + $style = &missing_braces unless + s/$next_pair_rx/$id=$1;$style=$2;''/eo; + + $defs = &missing_braces unless + s/$next_pair_rx/$id=$1;$defs=$2;''/eo; + + $glossary_style{$style} = $defs; + + $_; +} + +sub do_cmd_glossarystyle{ + local($_) = @_; + + local($id,$style); + + $style = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$style=$2;''/eo; + + &set_glossarystyle($style); + + $_; +} + +sub set_glossarystyle{ + local($style) = @_; + + $CURRENT_STYLE = $style; + + if ($glossary_style{$style}) + { + local($_) = $glossary_style{$style}; + + s/$O(\d+)$C/$OP$1$CP/g; + + &translate_commands($_); + } + else + { + my $cmd_sub = "set_glossarystyle_$style"; + + if (defined(&$cmd_sub)) + { + &$cmd_sub(); + } + else + { + &write_warnings("Unknown glossary style '$style', defaulting to 'altlist'"); + &set_glossarystyle_altlist(); + + $CURRENT_STYLE = 'altlist'; + } + } + +} + +sub do_cmd_glspar{ "

".$_[0]; } + +sub do_cmd_glossaryheader{ + local($_) = @_; + $_ +} + +sub do_cmd_glsentryitem{ + local($_) = @_; + + local($id, $label); + + $label = &missing_braces unless + s/$next_pair_pr_rx/$id=$1,$label=$2;''/eo; + + $_ +} + +sub do_cmd_glssubentryitem{ + local($_) = @_; + + local($id, $label); + + $label = &missing_braces unless + s/$next_pair_pr_rx/$id=$1,$label=$2;''/eo; + + $_ +} + +sub do_cmd_glsgroupheading{ + local($_) = @_; + + local($id, $heading); + + $heading = &missing_braces unless + s/$next_pair_pr_rx/$id=$1,$heading=$2;''/eo; + + $_; +} + +sub do_cmd_glossaryentryfield{ + local($_) = @_; + + local($id, $label, $name, $desc, $symbol, $backlink); + + $label = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$label=$2;''/eo; + + $name = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$name=$2;''/eo; + + $desc = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$desc=$2;''/eo; + + $symbol = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$symbol=$2;''/eo; + + $backlink = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$backlink=$2;''/eo; + + local($id2) = ++$global{'max_id'}; + + "\\glstarget $OP$id$CP$label$OP$id$CP$OP$id2$CP$name$OP$id2$CP\n$desc $backlink\n$_"; +} + +sub do_cmd_glossarysubentryfield{ + local($_) = @_; + + local($id, $level, $label, $name, $desc, $symbol, $backlink); + + $level = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$level=$2;''/eo; + + $label = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$label=$2;''/eo; + + $name = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$name=$2;''/eo; + + $desc = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$desc=$2;''/eo; + + $symbol = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$symbol=$2;''/eo; + + $backlink = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$backlink=$2;''/eo; + + local($id2) = ++$global{'max_id'}; + + "\\glstarget $OP$id$CP$label$OP$id$CP$OP$id2$CP$name$OP$id2$CP\n$desc $backlink\n$_"; +} + +sub do_env_theglossary{ + local($_) = @_; + + &translate_commands($_); +} + +sub set_glossarystyle_altlist{ + eval(<<'END_STYLE'); + sub do_cmd_glossaryheader{ + local($_) = @_; + $_ + } + + sub do_cmd_glsgroupheading{ + local($_) = @_; + + local($id, $heading); + + $heading = &missing_braces unless + s/$next_pair_pr_rx/$id=$1,$heading=$2;''/eo; + + $_ + } + + sub do_cmd_glossaryentryfield{ + local($_) = @_; + + local($id, $id2, $id3, $id4, $id5, $label, $name, $desc, $symbol, $backlink); + + $label = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$label=$2;''/eo; + + $name = &missing_braces unless + s/$next_pair_pr_rx/$id2=$1;$name=$2;''/eo; + + $desc = &missing_braces unless + s/$next_pair_pr_rx/$id3=$1;$desc=$2;''/eo; + + $symbol = &missing_braces unless + s/$next_pair_pr_rx/$id4=$1;$symbol=$2;''/eo; + + $backlink = &missing_braces unless + s/$next_pair_pr_rx/$id5=$1;$backlink=$2;''/eo; + + "

\\glstarget $OP$id$CP$label$OP$id$CP$OP$id2$CP$name$OP$id2$CP\n
" + . "$desc\\glspostdescription\\space $backlink$_"; + } + + sub do_cmd_glossarysubentryfield{ + local($_) = @_; + + local($id, $id2, $id3, $id4, $id5, $id6, $level, + $label, $name, $desc, $symbol, $backlink); + + $level = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$level=$2;''/eo; + + $label = &missing_braces unless + s/$next_pair_pr_rx/$id2=$1;$label=$2;''/eo; + + $name = &missing_braces unless + s/$next_pair_pr_rx/$id3=$1;$name=$2;''/eo; + + $desc = &missing_braces unless + s/$next_pair_pr_rx/$id4=$1;$desc=$2;''/eo; + + $symbol = &missing_braces unless + s/$next_pair_pr_rx/$id5=$1;$symbol=$2;''/eo; + + $backlink = &missing_braces unless + s/$next_pair_pr_rx/$id6=$1;$backlink=$2;''/eo; + + "

\\glssubentryitem $OP$id$CP$label$OP$id$CP" + ."\\glstarget $OP$id2$CP$label$OP$id2$CP$OP$id3$CP$name$OP$id3$CP" + ."$desc\\glspostdescription\\space $backlink\n$_"; + } + + sub do_env_theglossary{ + local($_) = @_; + + "

".&translate_commands("\\glossaryheader $_")."
"; + } +END_STYLE +} + +sub set_glossarystyle_inline{ + eval(<<'END_STYLE'); + sub do_cmd_glossaryheader{ + local($_) = @_; + $_ + } + + sub do_cmd_glsgroupheading{ + local($_) = @_; + + local($id, $heading); + + $heading = &missing_braces unless + s/$next_pair_pr_rx/$id=$1,$heading=$2;''/eo; + + $_; + } + + sub do_cmd_glossaryentryfield{ + local($_) = @_; + + local($id, $id2, $id3, $id4, $id5, $label, $name, $desc, $symbol, $backlink); + + $label = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$label=$2;''/eo; + + $name = &missing_braces unless + s/$next_pair_pr_rx/$id2=$1;$name=$2;''/eo; + + $desc = &missing_braces unless + s/$next_pair_pr_rx/$id3=$1;$desc=$2;''/eo; + + $symbol = &missing_braces unless + s/$next_pair_pr_rx/$id4=$1;$symbol=$2;''/eo; + + $backlink = &missing_braces unless + s/$next_pair_pr_rx/$id5=$1;$backlink=$2;''/eo; + + local($field) = "\\glsinlinedopostchild $glsinlinesep"; + + $field .= "\\glsentryitem $OP$id$CP$label$OP$id$CP" + . "\\glsinlinenameformat $OP$id2$CP$label$OP$id2$CP$OP$id3$CP$name$OP$id3$CP"; + + $id3 = ++$global{'max_id'}; + + if ($desc) + { + $field .= + "\\glsinlinedescformat $OP$id3$CP$desc$OP$id3$CP" + ."$OP$id4$CP$symbol$OP$id4$CP" + ."$OP$id5$CP$backlink$OP$id5$CP"; + } + else + { + $field .= + "\\glsinlineemptydescformat " + ."$OP$id4$CP$symbol$OP$id4$CP" + ."$OP$id5$CP$backlink$OP$id5$CP"; + } + +# TODO : check if has children + + local($haschildren) = 0; + + if ($haschildren) + { + $field .= "\\glsresetsubentrycounter " + . "\\glsinlineparentchildseparator " + . "\\glsinlinepostchild "; + } + + $glsinlinesep = &translate_commands("\\glsinlineseparator ") + unless $glsinlinesep; + + $field.$_; + } + + sub do_cmd_glossarysubentryfield{ + local($_) = @_; + + local($id, $id2, $id3, $id4,$id5,$id6,$level, + $label, $name, $desc, $symbol, $backlink); + + $level = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$level=$2;''/eo; + + $label = &missing_braces unless + s/$next_pair_pr_rx/$id2=$1;$label=$2;''/eo; + + $name = &missing_braces unless + s/$next_pair_pr_rx/$id3=$1;$name=$2;''/eo; + + $desc = &missing_braces unless + s/$next_pair_pr_rx/$id4=$1;$desc=$2;''/eo; + + $symbol = &missing_braces unless + s/$next_pair_pr_rx/$id5=$1;$symbol=$2;''/eo; + + $backlink = &missing_braces unless + s/$next_pair_pr_rx/$id6=$1;$backlink=$2;''/eo; + + "\\glsinlinesubnameformat $OP$id$CP$label$OP$id$CP$OP$id2$CP$name$OP$id2$CP" + ."\\glssubentryitem $OP$id3$CP$label$OP$id3$CP" + ."\\glsinlinesubdescformat $OP$id4$CP$desc$OP$id4$CP$OP$id5$CP$symbol$OP$id5$CP$OP$id6$CP$backlink$OP$id6$CP" + .$_; + } + + sub do_env_theglossary{ + local($_) = @_; + + $glsinlinesep = ''; + + &translate_commands("\\glossaryheader $_\\glspostinline "); + } +END_STYLE +} + +local($glsinlinesep,$glsinlinepostchild); + +sub do_cmd_glsinlineseparator{ + local($_) = @_; + + "; $_"; +} + +sub do_cmd_glsinlinedopostchild{ + local($_) = @_; + + $_; +} + +sub do_cmd_glspostdescription{ + local($_) = @_; + + $GLOSSARY_END_DESCRIPTION.$_; +} + +sub do_cmd_glspostinline{ + local($_) = @_; + + &translate_commands("\\glspostdescription\\space ").$_; +} + +sub do_cmd_glsinlinepostchild{ + local($_) = @_; + + $_; +} + +sub do_cmd_glsinlineparentchildseparator{ + local($_) = @_; + + ": $_"; +} + +sub do_cmd_glsinlinesubseparator{ + local($_) = @_; + + ", $_"; +} + +sub do_cmd_glsinlinenameformat{ + &do_cmd_glstarget(@_); +} + +sub do_cmd_glsinlinedescformat{ + local($_) = @_; + + local($id, $desc, $symbol, $backlinks); + + $desc = &missing_braces unless + s/$next_pair_pr_rx/$id=$1,$desc=$2;''/eo; + + $symbol = &missing_braces unless + s/$next_pair_pr_rx/$id=$1,$symbol=$2;''/eo; + + $backlinks = &missing_braces unless + s/$next_pair_pr_rx/$id=$1,$backlinks=$2;''/eo; + + "\\space $desc$_"; +} + +sub do_cmd_glsinlineemptydescformat{ + local($_) = @_; + + local($id, $symbol, $backlinks); + + $symbol = &missing_braces unless + s/$next_pair_pr_rx/$id=$1,$symbol=$2;''/eo; + + $backlinks = &missing_braces unless + s/$next_pair_pr_rx/$id=$1,$backlinks=$2;''/eo; + + $_; +} + +sub do_cmd_glsinlinesubnameformat{ + local($_) = @_; + + local($id, $id2, $label, $name); + + $label = &missing_braces unless + s/$next_pair_pr_rx/$id=$1,$label=$2;''/eo; + + $name = &missing_braces unless + s/$next_pair_pr_rx/$id2=$1,$name=$2;''/eo; + + "\\glstarget $OP$id$CP$label$OP$id$CP$OP$id2$CP$OP$id2$CP$_"; +} + +sub do_cmd_glsinlinesubdescformat{ + local($_) = @_; + + local($id, $desc, $symbol, $backlinks); + + $desc = &missing_braces unless + s/$next_pair_pr_rx/$id=$1,$desc=$2;''/eo; + + $symbol = &missing_braces unless + s/$next_pair_pr_rx/$id=$1,$symbol=$2;''/eo; + + $backlinks = &missing_braces unless + s/$next_pair_pr_rx/$id=$1,$backlinks=$2;''/eo; + + "$desc$_"; +} + +sub set_depth_levels { + # Sets $outermost_level + local($level); + # scan the document body, not the preamble, for use of sectioning commands + my ($contents) = $_; + if ($contents =~ /\\begin\s*((?:$O|$OP)\d+(?:$C|$CP))document\1|\\startdocument/s) { +$contents = $'; + } + foreach $level ("part", "chapter", "section", "subsection", + "subsubsection", "paragraph") { +last if (($outermost_level) = $contents =~ /\\($level)$delimiter_rx/); +last if (($outermost_level) = $contents =~ /\\endsegment\s*\[\s*($level)\s*\]/s); +if ($contents =~ /\\segment\s*($O\d+$C)[^<]+\1\s*($O\d+$C)\s*($level)\s*\2/s) +{ $outermost_level = $3; last }; + } + $level = ($outermost_level ? $section_commands{$outermost_level} : + do {$outermost_level = 'section'; 3;}); + + if ($REL_DEPTH && $MAX_SPLIT_DEPTH) { +$MAX_SPLIT_DEPTH = $level + $MAX_SPLIT_DEPTH; + } elsif (!($MAX_SPLIT_DEPTH)) { $MAX_SPLIT_DEPTH = 1 }; + + %unnumbered_section_commands = ( + 'tableofcontents', $level +, 'listoffigures', $level +, 'listoftables', $level +, 'bibliography', $level +, 'textohtmlindex', $level +, 'textohtmlglossary', $level +, 'textohtmlglossaries', $level + , %unnumbered_section_commands + ); + + %section_commands = ( + %unnumbered_section_commands + , %section_commands + ); +} + +sub add_bbl_and_idx_dummy_commands { + local($id) = $global{'max_id'}; + + s/([\\]begin\s*$O\d+$C\s*thebibliography)/$bbl_cnt++; $1/eg; + ## if ($bbl_cnt == 1) { +s/([\\]begin\s*$O\d+$C\s*thebibliography)/$id++; "\\bibliography$O$id$C$O$id$C $1"/geo; + #} + $global{'max_id'} = $id; + s/([\\]begin\s*$O\d+$C\s*theindex)/\\textohtmlindex $1/o; + s/[\\]printindex/\\textohtmlindex /o; + &add_gls_dummy_commands; + &lib_add_bbl_and_idx_dummy_commands() if defined(&lib_add_bbl_and_idx_dummy_commands); +} + +sub add_gls_dummy_commands{ + s/[\\]printglossary/\\textohtmlglossary/sg; + s/[\\]printglossaries/\\textohtmlglossaries/sg; +} + +sub get_firstkeyval{ + local($key,$_) = @_; + local($value); + + s/\b$key\s*=$OP(\d+)$CP(.*)$OP\1$CP\s*(,|$)/$value=$2;','/es; + undef($value) if $`=~/\b$key\s*=/; + + unless (defined($value)) + { + s/(^|,)\s*$key\s*=\s*([^,]*)\s*(,|$)/,/s; + $value=$2; + } + + ($value,$_); +} + +# need to get the value of the last key of a given name +# in the event of multiple occurrences. +sub get_keyval{ + local($key,$_) = @_; + local($value); + + while (/\b$key\s*=/g) + { + ($value,$_) = &get_firstkeyval($key, $_); + last unless defined($value); + } + + ($value,$_); +} + +sub get_boolval{ + local($key,$_) = @_; + local($value); + + while (/\b$key\s*(?:=(true|false))?\b/g) + { + $value = ($1 ? $1 : 'true'); + } + + ($value eq 'true' ? 1 : 0, $_); +} + +# This is modified from do_cmd_textohtmlindex + +sub do_cmd_textohtmlglossary{ + local($_) = @_; + + local($keyval,$pat) = &get_next_optional_argument; + + local($type,$title,$toctitle,$style,$nonumberlist); + + $nonumberlist = 'default'; + + ($type,$keyval) = &get_keyval('type', $keyval); + ($title,$keyval) = &get_keyval('title', $keyval); + ($toctitle,$keyval) = &get_keyval('toctitle', $keyval); + ($style,$keyval) = &get_keyval('style', $keyval); + ($nonumberlist,$keyval) = &get_boolval('nonumberlist', $keyval); + + &make_textohtmlglossary($type,$toctitle,$title,$style,$nonumberlist).$_; +} + +# add_real_gls does the actual glossary +sub make_textohtmlglossary{ + local($type,$toctitle,$title,$style,$nonumberlist) = @_; + + unless (defined($type)) {$type = 'main';} + + unless (defined $gls_mark{$type}) + { + &write_warnings("glossary type '$type' not implemented"); + } + + if ($style) + { + $gls_style{$type} = $style; + } + + $toctitle = $gls_toctitle{$type} unless ($toctitle or $title); + + $title = $gls_title{$type} unless ($title); + $toctitle = $title unless ($toctitle); + + $gls_toctitle{$type} = $toctitle; + + $gls_nonumberlist{$type} = $nonumberlist unless ($nonumberlist eq 'default'); + + $toc_sec_title = $toctitle; + $glsfile{$type} = $CURRENT_FILE; + + if (defined($frame_main_suffix)) + { + $glsfile{$type}=~s/$frame_main_suffix/$frame_body_suffix/; + } + + $TITLE=&translate_commands($toctitle); + + if (%glossary_labels) { &make_glossary_labels(); } + + if (($SHORT_INDEX) && (%glossary_segment)) + { + &make_preglossary(); + } + else + { + $preglossary = &translate_commands("\\glossarypreamble"); + } + + local $idx_head = $section_headings{'textohtmlindex'}; + local($heading) = join('' + , &make_section_heading($title, $idx_head) + , $gls_mark{$type} ); + local($pre,$post) = &minimize_open_tags($heading); + + join('',"
\n" , $pre); +} + +sub do_cmd_textohtmlglossaries{ + local($_) = @_; + + foreach $type (keys %gls_mark) + { + $id = ++$global{'max_id'}; + $_ = &make_textohtmlglossary($type,$gls_title{'main'}).$_; + } + + $_; +} + +sub make_glossary_labels { + local($key, @keys); + @keys = keys %glossary_labels; + foreach $key (@keys) { + if (($ref_files{$key}) && !($ref_files{$key} eq "$glsfile{'main'}")) { + local($tmp) = $ref_files{$key}; + &write_warnings("\nmultiple label $key , target in $glsfile{'main'} masks $tmp "); + } + $ref_files{$key} .= $glsfile{'main'}; + } +} + +sub make_preglossary{ &make_real_preglossary } +sub make_real_preglossary{ + local($key, @keys, $head, $body); + $head = "
\n

Legend:

\n
"; + @keys = keys %glossary_segment; + foreach $key (@keys) { + local($tmp) = "segment$key"; + $tmp = $ref_files{$tmp}; + $body .= "\n
$key
".&make_named_href('',$tmp,$glossary_segment{$key}); + } + $preglossary = join('', $head, $body, "\n
") if ($body); +} + +sub do_cmd_glossary { &do_real_glossary(@_) } +sub do_real_glossary { + local($_) = @_; + local($type) = "main"; + local($anchor,$entry); + + local($type,$pat) = &get_next_optional_argument; + + $entry = &missing_braces unless + (s/$next_pair_pr_rx//o&&($entry=$2)); + + $anchor = &make_glossary_entry($entry,$anchor_invisible_mark,$type); + + join('', $anchor, $_); +} + +sub make_glossary_entry { &make_real_glossary_entry(@_) } +sub make_real_glossary_entry { + local($entry,$text,$type) = @_; + local($this_file) = $CURRENT_FILE; + + $TITLE = $saved_title + if (($saved_title)&&(!($TITLE)||($TITLE eq $default_title))); + + # Save the reference + local($str) = "$label###" . ++$global{'max_id'}; # Make unique + + local($id) = ++$glsentry{$entry}{'maxid'}; + local($glsanchor)="gls:$entry$id"; + + local($target) = $frame_body_name; + + if (defined($frame_main_suffix)) + { + $this_file=~s/$frame_main_suffix/$frame_body_suffix/; + } + + $glossary{$type}{$str} .= &make_half_href($this_file."#$glsanchor"); + $glossary_format{$type}{$str} = $GLSCURRENTFORMAT; + $glossary_entry{$type}{$str} = $entry; + $glossary_linktext{$type}{$str} = $TITLE; + + local($mark) = $gls_file_mark{$type}; + + $mark = &get_gls_file_mark($type, $entry) if (defined(&get_gls_file_mark)); + + $text = &translate_commands($text); + + if (defined($frame_foot_name)) + { + "$text<\/A>"; + } + else + { + "$text<\/A>"; + } +} + +sub make_real_glossary_entry_no_backlink { + local($entry,$text,$type) = @_; + local($this_file) = $CURRENT_FILE; + + local($target) = $frame_body_name; + + if (defined($frame_main_suffix)) + { + $this_file=~s/$frame_main_suffix/$frame_body_suffix/; + } + + local($mark) = $gls_file_mark{$type}; + + $mark = &get_gls_file_mark($type, $entry) if (defined(&get_gls_file_mark)); + + $text = &translate_commands($text); + + if (defined($frame_foot_name)) + { + "$text<\/A>"; + } + else + { + "$text<\/A>"; + } +} + +sub do_cmd_newglossary{ + local($_) = @_; + local($type,$out,$in,$opt,$pat,$title); + + ($opt,$pat) = &get_next_optional_argument; + + $type = &missing_braces unless + (s/$next_pair_pr_rx//o&&($type=$2)); + $in = &missing_braces unless + (s/$next_pair_pr_rx//o&&($in=$2)); + $out = &missing_braces unless + (s/$next_pair_pr_rx//o&&($out=$2)); + $title = &missing_braces unless + (s/$next_pair_pr_rx//o&&($title=$2)); + + ($opt,$pat) = &get_next_optional_argument; + + &make_newglossarytype($type, $title); + + $_; +} + +sub make_newglossarytype{ + local($type, $title) = @_; + + $gls_mark{$type} = ""; + $gls_file_mark{$type} = ""; + $gls_title{$type} = $title; + $gls_toctitle{$type} = $title; + $delimN{$type} = ", "; + $glsnumformat{$type} = $GLSCURRENTFORMAT; + @{$gls_entries{$type}} = (); + $gls_displayfirst{$type} = "glsdisplayfirst"; + $gls_display{$type} = "glsdisplay"; + $gls_nonumberlist{$type} = $gls_nonumberlist{'main'}; +} + +sub do_cmd_glsdisplay{ + local($_) = @_; + local($text,$description,$symbol,$insert); + + $text = &missing_braces unless + (s/$next_pair_pr_rx/$text=$2;''/eo); + + $description = &missing_braces unless + (s/$next_pair_pr_rx/$description=$2;''/eo); + + $symbol = &missing_braces unless + (s/$next_pair_pr_rx/$symbol=$2;''/eo); + + $insert = &missing_braces unless + (s/$next_pair_pr_rx/$insert=$2;''/eo); + + "$text$insert" . $_; +} + +sub do_cmd_glsdisplayfirst{ + local($_) = @_; + local($text,$description,$symbol,$insert); + + $text = &missing_braces unless + (s/$next_pair_pr_rx/$text=$2;''/eo); + + $description = &missing_braces unless + (s/$next_pair_pr_rx/$description=$2;''/eo); + + $symbol = &missing_braces unless + (s/$next_pair_pr_rx/$symbol=$2;''/eo); + + $insert = &missing_braces unless + (s/$next_pair_pr_rx/$insert=$2;''/eo); + + "$text$insert" . $_; +} + +sub gls_get_displayfirst{ + local($type) = @_; + local($display)= $gls_displayfirst{$type}; + + if (not defined($display)) + { + &write_warnings("Glossary '$type' is not defined"); + $display=''; + } + elsif ($display eq '') + { + &write_warnings("glsdisplayfirst not set for glossary '$type'"); + } + else + { + $display = "\\$display "; + } + + $display; +} + +sub gls_get_display{ + local($type) = @_; + local($display)= $gls_display{$type}; + + if (not defined($display)) + { + &write_warnings("Glossary '$type' is not defined"); + $display = ''; + } + elsif ($display eq '') + { + &write_warnings("glsdisplay not set for glossary '$type'"); + } + else + { + $display = "\\$display "; + } + + $display; +} + +sub do_cmd_glsnamefont{ + local($_) = @_; + local($text); + + $text = &missing_braces unless + (s/$next_pair_pr_rx/$text=$2;''/eo); + + "$text$_"; +} + +sub do_cmd_newacronym{ + local($_) = @_; + local($label,$abbrev,$long,$opt); + + ($opt,$pat) = &get_next_optional_argument; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + $abbrv = &missing_braces unless + (s/$next_pair_pr_rx/$abbrv=$2;''/eo); + $long = &missing_braces unless + (s/$next_pair_pr_rx/$long=$2;''/eo); + + local($cmd) = "\\newglossaryentry"; + local($id); + $id = ++$global{'max_id'}; + $cmd .= "$OP$id$CP$label$OP$id$CP"; + $id = ++$global{'max_id'}; + local($entry) = "type=$OP$id$CP\\acronymtype$OP$id$CP,"; + $id = ++$global{'max_id'}; + $entry .= "name=$OP$id$CP$abbrv$OP$id$CP,"; + $id = ++$global{'max_id'}; + $entry .= "description=$OP$id$CP$long$OP$id$CP,"; + $id = ++$global{'max_id'}; + $entry .= "text=$OP$id$CP$abbrv$OP$id$CP,"; + $id = ++$global{'max_id'}; + $entry .= "first=$OP$id$CP$long ($abbrv)$OP$id$CP,"; + $id = ++$global{'max_id'}; + $entry .= "plural=$OP$id$CP${abbrv}s$OP$id$CP,"; + $id = ++$global{'max_id'}; + $entry .= "firstplural=$OP$id$CP${long}s (${abbrv}s)$OP$id$CP"; + + $id = ++$global{'max_id'}; + $cmd .= "$OP$id$CP$entry,$opt$OP$id$CP"; + + &translate_commands($cmd).$_; +} + +sub gls_entry_init{ + local($label, $type, $name, $desc) = @_; + + %{$glsentry{$label}} = + ( type => $type, + name => $name, + 'sort' => $name, + description => $desc, + text => $name, + first => $name, + plural => "${name}s", + firstplural => "${name}s", + symbol => '', + flag => 0, + maxid => 0, + level => 0, + parent => '' + ); + + $#{@{$glsentry{$label}{children}}} = -1; + + $glsentry{$label}; +} + +sub gls_get_type{ + local($label) = @_; + local($type) = ''; + + if (&gls_entry_defined($label)) + { + $type = $glsentry{$label}{'type'}; + } + else + { + &write_warnings("gls_get_type: glossary entry '$label' has not been defined"); + } + + $type; +} + +sub gls_set_type{ + local($label, $type) = @_; + + if (&gls_entry_defined($label)) + { + $glsentry{$label}{'type'} = $type; + } + else + { + &write_warnings("gls_set_type: glossary entry '$label' has not been defined"); + } +} + +sub gls_get_name{ + local($label) = @_; + local($name) = ''; + + if (&gls_entry_defined($label)) + { + $name = $glsentry{$label}{'name'}; + } + else + { + &write_warnings("gls_get_name: glossary entry '$label' has not been defined"); + } + + $name; +} + +sub gls_set_name{ + local($label, $name) = @_; + + if (&gls_entry_defined($label)) + { + $glsentry{$label}{'name'} = $name; + } + else + { + &write_warnings("gls_set_name: glossary entry '$label' has not been defined"); + } +} + +sub gls_get_description{ + local($label) = @_; + local($description) = ''; + + if (&gls_entry_defined($label)) + { + $description = $glsentry{$label}{'description'}; + } + else + { + &write_warnings("gls_get_description: glossary entry '$label' has not been defined"); + } + + $description; +} + +sub gls_set_description{ + local($label, $description) = @_; + + if (&gls_entry_defined($label)) + { + $glsentry{$label}{'description'} = $description; + } + else + { + &write_warnings("gls_set_description: glossary entry '$label' has not been defined"); + } +} + +sub gls_get_symbol{ + local($label) = @_; + local($symbol) = ''; + + if (&gls_entry_defined($label)) + { + $symbol = $glsentry{$label}{'symbol'}; + } + else + { + &write_warnings("gls_get_symbol: glossary entry '$label' has not been defined"); + } + + $symbol; +} + +sub gls_set_symbol{ + local($label, $symbol) = @_; + + if (&gls_entry_defined($label)) + { + $glsentry{$label}{'symbol'} = $symbol; + } + else + { + &write_warnings("gls_set_symbol: glossary entry '$label' has not been defined"); + } +} + +sub gls_get_sort{ + local($label) = @_; + local($sort) = ''; + + if (&gls_entry_defined($label)) + { + $sort = $glsentry{$label}{'sort'}; + } + else + { + &write_warnings("gls_get_sort: glossary entry '$label' has not been defined"); + } + + $sort; +} + +sub gls_set_sort{ + local($label, $sort) = @_; + + if (&gls_entry_defined($label)) + { + $glsentry{$label}{'sort'} = $sort; + } + else + { + &write_warnings("gls_set_sort: glossary entry '$label' has not been defined"); + } +} + +sub gls_get_text{ + local($label) = @_; + local($text) = ''; + + if (&gls_entry_defined($label)) + { + $text = $glsentry{$label}{'text'}; + } + else + { + &write_warnings("gls_get_text: glossary entry '$label' has not been defined"); + } + + $text; +} + +sub gls_set_text{ + local($label, $text) = @_; + + if (&gls_entry_defined($label)) + { + $glsentry{$label}{'text'} = $text; + } + else + { + &write_warnings("gls_set_text: glossary entry '$label' has not been defined"); + } +} + +sub gls_get_plural{ + local($label) = @_; + local($plural) = ''; + + if (&gls_entry_defined($label)) + { + $plural = $glsentry{$label}{'plural'}; + } + else + { + &write_warnings("gls_get_plural: glossary entry '$label' has not been defined"); + } + + $plural; +} + +sub gls_set_plural{ + local($label, $plural) = @_; + + if (&gls_entry_defined($label)) + { + $glsentry{$label}{'plural'} = $plural; + } + else + { + &write_warnings("gls_set_plural: glossary entry '$label' has not been defined"); + } +} + +sub gls_get_firstplural{ + local($label) = @_; + local($firstplural) = ''; + + if (&gls_entry_defined($label)) + { + $firstplural = $glsentry{$label}{'firstplural'}; + } + else + { + &write_warnings("gls_get_firstplural: glossary entry '$label' has not been defined"); + } + + $firstplural; +} + +sub gls_set_firstplural{ + local($label, $firstplural) = @_; + + if (&gls_entry_defined($label)) + { + $glsentry{$label}{'firstplural'} = $firstplural; + } + else + { + &write_warnings("gls_set_firstplural: glossary entry '$label' has not been defined"); + } +} + +sub gls_get_first{ + local($label) = @_; + local($first) = ''; + + if (&gls_entry_defined($label)) + { + $first = $glsentry{$label}{'first'}; + } + else + { + &write_warnings("gls_get_first: glossary entry '$label' has not been defined"); + } + + $first; +} + +sub gls_set_first{ + local($label, $first) = @_; + + if (&gls_entry_defined($label)) + { + $glsentry{$label}{'first'} = $first; + } + else + { + &write_warnings("gls_set_first: glossary entry '$label' has not been defined"); + } +} + +sub gls_get_parent{ + local($label) = @_; + + local($parent); + + if (&gls_entry_defined($label)) + { + $parent = $glsentry{$label}{'parent'}; + } + else + { + &write_warnings("gls_get_parent: glossary entry '$label' has not been defined"); + } + + $parent; +} + +sub gls_get_level{ + local($label) = @_; + + local($level) = 0; + + if (&gls_entry_defined($label)) + { + $level = $glsentry{$label}{'level'}; + } + else + { + &write_warnings("gls_get_level: glossary entry '$label' has not been defined"); + } + + $level; +} + +sub gls_set_parent{ + local ($label, $parent) = @_; + + if (&gls_entry_defined($label)) + { + if ($parent) + { + if (&gls_entry_defined($parent)) + { + $glsentry{$label}{'parent'} = $parent; + + push @{$glsentry{$parent}{'children'}}, $label; + + $glsentry{$label}{'level'} = $glsentry{$parent}{'level'}+1; + } + else + { + &write_warnings("gls_set_parent: parent '$parent' for glossary entry '$label' has not been defined"); + } + } + else + { + $glsentry{$label}{'parent'} = ''; + } + } + else + { + &write_warnings("gls_set_parent: glossary entry '$label' has not been defined"); + } +} + +sub gls_get_childcount{ + my($label) = @_; + + my($count) = 0; + + if (&gls_entry_defined($label)) + { + $count = scalar(@{$glsentry{$label}{'children'}}); + } + else + { + &write_warnings("gls_get_childcount: glossary entry '$label' has not been defined"); + } + + $count; +} + +sub gls_get_referenced_childcount{ + my($label) = @_; + + my($count) = 0; + + if (&gls_entry_defined($label)) + { + $count = scalar(grep(($glsentry{$_}{'maxid'} > 0), @{$glsentry{$label}{'children'}})); + } + else + { + &write_warnings("gls_get_childcount: glossary entry '$label' has not been defined"); + } + + $count; +} + +sub gls_set_userkeys{ + local($label, @user) = @_; + + if (&gls_entry_defined($label)) + { + for (my $idx = 0; $idx < 6; $idx++) + { + $glsentry{$label}{"user".($idx+1)} = $user[$idx]; + } + } + else + { + &write_warnings("gls_set_user: glossary entry '$label' has not been defined"); + } +} + +sub gls_set_user{ + local($label, $idx, $text) = @_; + + if (&gls_entry_defined($label)) + { + $glsentry{$label}{"user$idx"} = $text; + } + else + { + &write_warnings("gls_set_user: glossary entry '$label' has not been defined"); + } +} + +sub gls_set_useri{ + local($label, $text) = @_; + + if (&gls_entry_defined($label)) + { + $glsentry{$label}{'user1'} = $text; + } + else + { + &write_warnings("gls_set_useri: glossary entry '$label' has not been defined"); + } +} + +sub gls_set_userii{ + local($label, $text) = @_; + + if (&gls_entry_defined($label)) + { + $glsentry{$label}{'user2'} = $text; + } + else + { + &write_warnings("gls_set_userii: glossary entry '$label' has not been defined"); + } +} + +sub gls_set_useriii{ + local($label, $text) = @_; + + if (&gls_entry_defined($label)) + { + $glsentry{$label}{'user3'} = $text; + } + else + { + &write_warnings("gls_set_useriii: glossary entry '$label' has not been defined"); + } +} + +sub gls_set_useriv{ + local($label, $text) = @_; + + if (&gls_entry_defined($label)) + { + $glsentry{$label}{'user4'} = $text; + } + else + { + &write_warnings("gls_set_useriv: glossary entry '$label' has not been defined"); + } +} + +sub gls_set_userv{ + local($label, $text) = @_; + + if (&gls_entry_defined($label)) + { + $glsentry{$label}{'user5'} = $text; + } + else + { + &write_warnings("gls_set_userv: glossary entry '$label' has not been defined"); + } +} + +sub gls_set_uservi{ + local($label, $text) = @_; + + if (&gls_entry_defined($label)) + { + $glsentry{$label}{'user6'} = $text; + } + else + { + &write_warnings("gls_set_uservi: glossary entry '$label' has not been defined"); + } +} + +sub gls_get_user{ + local($label, $idx) = @_; + local($value) = ''; + + if (&gls_entry_defined($label)) + { + $value = $glsentry{$label}{"user".$idx}; + } + else + { + &write_warnings("gls_get_user[$idx]: glossary entry '$label' has not been defined"); + } + + $value; +} + +sub gls_used{ + local($label) = @_; + local($flag) = 0; + + if (&gls_entry_defined($label)) + { + $flag = $glsentry{$label}{'flag'}; + } + else + { + &write_warnings("gls_used: glossary entry '$label' has not been defined"); + } + + $flag; +} + +sub gls_entry_defined{ + local($label) = @_; + + (%{$glsentry{$label}}) ? 1 : 0; +} + +sub do_cmd_newglossaryentry{ + local($_) = @_; + local($label,$name,$description,$symbol,$sort,$text,$first, + $plural,$firstplural,$type,$keyval,$parent,@user); + + $label = &missing_braces unless + s/$next_pair_pr_rx/$label=$2;''/eo; + + $keyval = &missing_braces unless + s/$next_pair_pr_rx/$keyval=$2;''/eo; + + ($name,$keyval) = &get_keyval('name', $keyval); + ($description,$keyval) = &get_keyval('description', $keyval); + ($symbol,$keyval) = &get_keyval('symbol', $keyval); + ($sort,$keyval) = &get_keyval('sort', $keyval); + ($text,$keyval) = &get_keyval('text', $keyval); + ($first,$keyval) = &get_keyval('first', $keyval); + ($firstplural,$keyval) = &get_keyval('firstplural', $keyval); + ($plural,$keyval) = &get_keyval('plural', $keyval); + ($type,$keyval) = &get_keyval('type', $keyval); + ($parent,$keyval) = &get_keyval('parent', $keyval); + + if ($parent and not $name) + { + $name = &gls_get_name($parent); + } + + @user = (); + + for (my $idx = 0; $idx < 6; $idx++) + { + ($user[$idx],$keyval) = &get_keyval("user".($idx+1), $keyval); + } + + if (defined($type)) + { + $type = &translate_commands($type); + } + else + { + $type = 'main'; + } + + &gls_entry_init($label, $type, $name, $description); + + &gls_set_symbol($label, defined($symbol)?$symbol:''); + + $sort = "$name $description" unless (defined($sort) and $sort); + + &gls_set_sort($label, $sort); + + $text = $name unless (defined($text) and $text); + + &gls_set_text($label, $text); + + $first = $text unless (defined($first) and $first); + + &gls_set_first($label, $first); + + $plural = "${text}s" unless (defined($plural) and $plural); + + &gls_set_plural($label, $plural); + + $firstplural = "${first}s" unless (defined($firstplural) and $firstplural); + + &gls_set_firstplural($label, $firstplural); + + &gls_set_userkeys($label, @user); + + &gls_set_parent($label, $parent); + + push @{$gls_entries{$type}}, $label; + + $_; +} + +sub reset_entry{ + local($label) = @_; + + $glsentry{$label}{'flag'} = 0; +} + +sub unset_entry{ + local($label) = @_; + + $glsentry{$label}{'flag'} = 1; +} + +sub do_cmd_glsreset{ + local($_) = @_; + local($label); + + $label = &missing_braces unless + s/$next_pair_pr_rx/$label=$2;''/eo; + + &reset_entry($label); + + $_; +} + +sub do_cmd_glsunset{ + local($_) = @_; + local($label); + + $label = &missing_braces unless + s/$next_pair_pr_rx/$label=$2;''/eo; + + &unset_entry($label); + + $_; +} + +sub do_cmd_ifglsused{ + local($_) = @_; + local($label,$true,$false); + + $label = &missing_braces unless + s/$next_pair_pr_rx/$label=$2;''/eo; + + $true = &missing_braces unless + s/$next_pair_pr_rx/$true=$2;''/eo; + + $false = &missing_braces unless + s/$next_pair_pr_rx/$false=$2;''/eo; + + (&gls_used($label) ? $true : $false) . $_; +} + +sub do_cmd_ifglsentryexists{ + local($_) = @_; + local($label,$true,$false); + + $label = &missing_braces unless + s/$next_pair_pr_rx/$label=$2;''/eo; + + $true = &missing_braces unless + s/$next_pair_pr_rx/$true=$2;''/eo; + + $false = &missing_braces unless + s/$next_pair_pr_rx/$false=$2;''/eo; + + (&gls_entry_defined($label) ? $true : $false) . $_; +} + +sub gls_add_entry{ + local($type, $label, $format, $text) = @_; + + local($oldfmt) = $GLSCURRENTFORMAT; + + if (defined($format)) + { + $format=~s/[\(\)]//; + + if ($format) + { + $GLSCURRENTFORMAT=$format; + } + } + + $id = ++$global{'max_id'}; + + local($str) = &make_real_glossary_entry($label,$text,$type); + $GLSCURRENTFORMAT = $oldfmt; + + $str; +} + +sub do_cmd_glsadd{ + local($_) = @_; + local($optarg,$pat,$label,$str,$id,$type,$format); + ($optarg,$pat) = &get_next_optional_argument; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + $type = &gls_get_type($label); + + local($dobacklink) = 1; + + if (&gls_used($label)) + { + if ($INDEXONLYFIRST) + { + $dobacklink = 0; + } + } + else + { + &unset_entry($label); + } + + if (defined $type) + { + ($format,$optarg) = &get_keyval('format', $optarg); + $format='' unless(defined($format)); + + if ($dobacklink) + { + &gls_add_entry($type,$label,$format,""); + } + else + { + $glsentry{$label}{'maxid'} = ++$glsentry{$entry}{'maxid'}; + my $key = $label."###".$glsentry{$label}{'maxid'}; + $glossary{$type}{$key}=''; + } + } + else + { + &write_warnings("gls_add: glossary entry '$label' undefined"); + $str = ''; + } + + $str . $_; +} + +sub do_cmd_glsaddall{ + local($_) = @_; + local($optarg,$pat) = &get_next_optional_argument; + + local($format,$list); + + ($list,$optarg) = &get_keyval('types', $optarg); + ($format,$optarg) = &get_keyval('format', $optarg); + + $format='' unless(defined($format)); + + local(@types) = keys(%gls_mark); + + if ($list) + { + @types = split /\s*,\s*/, $list; + } + + foreach $type (@types) + { + # strip leading and trailing spaces + $type=~s/^\s*([^\s]+)\s*$/\1/; + + foreach $label (@{$gls_entries{$type}}) + { + local($dobacklink) = 1; + + if (&gls_used($label)) + { + if ($INDEXONLYFIRST) + { + $dobacklink = 0; + } + } + else + { + &unset_entry($label); + } + + if ($dobacklink) + { + &gls_add_entry($type,$label,$format,""); + } + } + } + + $_; +} + +sub do_cmd_glsresetall{ + local($_) = @_; + local($types,$pat) = &get_next_optional_argument; + + local(@types) = keys(%gls_mark); + + if (defined($types) and $types) + { + @types = split /,/, $types; + } + + foreach $type (@types) + { + # strip leasing and trailing spaces + $type=~s/^\s*([^\s]+)\s*$/\1/; + + foreach $label (@{$gls_entries{$type}}) + { + &reset_entry($label); + } + } + + $_; +} + +sub do_cmd_glsunsetall{ + local($_) = @_; + local($types,$pat) = &get_next_optional_argument; + + local(@types) = keys(%gls_mark); + + if (defined($types) and $types) + { + @types = split /,/, $types; + } + + foreach $type (@types) + { + # strip leasing and trailing spaces + $type=~s/^\s*([^\s]+)\s*$/\1/; + + foreach $label (@{$gls_entries{$type}}) + { + &reset_entry($label); + } + } + + $_; +} + +$glslabel = ''; + +sub do_cmd_glslabel{ $glslabel.$_[0] } + +sub make_glslink{ + local($type,$label,$format,$text) = @_; + local($str) = ''; + + $glslabel = $label; + + if (defined $type) + { + $str = &gls_add_entry($type,$label,$format,$text); + } + else + { + &write_warnings("glossary '$type' undefined"); + } + + $str; +} + +sub do_cmd_glslink{ + local($_) = @_; + local($optarg,$pat,$label,$text,$type,$format,$str); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + $text = &missing_braces unless + (s/$next_pair_pr_rx/$text=$2;''/eo); + + # v1.01 removed following lines (\glslink doesn't have + # a final optional argument! + #local ($space) = ''; + #if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + #($optarg,$pat) = &get_next_optional_argument; + + $type = &gls_get_type($label); + + #&make_glslink($type, $label, $format, $text).$space . $_; + &make_glslink($type, $label, $format, $text) . $_; +} + +sub do_cmd_glslinkstar{ + local($_) = @_; + local($optarg,$pat,$label,$text,$type,$format,$str); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + $text = &missing_braces unless + (s/$next_pair_pr_rx/$text=$2;''/eo); + + $type = &gls_get_type($label); + + $text . $_; +} + +sub do_cmd_glsdisp{ + local($_) = @_; + local($optarg,$pat,$label,$text,$type,$format,$str); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + $text = &missing_braces unless + (s/$next_pair_pr_rx/$text=$2;''/eo); + + local($dobacklink) = 1; + + if (&gls_used($label)) + { + if ($INDEXONLYFIRST) + { + $dobacklink = 0; + } + } + else + { + &unset_entry($label); + } + + $type = &gls_get_type($label); + + if ($dobacklink) + { + &make_glslink($type, $label, $format, $text) .$space . $_; + } + else + { + &make_real_glossary_entry_no_backlink($label, $text, $type). $space . $_; + } +} + +sub do_cmd_glshyperlink{ + local($_) = @_; + + local($text,$pat) = &get_next_optional_argument; + + local($id, $label); + + $label = &missing_braces unless + s/$next_pair_pr_rx/$id=$1,$label=$2;''/eo; + + $text = &gls_get_text($label) unless $text; + + local($type) = &gls_get_type($label); + + "$text<\/A>" + .$_; +} + +sub do_cmd_glsentrydesc{ + local($_) = @_; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + &gls_get_description($label).$_; +} + +sub do_cmd_Glsentrydesc{ + local($_) = @_; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + &do_real_makefirstuc(&gls_get_description($label)).$_; +} + +sub do_cmd_glsentrytext{ + local($_) = @_; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + &gls_get_text($label).$_; +} + +sub do_cmd_Glsentrytext{ + local($_) = @_; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + &do_real_makefirstuc(&gls_get_text($label)).$_; +} + +sub do_cmd_glsentryname{ + local($_) = @_; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + &gls_get_name($label).$_; +} + +sub do_cmd_Glsentryname{ + local($_) = @_; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + &do_real_makefirstuc(&gls_get_name($label)).$_; +} + +sub do_cmd_glsentryfirst{ + local($_) = @_; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + &gls_get_first($label).$_; +} + +sub do_cmd_Glsentryfirst{ + local($_) = @_; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + &do_real_makefirstuc(&gls_get_first($label)).$_; +} + +sub do_cmd_glsentryplural{ + local($_) = @_; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + &gls_get_plural($label).$_; +} + +sub do_cmd_Glsentryplural{ + local($_) = @_; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + &do_real_makefirstuc(&gls_get_plural($label)).$_; +} + +sub do_cmd_glsentryfirstplural{ + local($_) = @_; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local($text)=$glsentry{$label}{'firstplural'}; + + unless (defined($text)) + { + &write_warnings("glossary entry '$label' has not been defined"); + $text = ''; + } + + "$text$_"; + &gls_get_firstplural($label).$_; +} + +sub do_cmd_Glsentryfirstplural{ + local($_) = @_; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + &do_real_makefirstuc(&gls_get_firstplural($label)).$_; +} + +sub do_cmd_glsentrysymbol{ + local($_) = @_; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + &gls_get_symbol($label).$_; +} + +sub do_cmd_Glsentrysymbol{ + local($_) = @_; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + &do_real_makefirstuc(&gls_get_symbol($label)).$_; +} + +sub do_cmd_glsentryuseri{ + local($_) = @_; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + &gls_get_user($label, 1).$_; +} + +sub do_cmd_glsentryuserii{ + local($_) = @_; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + &gls_get_user($label, 2).$_; +} + +sub do_cmd_glsentryuseriii{ + local($_) = @_; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + &gls_get_user($label, 3).$_; +} + +sub do_cmd_glsentryuseriv{ + local($_) = @_; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + &gls_get_user($label, 4).$_; +} + +sub do_cmd_glsentryuserv{ + local($_) = @_; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + &gls_get_user($label, 5).$_; +} + +sub do_cmd_glsentryuservi{ + local($_) = @_; + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + &gls_get_user($label, 6).$_; +} + +sub do_cmd_gls{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + local($dobacklink) = 1; + + if (&gls_used($label)) + { + # entry has already been used + + $text = &gls_get_text($label); + $display = &gls_get_display($type); + + if ($INDEXONLYFIRST) + { + $dobacklink = 0; + } + } + else + { + # entry hasn't been used + + $text = &gls_get_first($label); + $display = &gls_get_displayfirst($type); + + &unset_entry($label); + } + + local($args) = ''; + + local($id) = ++$global{'max_id'}; + $args .= "$OP$id$CP$text$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{description}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{symbol}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$insert$OP$id$CP"; + + local($link_text) = &translate_commands("$display$args"); + + if ($dobacklink) + { + &make_glslink($type, $label, $format, $link_text) .$space . $_; + } + else + { + &make_real_glossary_entry_no_backlink($label, $link_text, $type). $space . $_; + } +} + +# added v1.04 +sub do_cmd_glsstar{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + if (&gls_used($label)) + { + # entry has already been used + + $text = &gls_get_text($label); + $display = &gls_get_display($type); + } + else + { + # entry hasn't been used + + $text = &gls_get_first($label); + $display = &gls_get_displayfirst($type); + + &unset_entry($label); + } + + local($args) = ''; + + local($id) = ++$global{'max_id'}; + $args .= "$OP$id$CP$text$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{description}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{symbol}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$insert$OP$id$CP"; + + local($link_text) = &translate_commands("$display$args"); + + $link_text . $space . $_; +} + +sub do_cmd_glspl{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = $glsentry{$label}{'type'}; + + local($dobacklink) = 1; + + if (&gls_used($label)) + { + # entry has already been used + + $text = &gls_get_plural($label); + $display = &gls_get_display($type);; + + if ($INDEXONLYFIRST) + { + $dobacklink = 0; + } + } + else + { + # entry hasn't been used + + $text = &gls_get_firstplural($label); + $display = &gls_get_displayfirst($type); + + &unset_entry($label); + } + + local($args) = ''; + + local($id) = ++$global{'max_id'}; + $args .= "$OP$id$CP$text$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{description}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{symbol}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$insert$OP$id$CP"; + + local($link_text) = &translate_commands("$display$args"); + + if ($dobacklink) + { + &make_glslink($type, $label, $format, $link_text) .$space . $_; + } + else + { + &make_real_glossary_entry_no_backlink($label, $link_text, $type). $space . $_; + } +} + +# added v1.04 +sub do_cmd_glsplstar{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = $glsentry{$label}{'type'}; + + if (&gls_used($label)) + { + # entry has already been used + + $text = &gls_get_plural($label); + $display = &gls_get_display($type);; + } + else + { + # entry hasn't been used + + $text = &gls_get_firstplural($label); + $display = &gls_get_displayfirst($type); + + &unset_entry($label); + } + + local($args) = ''; + + local($id) = ++$global{'max_id'}; + $args .= "$OP$id$CP$text$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{description}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{symbol}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$insert$OP$id$CP"; + + local($link_text) = &translate_commands("$display$args"); + + $link_text . $space . $_; +} + +sub do_cmd_Gls{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = $glsentry{$label}{'type'}; + + local($dobacklink) = 1; + + if (&gls_used($label)) + { + # entry has already been used + + $text = &gls_get_text($label); + $display = &gls_get_display($type);; + + if ($INDEXONLYFIRST) + { + $dobacklink = 0; + } + } + else + { + # entry hasn't been used + + $text = &gls_get_first($label); + $display = &gls_get_displayfirst($type); + + &unset_entry($label); + } + + local($args) = ''; + + local($id) = ++$global{'max_id'}; + $args .= "$OP$id$CP$text$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{description}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{symbol}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$insert$OP$id$CP"; + + local($link_text) = &do_real_makefirstuc(&translate_commands("$display$args")); + + if ($dobacklink) + { + &make_glslink($type, $label, $format, $link_text) .$space . $_; + } + else + { + &make_real_glossary_entry_no_backlink($label, $link_text, $type). $space . $_; + } +} + +# added v1.04 +sub do_cmd_Glsstar{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = $glsentry{$label}{'type'}; + + if (&gls_used($label)) + { + # entry has already been used + + $text = &gls_get_text($label); + $display = &gls_get_display($type);; + } + else + { + # entry hasn't been used + + $text = &gls_get_first($label); + $display = &gls_get_displayfirst($type); + + &unset_entry($label); + } + + local($args) = ''; + + local($id) = ++$global{'max_id'}; + $args .= "$OP$id$CP$text$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{description}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{symbol}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$insert$OP$id$CP"; + + local($link_text) = &translate_commands("$display$args"); + + &do_real_makefirstuc($link_text). $space . $_; +} + +sub do_cmd_Glspl{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = $glsentry{$label}{'type'}; + + local($dobacklink) = 1; + + if (&gls_used($label)) + { + # entry has already been used + + $text = &gls_get_plural($label); + $display = &gls_get_display($type);; + + if ($INDEXONLYFIRST) + { + $dobacklink = 0; + } + } + else + { + # entry hasn't been used + + $text = &gls_get_firstplural($label); + $display = &gls_get_displayfirst($type); + + &unset_entry($label); + } + + local($args) = ''; + + local($id) = ++$global{'max_id'}; + $args .= "$OP$id$CP$text$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{description}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{symbol}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$insert$OP$id$CP"; + + local($link_text) = &do_real_makefirstuc(&translate_commands("$display$args")); + + if ($dobacklink) + { + &make_glslink($type, $label, $format, $link_text) .$space . $_; + } + else + { + &make_real_glossary_entry_no_backlink($label, $link_text, $type). $space . $_; + } +} + +# added v1.04 +sub do_cmd_Glsplstar{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = $glsentry{$label}{'type'}; + + if (&gls_used($label)) + { + # entry has already been used + + $text = &gls_get_plural($label); + $display = &gls_get_display($type);; + } + else + { + # entry hasn't been used + + $text = &gls_get_firstplural($label); + $display = &gls_get_displayfirst($type); + + &unset_entry($label); + } + + local($args) = ''; + + local($id) = ++$global{'max_id'}; + $args .= "$OP$id$CP$text$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{description}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{symbol}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$insert$OP$id$CP"; + + local($link_text) = &translate_commands("$display$args"); + + &do_real_makefirstuc($link_text).$space . $_; +} + +sub do_cmd_GLS{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = $glsentry{$label}{'type'}; + + local($dobacklink) = 1; + + if (&gls_used($label)) + { + # entry has already been used + + $text = &gls_get_text($label); + $display = &gls_get_display($type);; + + if ($INDEXONLYFIRST) + { + $dobacklink = 0; + } + } + else + { + # entry hasn't been used + + $text = &gls_get_first($label); + $display = &gls_get_displayfirst($type); + + &unset_entry($label); + } + + local($args) = ''; + + local($id) = ++$global{'max_id'}; + $args .= "$OP$id$CP$text$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{description}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{symbol}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$insert$OP$id$CP"; + + local($link_text) = uc(&translate_commands("$display$args")); + + if ($dobacklink) + { + &make_glslink($type, $label, $format, $link_text) .$space . $_; + } + else + { + &make_real_glossary_entry_no_backlink($label, $link_text, $type). $space . $_; + } +} + +# added v1.04 +sub do_cmd_GLSstar{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = $glsentry{$label}{'type'}; + + if (&gls_used($label)) + { + # entry has already been used + + $text = &gls_get_text($label); + $display = &gls_get_display($type);; + } + else + { + # entry hasn't been used + + $text = &gls_get_first($label); + $display = &gls_get_displayfirst($type); + + &unset_entry($label); + } + + local($args) = ''; + + local($id) = ++$global{'max_id'}; + $args .= "$OP$id$CP$text$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{description}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{symbol}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$insert$OP$id$CP"; + + local($link_text) = &translate_commands("$display$args"); + + uc($link_text).$space . $_; +} + +sub do_cmd_GLSpl{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = $glsentry{$label}{'type'}; + + local($dobacklink) = 1; + + if (&gls_used($label)) + { + # entry has already been used + + $text = &gls_get_plural($label); + $display = &gls_get_display($type);; + + if ($INDEXONLYFIRST) + { + $dobacklink = 0; + } + } + else + { + # entry hasn't been used + + $text = &gls_get_firstplural($label); + $display = &gls_get_displayfirst($type); + + &unset_entry($label); + } + + local($args) = ''; + + local($id) = ++$global{'max_id'}; + $args .= "$OP$id$CP$text$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{description}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{symbol}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$insert$OP$id$CP"; + + local($link_text) = uc(&translate_commands("$display$args")); + + if ($dobacklink) + { + &make_glslink($type, $label, $format, $link_text) .$space . $_; + } + else + { + &make_real_glossary_entry_no_backlink($label, $link_text, $type). $space . $_; + } +} + +# added v1.04 +sub do_cmd_GLSplstar{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = $glsentry{$label}{'type'}; + + if (&gls_used($label)) + { + # entry has already been used + + $text = &gls_get_plural($label); + $display = &gls_get_display($type);; + } + else + { + # entry hasn't been used + + $text = &gls_get_firstplural($label); + $display = &gls_get_displayfirst($type); + + &unset_entry($label); + } + + local($args) = ''; + + local($id) = ++$global{'max_id'}; + $args .= "$OP$id$CP$text$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{description}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$glsentry{$label}{symbol}$OP$id$CP"; + + $id = ++$global{'max_id'}; + $args .= "$OP$id$CP$insert$OP$id$CP"; + + local($link_text) = &translate_commands("$display$args"); + + uc($link_text).$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_glstext{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_text($label); + + &make_glslink($type, $label, $format, $text) .$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_Glstext{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_text($label); + + &make_glslink($type, $label, $format, &do_real_makefirstuc($text)) .$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_GLStext{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_text($label); + + &make_glslink($type, $label, $format, uc($text)) .$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_glsname{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_name($label); + + &make_glslink($type, $label, $format, $text) .$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_Glsname{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_name($label); + + &make_glslink($type, $label, $format, &do_real_makefirstuc($text)) .$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_GLSname{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_name($label); + + &make_glslink($type, $label, $format, uc($text)) .$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_glsfirst{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_first($label); + + &make_glslink($type, $label, $format, $text) .$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_Glsfirst{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_first($label); + + &make_glslink($type, $label, $format, &do_real_makefirstuc($text)) .$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_GLSfirst{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_first($label); + + &make_glslink($type, $label, $format, uc($text)) .$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_glsfirstplural{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_firstplural($label); + + &make_glslink($type, $label, $format, $text) .$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_Glsfirstplural{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_firstplural($label); + + &make_glslink($type, $label, $format, &do_real_makefirstuc($text)) .$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_GLSfirstplural{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_firstplural($label); + + &make_glslink($type, $label, $format, uc($text)) .$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_glsplural{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_plural($label); + + &make_glslink($type, $label, $format, $text) .$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_Glsplural{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_plural($label); + + &make_glslink($type, $label, $format, &do_real_makefirstuc($text)) .$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_GLSplural{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_plural($label); + + &make_glslink($type, $label, $format, uc($text)) .$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_glsdesc{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_description($label); + + &make_glslink($type, $label, $format, $text) .$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_Glsdesc{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_description($label); + + &make_glslink($type, $label, $format, &do_real_makefirstuc($text)) .$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_GLSdesc{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_description($label); + + &make_glslink($type, $label, $format, uc($text)) .$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_glssymbol{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_symbol($label); + + &make_glslink($type, $label, $format, $text) .$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_Glssymbol{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_symbol($label); + + &make_glslink($type, $label, $format, &do_real_makefirstuc($text)) .$space . $_; +} + +# added 22 Feb 2008 +sub do_cmd_GLSsymbol{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_symbol($label); + + &make_glslink($type, $label, $format, uc($text)) .$space . $_; +} + +sub do_cmd_glsuseri{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_user($label, 1); + + &make_glslink($type, $label, $format, $text) .$space . $_; +} + +sub do_cmd_Glsuseri{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &do_real_makefirstuc(&gls_get_user($label, 1)); + + &make_glslink($type, $label, $format, $text) .$space . $_; +} + +sub do_cmd_glsuserii{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_user($label, 2); + + &make_glslink($type, $label, $format, $text) .$space . $_; +} + +sub do_cmd_Glsuserii{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &do_real_makefirstuc(&gls_get_user($label, 2)); + + &make_glslink($type, $label, $format, $text) .$space . $_; +} + +sub do_cmd_glsuseriii{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_user($label, 3); + + &make_glslink($type, $label, $format, $text) .$space . $_; +} + +sub do_cmd_Glsuseriii{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &do_real_makefirstuc(&gls_get_user($label, 3)); + + &make_glslink($type, $label, $format, $text) .$space . $_; +} + +sub do_cmd_glsuseriv{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_user($label, 4); + + &make_glslink($type, $label, $format, $text) .$space . $_; +} + +sub do_cmd_Glsuseriv{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &do_real_makefirstuc(&gls_get_user($label, 4)); + + &make_glslink($type, $label, $format, $text) .$space . $_; +} + +sub do_cmd_glsuserv{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_user($label, 5); + + &make_glslink($type, $label, $format, $text) .$space . $_; +} + +sub do_cmd_Glsuserv{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &do_real_makefirstuc(&gls_get_user($label, 5)); + + &make_glslink($type, $label, $format, $text) .$space . $_; +} + +sub do_cmd_glsuservi{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &gls_get_user($label, 6); + + &make_glslink($type, $label, $format, $text) .$space . $_; +} + +sub do_cmd_Glsuservi{ + local($_) = @_; + local($optarg,$pat,$label,$text, $format, $insert); + + ($optarg,$pat) = &get_next_optional_argument; + + ($format,$optarg) = &get_keyval('format', $optarg); + + $label = &missing_braces unless + (s/$next_pair_pr_rx/$label=$2;''/eo); + + local ($space) = ''; + if (/^\s+[^\[]/ or /^\s*\[.*\]\s/) {$space = ' ';} + + $insert = ''; + ($insert,$pat) = &get_next_optional_argument; + + local($display) = ''; + + local($type) = &gls_get_type($label); + + $text = &do_real_makefirstuc(&gls_get_user($label, 6)); + + &make_glslink($type, $label, $format, $text) .$space . $_; +} + +sub do_cmd_acrshort{ + &do_cmd_glstext(@_) +} + +sub do_cmd_Acrshort{ + &do_cmd_Glstext(@_) +} + +sub do_cmd_ACRshort{ + &do_cmd_GLStext(@_) +} + +sub do_cmd_acrlong{ + &do_cmd_glsdesc(@_) +} + +sub do_cmd_Acrlong{ + &do_cmd_Glsdesc(@_) +} + +sub do_cmd_ACRlong{ + &do_cmd_GLSdesc(@_) +} + +sub do_cmd_acrfull{ + &do_cmd_glsfirst(@_) +} + +sub do_cmd_Acrfull{ + &do_cmd_Glsfirst(@_) +} + +sub do_cmd_ACRfull{ + &do_cmd_GLSfirst(@_) +} + +sub do_cmd_glossarypreamble{ + local($_) = @_; + $_[0]; +} + +sub do_cmd_glossarypostamble{ + local($_) = @_; + $_[0]; +} + +sub do_cmd_glsnumformat{ + local($_) = @_; + + $_; +} + +sub do_cmd_hyperit{ + join('', "\\textit ", $_[0]); +} + +sub do_cmd_hyperrm{ + join('', "\\textrm ", $_[0]); +} + +sub do_cmd_hypertt{ + join('', "\\texttt ", $_[0]); +} + +sub do_cmd_hypersf{ + join('', "\\textsf ", $_[0]); +} + +sub do_cmd_hyperbf{ + join('', "\\textbf ", $_[0]); +} + +&ignore_commands( <<_IGNORED_CMDS_ ); +makeglossary +makeglossaries +glossaryentrynumbers # {} +_IGNORED_CMDS_ + +1; diff --git a/Master/texmf-dist/scripts/glossaries/makeglossaries b/Master/texmf-dist/scripts/glossaries/makeglossaries index 19a61c9b5d0..3d053fc9553 100755 --- a/Master/texmf-dist/scripts/glossaries/makeglossaries +++ b/Master/texmf-dist/scripts/glossaries/makeglossaries @@ -27,9 +27,11 @@ # glossary-super.sty, glossaries.perl. # Also makeglossaries and makeglossaries. -my $version="2.04 (2012-05-19)"; +my $version="2.05 (2012-11-12)"; # History: +# v2.05 (2012-11-12): +# * added -d option # v2.04 (2012-04-19): # * fixed bug in &scan_aux # v2.03 (2011-04-12): @@ -76,8 +78,9 @@ use Getopt::Std; use strict; # v2.01 added the following line use warnings; +# v2.05 added $opt_d use vars qw($opt_q $opt_t $opt_o $opt_s $opt_p $opt_g $opt_c $opt_r - $opt_l $opt_i $opt_L $opt_n $opt_C); + $opt_l $opt_i $opt_L $opt_n $opt_C $opt_d); $Getopt::Std::STANDARD_HELP_VERSION = 1; @@ -86,7 +89,7 @@ $Getopt::Std::STANDARD_HELP_VERSION = 1; # .tex file) # v1.5 added -n (print the command that would be issued but # don't actually run the command) -getopts('s:o:t:p:L:C:ilqrcgn'); +getopts('s:o:t:p:L:C:ilqrcgnd:'); unless ($#ARGV == 0) { @@ -97,6 +100,9 @@ unless ($#ARGV == 0) # v2.02: added: print "makeglossaries version $version\n" unless ($opt_q); +# v2.05 added: +chdir $opt_d if ($opt_d); + # v2.02: added: my $xdynotist = 1; my $needcompatibilitymode=2; @@ -941,8 +947,9 @@ sub HELP_MESSAGE{ print "-q\t\tQuiet mode\n"; print "-s \tEmploy as the style file\n"; print "-t \tEmploy as the transcript file\n"; - print "-n\tPrint the command that would normally be executed,\n", - "\tbut don't execute it\n"; + print "-d \tRun xindy/makeindex in \n"; + print "-n\t\tPrint the command that would normally be executed,\n", + "\t\tbut don't execute it\n"; print "\n Xindy Options:\n"; print "-L \tUse .\n"; diff --git a/Master/texmf-dist/scripts/glossaries/makeglossaries.bat b/Master/texmf-dist/scripts/glossaries/makeglossaries.bat index 64a6a20750c..d91f67bd3e9 100755 --- a/Master/texmf-dist/scripts/glossaries/makeglossaries.bat +++ b/Master/texmf-dist/scripts/glossaries/makeglossaries.bat @@ -1,3 +1,3 @@ -@rem = '-*- Perl -*- -@echo off -perl -S "%~dp0makeglossaries" %* +@rem = '-*- Perl -*- +@echo off +perl -S "%~dp0makeglossaries" %* diff --git a/Master/texmf-dist/scripts/glossaries/mfirstuc.perl b/Master/texmf-dist/scripts/glossaries/mfirstuc.perl new file mode 100644 index 00000000000..7ab863d06f4 --- /dev/null +++ b/Master/texmf-dist/scripts/glossaries/mfirstuc.perl @@ -0,0 +1,129 @@ +# File : mfirstuc.perl +# Author : Nicola L. C. Talbot +# Date : 2012-09-21 +# Version : 1.0 +# Description : LaTeX2HTML (limited!) implementation of mfirstuc package + +# This is a LaTeX2HTML style implementing the mfirstuc package, and +# is distributed as part of the glossaries package. +# Copyright 2007 Nicola L.C. Talbot +# This work may be distributed and/or modified under the +# conditions of the LaTeX Project Public License, either version 1.3 +# of this license of (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'. +# +# The Current Maintainer of this work is Nicola Talbot. + +use warnings; + +package main; + +sub do_cmd_makefirstuc{ + local($_) = @_; + + local($id,$text); + + $text = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$text=$2;''/eo; + + &translate_commands("\\glsmakefirstuc $text") . $_; +} + +sub do_cmd_xmakefirstuc{ + local($_) = @_; + + local($id,$text); + + $text = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$text=$2;''/eo; + + unless ($id) + { + $id = ++$global{'max_id'}; + } + + &translate_commands("\\expandafter \\makefirstuc $OP$id$CP$text$OP$id$CP") + . $_; +} + +sub do_cmd_glsmakefirstuc{ + local($_) = @_; + + local($id,$text); + + $text = &get_next_object unless + s/$next_pair_pr_rx/$id=$1;$text=$2;''/eo; + + &do_real_makefirstuc($text).$_; +} + +sub do_real_makefirstuc{ + local($text) = @_; + + if ($text=~/^((?:\s*<[^>]+>\s*)+)(.*)/) + { + $text = $1 . ucfirst($2); + } + else + { + $text = ucfirst($text); + } + + $text; +} + +sub do_cmd_capitalisewords{ + local($_) = @_; + + local($id,$text); + + $text = &missing_braces unless + s/$next_pair_pr_rx/$id=$1;$text=$2;''/eo; + + local($newtext) = ''; + + foreach my $word (split ' ', $text) + { + $id = ++$global{'max_id'}; + + $word = &translate_commands("\\makefirstuc $OP$id$CP$word$OP$id$CP"); + + if ($newtext) + { + $newtext .= ' ' . $word; + } + else + { + $newtext = $word; + } + } + + $newtext.$_; +} + +sub get_next_object{ + local($next, $revert, $thisline); + local($this_cmd) = $cmd; + $this_cmd =~ s/^\\// unless ($cmd eq "\\"); + if (/^[\s%]*([^\n]*)\n/ ) { + $thisline = &revert_to_raw_tex($1) + } else { + $thisline = &revert_to_raw_tex($_); + } + s/^\s*//; + if ($_ =~ s/$next_token_rx//) { $next = $& }; + $next =~ s/$comment_mark(\d+\n?)?//g; + if ($next =~ /^\\(\W|\d|[a-zA-z]*\b)/) { + $revert = $next = "\\".$1; + } elsif ($next =~ /\W/) { + $revert = &revert_to_raw_tex($next); + } else { $revert = $next }; + $next; +} + +1; -- cgit v1.2.3