diff options
Diffstat (limited to 'Master/texmf-dist/doc/latex/comprehensive/source/makefakeMnSymbol')
-rw-r--r-- | Master/texmf-dist/doc/latex/comprehensive/source/makefakeMnSymbol | 254 |
1 files changed, 254 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/comprehensive/source/makefakeMnSymbol b/Master/texmf-dist/doc/latex/comprehensive/source/makefakeMnSymbol new file mode 100644 index 00000000000..cadebdfe37b --- /dev/null +++ b/Master/texmf-dist/doc/latex/comprehensive/source/makefakeMnSymbol @@ -0,0 +1,254 @@ +#! /usr/bin/env perl + +# Convert MnSymbol.sty to a faked version which does not require +# the definition of any additional math alphabets +# +# By Scott Pakin <scott.clsl@pakin.org> + +use POSIX; +use warnings; +use strict; + +# Output some header boilerplate. +print "\%" x 43, "\n"; +print "\% This is a generated file. DO NOT EDIT. \%\n"; +print "\%" x 43, "\n"; +print "\n"; +print strftime("\\ProvidesPackage{fakeMnSymbol}[\%Y/\%m/\%d v1.0 faked version of MnSymbol.sty]\n", localtime()); +print <<'MACRODEFS'; + +% Construct a text-sized delimiter from its constituent characters. +\DeclareRobustCommand{\MNSfaketdelim}[3]{% + \begingroup + \def\char@in@box##1{% + \setbox0=\hbox{\char##1}% + \hbox{% + \vrule width \wd0 height 0pt depth 0pt + \vrule width 0pt height \ht0 depth \dp0 + \smash{\box0}% + }% + \vspace*{-1pt}% Why is this necessary? + }% + \offinterlineskip + \vbox{% + \halign{##\cr + \char@in@box{#1}\cr % top + \char@in@box{#2}\cr % mid + \char@in@box{#3}\cr % bot + }% + }% + \endgroup +} + +% Construct a display-sized delimiter from its constituent characters. +\DeclareRobustCommand{\MNSfakeddelim}[4]{% + \begingroup + \def\char@in@box##1{% + \setbox0=\hbox{\char##1}% + \hbox{% + \vrule width \wd0 height 0pt depth 0pt + \vrule width 0pt height \ht0 depth \dp0 + \smash{\box0}% + }% + \vspace*{-1pt}% Why is this necessary? + }% + \offinterlineskip + \vbox to 4ex{% + \halign{##\cr + \char@in@box{#1}\cr % top + \char@in@box{#4}\cr % rep + \char@in@box{#4}\cr % rep + \char@in@box{#2}\cr % mid + \char@in@box{#4}\cr % rep + \char@in@box{#4}\cr % rep + \char@in@box{#3}\cr % bot + }% + \vss + }% + \endgroup +} + +% Given a math expression, a small accent character, and a large +% accent character, typeset the expression with the appropriate-sized +% accent above it. +\DeclareRobustCommand{\MNSfakewidetopaccent}[5]{% + \setbox0=\hbox{\ensuremath{#1}}% + \setbox1=\hbox{\ensuremath{abc}}% + \ifdim\wd0<\wd1 + \rlap{\raisebox{#2}{\makebox[\wd0]{\usefont{U}{MnSymbolE}{m}{n}\char#3}}}% + \else + \rlap{\raisebox{#4}{\makebox[\wd0]{\usefont{U}{MnSymbolE}{m}{n}\char#5}}}% + \fi + \box0\relax +} +MACRODEFS + ; + +# Read the font metrics for the largesymbol font in preparation for +# faking the variable-sized delimiters. +my $tfmfile = `kpsewhich MnSymbolE10.tfm`; +my @nextlarger; # Map from a character number to the next larger character +my @varchar; # Map from a character number to a varchar hash +if ($tfmfile ne "") { + chomp $tfmfile; + open (LARGESYMBOLS, "tftopl $tfmfile|") || die "tftopl $tfmfile: $!\n"; + my $charnum = -1; # Character number of the current character + while (my $oneline = <LARGESYMBOLS>) { + chomp $oneline; + if ($oneline =~ /^\(CHARACTER ([CO]) (\w+)/) { + $charnum = $1 eq "O" ? oct($2) : ord($2); + } + elsif ($oneline =~ /\(NEXTLARGER ([CO]) (\w+)/) { + $nextlarger[$charnum] = $1 eq "O" ? oct($2) : ord($2); + } + elsif ($oneline =~ /\((TOP|MID|BOT|REP) ([CO]) (\w+)/) { + $varchar[$charnum]->{$1} = $2 eq "O" ? oct($3) : ord($3); + } + } + close LARGESYMBOLS; +} + +# Process each symbol declaration in turn. +my $slot = 0; +my %families; +while (<>) { + # Process all symbols defined with \Decl@Mn@Char. + /\\Set\@Mn\@Sym\{(\d+)\}/ && do {$slot=0+$1; next}; + /^\\Decl\@Mn\@Char\\@?(\w+)\s*\{(\w+)\}/ && do { + my $symname = $1; + my $family = $2; + if ($family =~ /^MnSy(\w)$/) { + $family = "MnSymbol" . $1; + } + elsif ($family eq "symbols") { + $family = "MnSymbolF"; + } + else { + die "${0}: unrecognized symbol family \"$family\"\n"; + } + if (!defined $families{$family}) { + $families{$family}++; + print "\n"; + print "\\DeclareFontFamily{U}{$family}{}\n"; + print "\\DeclareFontShape{U}{$family}{m}{n}{<-> ${family}10}{}\n"; + } + print "\\DeclareRobustCommand{\\MNS$symname}"; + print "{\\mbox{\\usefont{U}{$family}{m}{n}\\char$slot}}\n"; + $slot++; + }; + + # Process variable-sized symbols specially. + /^\\Decl\@Mn\@(Open|Close|Delim)\s*\{([^\}]+)\}.*\{\'(\d+)\}\s*$/ && do { + my $charnum = oct $3; + my %sym2name = ("[" => "lbracket", + "]" => "rbracket", + "|" => "pipe", + "<" => "less", + ">" => "greater", + "/" => "slash", + "(" => "lparen", + ")" => "rparen"); + my $symname = substr($2, 0, 1) eq "\\" ? substr($2, 1) : $sym2name{$2}; + my $family = "MnSymbolE"; + if (!defined $families{$family}) { + $families{$family}++; + print "\n"; + print "\\DeclareFontFamily{U}{$family}{}\n"; + print "\\DeclareFontShape{U}{$family}{m}{n}{<-> ${family}10}{}\n"; + } + my $tcharnum; # Character number of the \big symbol size + my $dcharnum; # Character number of the variable-sized symbol + $tcharnum = defined $nextlarger[$charnum] ? $nextlarger[$charnum] : $charnum; + for ($dcharnum=$tcharnum; defined $nextlarger[$dcharnum]; $dcharnum=$nextlarger[$dcharnum]) { + } + + # Define the text-sized version of the delimiter. + print "\\DeclareRobustCommand{\\MNSt$symname}"; + print "{\\mbox{\\usefont{U}{$family}{m}{n}"; + if (defined $varchar[$tcharnum]) { + # Even the \big size is variable-sized. + my $rep = $varchar[$tcharnum]->{REP}; + my $top = $varchar[$tcharnum]->{TOP} || $rep; + my $bot = $varchar[$tcharnum]->{BOT} || $rep; + my $mid = $varchar[$tcharnum]->{MID} || $rep; + print "\\MNSfaketdelim{$top}{$mid}{$bot}"; + } + else { + print "\\char$tcharnum"; + } + print "}}\n"; + + # Define the display-sized version of the delimiter. + print "\\DeclareRobustCommand{\\MNSd$symname}"; + print "{\\mbox{\\usefont{U}{$family}{m}{n}"; + my $rep = $varchar[$dcharnum]->{REP}; + if (defined $rep) { + my $top = $varchar[$dcharnum]->{TOP} || $rep; + my $bot = $varchar[$dcharnum]->{BOT} || $rep; + my $mid = $varchar[$dcharnum]->{MID} || $rep; + print "\\MNSfakeddelim{$top}{$mid}{$bot}{$rep}"; + } + else { + print "\\char$dcharnum"; + } + print "}}\n"; + }; +} + +# Output some trailer boilerplate. +print <<'TRAILER'; + +% Redefine some problematic symbols. +\DeclareRobustCommand{\MNSdlparen}{\mbox{\usefont{U}{MnSymbolE}{m}{n}\char140}} +\DeclareRobustCommand{\MNSdrparen}{\mbox{\usefont{U}{MnSymbolE}{m}{n}\char145}} + +% The following symbols were renamed and adapted from MnSymbol.sty. +\let\MNSrelbar=\MNSleftrightline +\DeclareRobustCommand\MNSjoinrel{\mathrel{\mkern-12.4mu}} +\DeclareRobustCommand\MNSlongrightarrow{\DOTSB\MNSleftrightline\MNSjoinrel\MNSrightarrow} +\DeclareRobustCommand\MNSlongleftarrow{\DOTSB\MNSleftarrow\MNSjoinrel\MNSleftrightline} +\DeclareRobustCommand\MNSlongleftrightarrow{\DOTSB\MNSleftarrow\MNSjoinrel\MNSrightarrow} +\DeclareRobustCommand\MNSLongrightarrow{\DOTSB\MNSLeftrightline\MNSjoinrel\MNSRightarrow} +\DeclareRobustCommand\MNSLongleftarrow{\DOTSB\MNSLeftarrow\MNSjoinrel\MNSLeftrightline} +\DeclareRobustCommand\MNSLongleftrightarrow{\DOTSB\MNSLeftarrow\MNSjoinrel\MNSRightarrow} +\DeclareRobustCommand\MNSlongmapsto{\DOTSB\MNSleftfootline\MNSjoinrel\MNSrightarrow} +\DeclareRobustCommand\MNSemptyfilledspoon{\DOTSB\MNSleftspoon\mkern-13mu\MNSrightfilledspoon} +\DeclareRobustCommand\MNSfilledemptyspoon{\DOTSB\MNSleftfilledspoon\mkern-13mu\MNSrightspoon} +\DeclareRobustCommand\MNSlargeemptyfilledspoon{\DOTSB\mathrel{\MNScirc\mkern-3mu\MNSrelbar\mkern-3mu\MNSbullet}} +\DeclareRobustCommand\MNSlargefilledemptyspoon{\DOTSB\mathrel{\MNSbullet\mkern-3mu\MNSrelbar\mkern-3mu\MNScirc}} + +% The following accents were renamed and adapted from MnSymbol.sty. +\DeclareRobustCommand{\MNSoverbrace}[1]{\MNSfakewidetopaccent{#1}{1.5ex}{'251}{2.1ex}{'253}} +\DeclareRobustCommand{\MNSunderbrace}[1]{\MNSfakewidetopaccent{#1}{-1.7ex}{'256}{-1.7ex}{'260}} +\DeclareRobustCommand{\MNSwidehat}[1]{\MNSfakewidetopaccent{#1}{0ex}{'302}{0.6ex}{'303}} +\DeclareRobustCommand{\MNSwidetilde}[1]{\MNSfakewidetopaccent{#1}{0ex}{'307}{0.6ex}{'310}} +\DeclareRobustCommand{\MNSwideparen}[1]{\MNSfakewidetopaccent{#1}{0ex}{'314}{0.6ex}{'315}} +\DeclareRobustCommand{\MNSvec}[1]{\MNSfakewidetopaccent{#1}{0ex}{'321}{0ex}{'321}} +\def\MNSlinesegmentfill@{\arrowfill@\MNSleftfootline\MNSrelbar\MNSrightfootline} +\def\MNSleftharpoonfill@{\arrowfill@\MNSleftharpooncw\MNSrelbar\MNSrelbar} +\def\MNSrightharpoonfill@{\arrowfill@\MNSrelbar\MNSrelbar\MNSrightharpoonccw} +\DeclareRobustCommand{\MNSoverlinesegment}{\mathpalette{\overarrow@\MNSlinesegmentfill@}} +\DeclareRobustCommand{\MNSoverleftharpoon}{\mathpalette{\overarrow@\MNSleftharpoonfill@}} +\DeclareRobustCommand{\MNSoverrightharpoon}{\mathpalette{\overarrow@\MNSrightharpoonfill@}} +\DeclareRobustCommand{\MNSunderlinesegment}{\mathpalette{\underarrow@\MNSlinesegmentfill@}} +\def\MNSbracefill@#1#2#3#4#5{$\m@th#5#1\leaders\hbox{$#4$}\hfill#2\leaders\hbox{$#4$}\hfill#3$} +\def\MNSdowngroupfill@{\MNSbracefill@\MNSbraceld{}\MNSbracerd\MNSbracemid} +\def\MNSupgroupfill@{\MNSbracefill@\MNSbracelu{}\MNSbraceru\MNSbracemid} +\def\MNSoverbrace@#1#2#3{\vbox{\m@th\ialign{##\crcr + #1#2\crcr\noalign{\kern2\p@\nointerlineskip}% + $\m@th\hfil#2#3\hfil$\crcr}}} +\def\MNSunderbrace@#1#2#3{\vtop{\m@th\ialign{##\crcr + $\m@th\hfil#2#3\hfil$\crcr + \noalign{\kern2\p@\nointerlineskip}% + #1#2\crcr}}} +\def\MNSbraceld{\mbox{\usefont{U}{MnSymbolE}{m}{n}\char'263}} +\def\MNSbracelu{\mbox{\usefont{U}{MnSymbolE}{m}{n}\char'264}} +\def\MNSbracerd{\mbox{\usefont{U}{MnSymbolE}{m}{n}\char'265}} +\def\MNSbraceru{\mbox{\usefont{U}{MnSymbolE}{m}{n}\char'266}} +\def\MNSbracemid{\mbox{\usefont{U}{MnSymbolE}{m}{n}\char'271}} +\DeclareRobustCommand{\MNSovergroup}{\mathpalette{\MNSoverbrace@\MNSdowngroupfill@}} +\DeclareRobustCommand{\MNSundergroup}{\mathpalette{\MNSunderbrace@\MNSupgroupfill@}} + +\endinput +TRAILER +; |