%%
%% This is file `gotoh.sty',
%% generated with the docstrip utility.
%%
%% The original source files were:
%%
%% gotoh.dtx  (with options: `package')
%% 
%% Copyright (c) 2017 Takuto ASAKURA (wtsnjp)
%%   GitHub:   https://github.com/wtsnjp
%%   Twitter:  @wtsnjp
%% 
%% This package is distributed under the MIT License.
%% 
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{gotoh}[2017/05/05 v1.0 Sequence alignment algorithm]
\RequirePackage{xkeyval}
\def\gth@pkgname{gotoh}
\def\gth@warn{\PackageWarningNoLine\gth@pkgname}
\def\gth@error{\PackageError\gth@pkgname}
\newif\if@gth@first@
\newif\if@gth@remain@
\newif\if@gth@gap@
\newif\if@gth@gapx@
\newif\if@gth@gapy@
\newcount\gth@tempcnta
\newcount\gth@tempcntb
\newcount\gth@tempcntc
\newcount\gth@tempcntd
\newcount\gth@calc
\edef\gth@sn{\number\z@}
\mathchardef\gth@M="7FFF
\edef\gth@min{-\number\gth@M}
\newdimen\gth@tempdima
\define@cmdkeys[gth]{config}[gth@]{match, mismatch, d, e}
\setkeys[gth]{config}{match=1, mismatch=-1, d=7, e=1}
\define@key[gth]{config}{score}{\def\gth@score{#1}}
\define@key[gth]{config}{result A}{\def\gth@resulta{#1}}
\define@key[gth]{config}{result B}{\def\gth@resultb{#1}}
\setkeys[gth]{config}{
  score=\GotohScore, result A=\GotohResultA, result B=\GotohResultB}
\define@boolkeys[gth]{config}[@gth@]{memoization, uppercase}[true]
\define@key[gth]{config}{gap char}{\def\gth@gap@char{#1}}
\setkeys[gth]{config}{memoization=false, uppercase=false, gap char={.}}
\def\gth@nameuse#1{\csname gth@#1\endcsname}
\def\gth@name@edef#1{\expandafter\edef\csname gth@#1\endcsname}
\def\gth@name@xdef#1{\expandafter\xdef\csname gth@#1\endcsname}
\def\gth@glet{\global\let}
\def\gth@advance#1#2{%
  \gth@calc#1\advance\gth@calc#2\edef#1{\the\gth@calc}}
\def\gth@increment#1{\gth@advance#1\@ne}
\def\gth@decrement#1{\gth@advance#1\m@ne}
\def\gth@max#1{%
  \@gth@first@true
  \@for\gth@member:=#1\do{%
    \if@gth@first@
      \gth@calc\gth@member
      \@gth@first@false
    \else
      \ifnum\gth@member>\gth@calc
        \gth@calc\gth@member
      \fi
    \fi}}
\def\gth@gap@penalty#1{%
  \gth@calc#1\relax
  \advance\gth@calc\m@ne
  \multiply\gth@calc-\gth@e
  \advance\gth@calc-\gth@d}
\def\gth@tab#1{%
  \bgroup
    \sbox\z@ 0%
    \expandafter\gth@tempdima\ht\z@
    \multiply\gth@tempdima 8%
    \mbox{\hbox to\gth@tempdima{\hss #1}}%
  \egroup}
\def\gth@print@matrix#1{%
  \bgroup\texttt
    #1:\\
    \gth@tempcnta\z@
    \@whilenum\gth@tempcnta<\gth@m\do{%
      \gth@tempcntb\z@
      \@whilenum\gth@tempcntb<\gth@n\do{%
        \gth@tab{%
          \gth@nameuse{\gth@sn @#1@\the\gth@tempcnta
                    @\the\gth@tempcntb}}%
      \advance\gth@tempcntb\@ne}\\
    \advance\gth@tempcnta\@ne}%
  \egroup}
\newcommand{\Gotoh}[2]{%
  \if@gth@uppercase
    \uppercase{\gth@gotoh{#1}{#2}}%
  \else
    \gth@gotoh{#1}{#2}%
  \fi}
\def\gth@gotoh#1#2{%
  \gth@increment\gth@sn
  \bgroup
    \gth@tempcnta\z@
    \@tfor\gth@member:=#1\do{%
      \gth@name@edef{seqa@\the\gth@tempcnta}{\gth@member}%
      \advance\gth@tempcnta\@ne}%
    \advance\gth@tempcnta\@ne
    \edef\gth@m{\the\gth@tempcnta}%
    \gth@tempcntb\z@
    \@tfor\gth@member:=#2\do{%
      \gth@name@edef{seqb@\the\gth@tempcntb}{\gth@member}%
      \advance\gth@tempcntb\@ne}%
    \advance\gth@tempcntb\@ne
    \edef\gth@n{\the\gth@tempcntb}%
    \gth@tempcnta\z@
    \@whilenum\gth@tempcnta<\gth@m\do{%
      \gth@gap@penalty{\gth@tempcnta}%
      \gth@name@xdef{\gth@sn @m@\the\gth@tempcnta @0}{\gth@min}%
      \gth@name@xdef{\gth@sn @ix@\the\gth@tempcnta @0}{\the\gth@calc}%
      \gth@name@xdef{\gth@sn @iy@\the\gth@tempcnta @0}{\gth@min}%
      \advance\gth@tempcnta\@ne}%
    \gth@tempcntb\z@
    \@whilenum\gth@tempcntb<\gth@n\do{%
      \gth@gap@penalty{\gth@tempcntb}%
      \gth@name@xdef{\gth@sn @m@0@\the\gth@tempcntb}{\gth@min}%
      \gth@name@xdef{\gth@sn @ix@0@\the\gth@tempcntb}{\gth@min}%
      \gth@name@xdef{\gth@sn @iy@0@\the\gth@tempcntb}{\the\gth@calc}%
      \advance\gth@tempcntb\@ne}%
    \gth@name@xdef{\gth@sn @m@0@0}{\number\z@}%
    \if@gth@memoization
      \gth@decrement\gth@m \gth@decrement\gth@n
        \gth@memo@ix{\gth@m}{\gth@n}%
        \gth@memo@iy{\gth@m}{\gth@n}%
        \gth@memo@m{\gth@m}{\gth@n}%
      \gth@increment\gth@m \gth@increment\gth@n
    \else
      \gth@tempcnta\@ne
      \@whilenum\gth@tempcnta<\gth@m\do{%
        \gth@tempcntb\@ne
        \@whilenum\gth@tempcntb<\gth@n\do{%
          \advance\gth@tempcnta\m@ne
            \gth@max{%
              \gth@nameuse{\gth@sn @m@\the\gth@tempcnta
                        @\the\gth@tempcntb},%
              \gth@nameuse{\gth@sn @iy@\the\gth@tempcnta
                        @\the\gth@tempcntb}}%
            \gth@tempcntc\gth@calc
            \gth@tempcntd
              \gth@nameuse{\gth@sn @ix@\the\gth@tempcnta
                        @\the\gth@tempcntb}%
            \advance\gth@tempcntc-\gth@d\advance\gth@tempcntd-\gth@e
          \advance\gth@tempcnta\@ne
          \gth@max{\gth@tempcntc,\gth@tempcntd}%
          \gth@name@xdef{\gth@sn @ix@\the\gth@tempcnta
                         @\the\gth@tempcntb}{%
            \the\gth@calc}%
          \advance\gth@tempcntb\m@ne
            \gth@tempcntc
              \gth@nameuse{\gth@sn @m@\the\gth@tempcnta
                        @\the\gth@tempcntb}%
            \gth@tempcntd
              \gth@nameuse{\gth@sn @iy@\the\gth@tempcnta
                        @\the\gth@tempcntb}%
            \advance\gth@tempcntc-\gth@d\advance\gth@tempcntd-\gth@e
          \advance\gth@tempcntb\@ne
          \gth@max{\gth@tempcntc,\gth@tempcntd}%
          \gth@name@xdef{\gth@sn @iy@\the\gth@tempcnta
                         @\the\gth@tempcntb}{%
            \the\gth@calc}%
          \advance\gth@tempcnta\m@ne\advance\gth@tempcntb\m@ne
            \gth@max{%
              \gth@nameuse{\gth@sn @m@\the\gth@tempcnta
                        @\the\gth@tempcntb},%
              \gth@nameuse{\gth@sn @ix@\the\gth@tempcnta
                        @\the\gth@tempcntb},%
              \gth@nameuse{\gth@sn @iy@\the\gth@tempcnta
                        @\the\gth@tempcntb}}%
            \edef\gth@tmpa{\gth@nameuse{seqa@\the\gth@tempcnta}}%
            \edef\gth@tmpb{\gth@nameuse{seqb@\the\gth@tempcntb}}%
          \advance\gth@tempcnta\@ne\advance\gth@tempcntb\@ne
          \ifx\gth@tmpa\gth@tmpb
            \advance\gth@calc\gth@match
          \else
            \advance\gth@calc\gth@mismatch
          \fi
          \gth@name@xdef{\gth@sn @m@\the\gth@tempcnta
                         @\the\gth@tempcntb}{%
            \the\gth@calc}%
          \advance\gth@tempcntb\@ne}%
        \advance\gth@tempcnta\@ne}%
    \fi
    %\gth@print@matrix{m}%
    %\gth@print@matrix{ix}%
    %\gth@print@matrix{iy}%
    \bgroup
      \gth@decrement\gth@m \gth@decrement\gth@n
      \expandafter\xdef\gth@score{%
        \gth@nameuse{\gth@sn @m@\gth@m @\gth@n}}%
    \egroup
    \let\gth@rseq@x\@empty\let\gth@rseq@y\@empty\let\gth@mode@seq\@empty
    \@gth@remain@true\@gth@gapx@false\@gth@gapy@false
    \@whilesw\if@gth@remain@\fi{%
      \ifnum\gth@m=\z@
        \gth@decrement\gth@n
        \expandafter\expandafter\expandafter
        \ifx\gth@nameuse{seqb@\gth@n}\relax\else
          \edef\gth@rseq@x{\gth@gap@char\gth@rseq@x}%
          \edef\gth@rseq@y{\gth@nameuse{seqb@\gth@n}%
                           \gth@rseq@y}%
        \fi
      \else\ifnum\gth@n=\z@
        \gth@decrement\gth@m
        \expandafter\expandafter\expandafter
        \ifx\gth@nameuse{seqa@\gth@m}\relax\else
          \edef\gth@rseq@x{\gth@nameuse{seqa@\gth@m}%
                           \gth@rseq@x}%
          \edef\gth@rseq@y{\gth@gap@char\gth@rseq@y}%
        \fi
      \else
        \if@gth@gapx@
          % mode: gap x
          \gth@decrement\gth@m
          \expandafter\expandafter\expandafter
          \ifx\gth@nameuse{seqa@\gth@m}\relax\else
            \edef\gth@rseq@x{\gth@nameuse{seqa@\gth@m}%
                             \gth@rseq@x}%
            \edef\gth@rseq@y{\gth@gap@char\gth@rseq@y}%
          \fi
          \gth@tempcnta\gth@nameuse{\gth@sn @m@\gth@m @\gth@n}%
          \gth@tempcntb\gth@nameuse{\gth@sn @ix@\gth@m @\gth@n}%
          \gth@tempcntc\gth@nameuse{\gth@sn @iy@\gth@m @\gth@n}%
          \advance\gth@tempcnta-\gth@d
          \advance\gth@tempcntb-\gth@e
          \advance\gth@tempcntc-\gth@d
          \ifnum\gth@tempcnta>\gth@tempcntb
            \@gth@gapx@false
          \else\ifnum\gth@tempcntb<\gth@tempcntc
            \@gth@gapx@false\@gth@gapy@true
          \fi\fi
        \else\if@gth@gapy@
          % mode: gap y
          \gth@decrement\gth@n
          \expandafter\expandafter\expandafter
          \ifx\gth@nameuse{seqb@\gth@n}\relax\else
            \edef\gth@rseq@x{\gth@gap@char\gth@rseq@x}%
            \edef\gth@rseq@y{\gth@nameuse{seqb@\gth@n}%
                             \gth@rseq@y}%
          \fi
          \gth@tempcnta\gth@nameuse{\gth@sn @m@\gth@m @\gth@n}%
          \gth@tempcntb\gth@nameuse{\gth@sn @iy@\gth@m @\gth@n}%
          \advance\gth@tempcnta-\gth@d\advance\gth@tempcntb-\gth@e
          \ifnum\gth@tempcnta>\gth@tempcntb
            \@gth@gapy@false
          \fi
        \else
          % mode: default
          \gth@decrement\gth@m
          \gth@decrement\gth@n
          \expandafter\expandafter\expandafter
          \ifx\gth@nameuse{seqa@\gth@m}\relax\else
            \expandafter\expandafter\expandafter
            \ifx\gth@nameuse{seqb@\gth@n}\relax\else
              \edef\gth@rseq@x{\gth@nameuse{seqa@\gth@m}%
                               \gth@rseq@x}%
              \edef\gth@rseq@y{\gth@nameuse{seqb@\gth@n}%
                               \gth@rseq@y}%
            \fi
          \fi
          \gth@tempcnta\gth@nameuse{\gth@sn @m@\gth@m @\gth@n}%
          \gth@tempcntb\gth@nameuse{\gth@sn @ix@\gth@m @\gth@n}%
          \gth@tempcntc\gth@nameuse{\gth@sn @iy@\gth@m @\gth@n}%
          \@gth@gap@false
          \ifnum\gth@tempcnta<\gth@tempcntb\@gth@gap@true\fi
          \ifnum\gth@tempcnta<\gth@tempcntc\@gth@gap@true\fi
          \if@gth@gap@
            \ifnum\gth@tempcntb>\gth@tempcntc
              \@gth@gapx@true
            \else
              \@gth@gapy@true
            \fi
          \fi
        \fi\fi
      \fi\fi
      \ifnum\gth@m<\@ne\ifnum\gth@n<\@ne
        \@gth@remain@false
      \fi\fi}%
    \expandafter\gth@glet\gth@resulta\gth@rseq@x
    \expandafter\gth@glet\gth@resultb\gth@rseq@y
  \egroup}
\def\gth@memo@ix#1#2{%
  \bgroup
    \gth@tempcnta#1\gth@tempcntb#2\relax
    \expandafter\expandafter\expandafter
    \ifx\gth@nameuse{\gth@sn @ix@\the\gth@tempcnta
                  @\the\gth@tempcntb}\relax
      \advance\gth@tempcnta\m@ne
        \gth@memo@ix{\gth@tempcnta}{\gth@tempcntb}%
        \edef\gth@tmp@ix@return{\gth@ix@return}%
        \gth@memo@iy{\gth@tempcnta}{\gth@tempcntb}%
        \edef\gth@tmp@iy@return{\gth@iy@return}%
        \gth@memo@m{\gth@tempcnta}{\gth@tempcntb}%
      \advance\gth@tempcnta\@ne
      \gth@advance{\gth@m@return}{-\gth@d}%
      \gth@advance{\gth@tmp@ix@return}{-\gth@e}%
      \gth@advance{\gth@tmp@iy@return}{-\gth@d}%
      \gth@max{\gth@m@return,\gth@tmp@ix@return,\gth@tmp@iy@return}%
      \gth@name@xdef{\gth@sn @ix@\the\gth@tempcnta
                     @\the\gth@tempcntb}{%
        \the\gth@calc}%
      \xdef\gth@ix@return{\the\gth@calc}
    \else
      \xdef\gth@ix@return{%
        \gth@nameuse{\gth@sn @ix@\the\gth@tempcnta @\the\gth@tempcntb}}
    \fi
  \egroup}
\def\gth@memo@iy#1#2{%
  \bgroup
    \gth@tempcnta#1\gth@tempcntb#2\relax
    \expandafter\expandafter\expandafter
    \ifx\gth@nameuse{\gth@sn @iy@\the\gth@tempcnta
                  @\the\gth@tempcntb}\relax
      \advance\gth@tempcntb\m@ne
        \gth@memo@iy{\gth@tempcnta}{\gth@tempcntb}%
        \edef\gth@tmp@iy@return{\gth@iy@return}%
        \gth@memo@m{\gth@tempcnta}{\gth@tempcntb}%
      \advance\gth@tempcntb\@ne
      \gth@advance{\gth@m@return}{-\gth@d}%
      \gth@advance{\gth@tmp@iy@return}{-\gth@e}%
      \gth@max{\gth@m@return,\gth@tmp@iy@return}%
      \gth@name@xdef{\gth@sn @iy@\the\gth@tempcnta
                     @\the\gth@tempcntb}{%
        \the\gth@calc}%
      \xdef\gth@iy@return{\the\gth@calc}%
    \else
      \xdef\gth@iy@return{%
        \gth@nameuse{\gth@sn @iy@\the\gth@tempcnta @\the\gth@tempcntb}}
    \fi
  \egroup}
\def\gth@memo@m#1#2{%
  \bgroup
    \gth@tempcnta#1\gth@tempcntb#2\relax
    \expandafter\expandafter\expandafter
    \ifx\gth@nameuse{\gth@sn @m@\the\gth@tempcnta
                  @\the\gth@tempcntb}\relax
      \advance\gth@tempcnta\m@ne\advance\gth@tempcntb\m@ne
        \gth@memo@ix{\gth@tempcnta}{\gth@tempcntb}%
        \edef\gth@tmp@ix@return{\gth@ix@return}%
        \gth@memo@iy{\gth@tempcnta}{\gth@tempcntb}%
        \edef\gth@tmp@iy@return{\gth@iy@return}%
        \gth@memo@m{\gth@tempcnta}{\gth@tempcntb}%
        \edef\gth@tmpa{\gth@nameuse{seqa@\the\gth@tempcnta}}%
        \edef\gth@tmpb{\gth@nameuse{seqb@\the\gth@tempcntb}}%
      \advance\gth@tempcnta\@ne\advance\gth@tempcntb\@ne
      \gth@max{\gth@m@return,\gth@tmp@ix@return,\gth@tmp@iy@return}%
      \ifx\gth@tmpa\gth@tmpb
        \advance\gth@calc\gth@match
      \else
        \advance\gth@calc\gth@mismatch
      \fi
      \gth@name@xdef{\gth@sn @m@\the\gth@tempcnta
                     @\the\gth@tempcntb}{%
        \the\gth@calc}%
      \xdef\gth@m@return{\the\gth@calc}%
    \else
      \xdef\gth@m@return{%
        \gth@nameuse{\gth@sn @m@\the\gth@tempcnta @\the\gth@tempcntb}}%
    \fi
  \egroup}
\newcommand{\GotohConfig}[1]{\setkeys[gth]{config}{#1}}
\endinput
%%
%% End of file `gotoh.sty'.
