package LaTeXML::Package::Pool; use strict; use LaTeXML::Package; use Cwd qw(cwd abs_path); DeclareOption('noindex',''); RequirePackage('sref'); Tag('omdoc:metadata',afterOpen=>\&numberIt,afterClose=>\&locateIt,autoClose=>1,autoOpen=>1); DefConstructor('\CMP@itemize@item[]', "?#1(#1)()", properties=>sub{ RefStepItemCounter(); }); DefConstructor('\CMP@enumerate@item[]', "?#1(#1)()", properties=>sub{ RefStepItemCounter(); }); DefConstructor('\CMP@description@item[]', "" . "?#1(#1)()", # trust di and dt to autoclose properties=>sub{ RefStepItemCounter(); }); DefEnvironment('{CMP@itemize}', "#body", properties=>sub { beginItemize('CMP@itemize'); }, beforeDigest=>sub { Let(T_CS('\end{itemize}') =>T_CS('\end{CMP@itemize}')); }); DefEnvironment('{CMP@enumerate}', "#body", properties=>sub { beginItemize('CMP@enumerate'); }, beforeDigest=>sub { Let(T_CS('\end{enumerate}') =>T_CS('\end{CMP@enumerate}')); }); DefEnvironment('{CMP@description}', "#body", properties=>sub { beginItemize('CMP@description'); }, beforeDigest=>sub { Let(T_CS('\end{description}') =>T_CS('\end{CMP@description}'));}); sub useCMPItemizations { Let(T_CS('\begin{itemize}') =>T_CS('\begin{CMP@itemize}')); Let(T_CS('\begin{enumerate}') =>T_CS('\begin{CMP@enumerate}')); Let(T_CS('\begin{description}')=>T_CS('\begin{CMP@description}')); return; } sub declareFunctions{ my ($stomach,$whatsit) = @_; my $keyval = $whatsit->getArg(1); my $funval = KeyVal($keyval,'functions') if KeyVal($keyval,'functions'); my @funsymbs = ParseKeyValList($funval); #Unread the function declarations at the Gullet foreach (@funsymbs) { $stomach->getGullet->unread(Tokenize('\lxDeclare[role=FUNCTION]{$'.$_.'$}')->unlist); } return; } Tag('omdoc:CMP', afterOpen => sub {AssignValue('_LastSeenCMP', $_[1], 'global');return;});#$ Tag('omdoc:li', autoClose=>1); Tag('omdoc:dd', autoClose=>1); Tag('omdoc:di', autoClose=>1); DefKeyVal('omtext','functions','Semiverbatim'); DefKeyVal('omtext','display','Semiverbatim'); DefKeyVal('omtext','for','Semiverbatim'); DefKeyVal('omtext','from','Semiverbatim'); DefKeyVal('omtext','type','Semiverbatim'); DefKeyVal('omtext','title','Plain'); #Math mode in titles. DefKeyVal('omtext','start','Plain'); #Math mode in start phrases DefKeyVal('omtext','theory','Semiverbatim'); DefKeyVal('omtext','continues','Semiverbatim'); DefKeyVal('omtext','verbalizes','Semiverbatim'); DefCMPEnvironment('{omtext} OptionalKeyVals:omtext', "" . "?&KeyVal(#1,'title')(&KeyVal(#1,'title'))()" . "" . "" . "?&KeyVal(#1,'start')(&KeyVal(#1,'start'))()" . "#body"); sub DefCMPEnvironment { my ($proto, $replacement, %options) = @_; my @before = $options{beforeDigest} ? ($options{beforeDigest}) : (); push(@before, \&useCMPItemizations); $options{beforeDigest} = \@before; my @after = $options{afterDigestBegin} ? ($options{afterDigestBegin}) : (); push(@after, \&declareFunctions); $options{afterDigestBegin} = \@after; DefEnvironment($proto, $replacement, %options); } sub DefCMPConstructor { my ($proto, $replacement, %options) = @_; my @before = $options{beforeDigest} ? ($options{beforeDigest}) : (); push(@before, \&useCMPItemizations); $options{beforeDigest} = \@before; DefConstructor($proto, $replacement, %options); }#$ DefKeyVal('phrase','id','Semiverbatim'); DefKeyVal('phrase','style','Semiverbatim'); DefKeyVal('phrase','class','Semiverbatim'); DefKeyVal('phrase','index','Semiverbatim'); DefKeyVal('phrase','verbalizes','Semiverbatim'); DefKeyVal('phrase','type','Semiverbatim'); DefConstructor('\phrase OptionalKeyVals:phrase {}', "#2"); DefConstructor('\nlex{}', "#1"); DefConstructor('\nlcex{}', "#1"); DefConstructor('\sinlinequote [] {}', "" . "?#1(#1\n)()" . "#2" . ""); DefEnvironment('{sblockquote} []', "?#1(" . "#1" . "#body" . " )" . "(#body)"); DefConstructor('\lec{}', "\n#1"); RawTeX(' \newcommand\mygraphics[2][]{\includegraphics[#1]{#2}} \newcommand\mycgraphics[2][]{\begin{center}\includegraphics[#1]{#2}\end{center}} \newcommand\mybgraphics[2][]{\fbox{\includegraphics[#1]{#2}\end{center}}} '); DefConstructor('\indextoo[]{}', "" . "#2" . "" . "#2" . "" .""); DefConstructor('\indexalt[]{}{}', "" . "#2" . "" . "#3" . "" .""); DefConstructor('\twintoo[]{}{}', "" . "#2 #3" . "" . "#2" . "#3" . "" .""); DefConstructor('\twinalt[]{}{}{}', "" . "#2" . "" . "#2" . "#3" . "" .""); DefConstructor('\atwintoo[]{}{}{}', "" . "#2 #3" . "" . "#2" . "#3" . "#4" . "" .""); DefConstructor('\atwinalt[]{}{}{}{}', "" . "#2" . "" . "#2" . "#3" . "#4" . "" .""); DefConstructor('\par',sub { $_[0]->maybeCloseElement('omdoc:p'); },alias=>"\\par\n"); Tag('omdoc:p', autoClose=>1, autoOpen=>1); Tag('omdoc:CMP', autoClose=>1, autoOpen=>1); Tag('omdoc:omtext', autoClose=>1, autoOpen=>1); DefConstructor('\omspace{}',''); DefConstructor('\emph{}',"#1"); DefConstructor('\em',""); DefConstructor('\texttt{}',"#1"); DefConstructor('\tt',""); DefConstructor('\textbf{}',"#1"); DefConstructor('\bf',""); DefConstructor('\textsf{}',"#1"); DefConstructor('\sf',""); DefConstructor('\textsl{}',"#1"); DefConstructor('\sl',""); DefConstructor('\textit{}',"#1"); DefConstructor('\it',""); Tag('omdoc:phrase', autoClose=>1); DefEnvironment('{center}','#body'); DefEnvironment('{flushleft}','#body'); DefEnvironment('{flushright}','#body'); DefEnvironment('{minipage}[]{}','#body'); DefEnvironment('{quote}', "" . "#body" .""); DefEnvironment('{quotation}', " . "#body" .""); DefEnvironment('{LARGE}','#body'); DefEnvironment('{Large}','#body'); DefEnvironment('{large}','#body'); DefEnvironment('{small}','#body'); DefEnvironment('{footnotesize}','#body'); DefEnvironment('{tiny}','#body'); DefEnvironment('{scriptsize}','#body'); DefConstructor('\LARGE',''); DefConstructor('\Large',''); DefConstructor('\large',''); DefConstructor('\small',''); DefConstructor('\footnotesize',''); DefConstructor('\scriptsize',''); DefConstructor('\tiny',''); DefConstructor('\fbox{}','#1'); DefConstructor('\footnote[]{}', "#2"); DefConstructor('\footnotemark[]',""); DefConstructor('\footnotetext[]{}', "#2"); DefConstructor('\sf', ''); DefConstructor('\sc', ''); Tag('omdoc:p',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('omdoc:omtext',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('omdoc:omgroup',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('omdoc:CMP',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('omdoc:link',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('omdoc:meta',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('omdoc:resource',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('omdoc:ul',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('omdoc:li',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('omdoc:di',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('omdoc:dt',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('omdoc:dd',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('omdoc:ol',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('omdoc:dl',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('omdoc:idx',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('omdoc:phrase',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('omdoc:note',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('ltx:tabular',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('ltx:thead',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('ltx:td',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('ltx:tr',afterOpen=>\&numberIt,afterClose=>\&locateIt); Tag('ltx:caption',afterOpen=>\&numberIt,afterClose=>\&locateIt); sub numberIt { my($document,$node,$whatsit)=@_; my(@parents)=$document->findnodes('ancestor::*[@xml:id]',$node); my $prefix= (@parents ? $parents[$#parents]->getAttribute('xml:id')."." : ''); my(@siblings)=$document->findnodes('preceding-sibling::*[@xml:id]',$node); my $n = scalar(@siblings)+1; my $id = ($node -> getAttribute('xml:id')); $node->setAttribute('xml:id'=>$prefix."p$n") unless $id; my $about = $node -> getAttribute('about'); $node->setAttribute('about'=>'#'.$node->getAttribute('xml:id')) unless $about; #Also, provide locators: my $locator = $whatsit->getProperty('locator'); #Need to inherit locators if missing: $locator = (@parents ? $parents[$#parents]->getAttribute('stex:srcref') : '') unless $locator; $node->setAttribute('stex:srcref'=>$locator) if $locator; } sub locateIt { my($document,$node,$whatsit)=@_; #Estimate trailer locator: my $trailer = $whatsit->getProperty('trailer'); return unless $trailer; #Nothing we can do if the trailer isn't defined $trailer = $trailer->getLocator; return unless ($trailer && $trailer!~/^\s*$/); #Useless if broken my $locator = $node->getAttribute('stex:srcref'); if ($locator) { $locator =~ /^(.+from=\d+;\d+)/; my $from = $1; $trailer =~ /(,to=\d+;\d+.+)$/; my $to = $1; $locator = $from.$to; } else { $locator = $trailer; #This should never happen } $node->setAttribute('stex:srcref' => $locator); } 1;