% knitting.tex
%
% Provides commands useful for writing knitting patterns in plain TeX
%
% author: Ariel Barton
%
% Copyright Ariel Barton, 2010
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
% version 1.3 of this license or (at your option) any
% later version.
% The latest version of the license is in
%    http://www.latex-project.org/lppl.txt
% and version 1.3 or later is part of all distributions of
% LaTeX version 2003/06/01 or later.
%
% This work has the LPPL maintenance status "author-maintained".
%
% The complete list of files considered part of this work is in
% the file `knitting-doc.pdf' and its source code `knitting-doc.tex'.
%
% Version: 3

% Date: 2019/04/03

%\pdfmapfile{+knitfont.map}

\ifnum\catcode`\@=\catcode`A \else
  \chardef\catcountknit=\catcode`@
  \catcode`@=11
\fi

%
% Boolean variables
%

\newif \ifchartsonly \chartsonlyfalse
\newif \ifgrid
\newif \ifknitsymbol
\newif \ifresetrn \resetrntrue
\newif \ifleftrn@knit
\newif \ifshowrn@knit \showrn@knittrue
\newif \ifpdf@knit
\newif \ifcountingout@knit
\newif \ifCountStsThisRow@knit \CountStsThisRow@knittrue
\pdf@knittrue
\ifx \pdfoutput \undefined \pdf@knitfalse \fi
\ifx \pdfoutput \relax     \pdf@knitfalse \fi

%
% Color commands
%

% This defines pdfTeX-friendly or dvips-friendly color.
% Change them to use your driver's syntax if you insist on
% not using pdfTeX.

% For black lines, just say \let \knitlinecolor \relax
% If grayscale really just isn't working at all,
% go down and redefine \changeknitsize
\ifpdf@knit
    \ifnum \pdftexversion < 140
    \def\forecolor {\pdfliteral {0 g 0 G}\aftergroup\makenormalcolorknit}
    \def\purlgray {\pdfliteral {0.65 g 0.65 G}\aftergroup\makenormalcolorknit}
    \def\gridcolor {\pdfliteral {0.3 g 0.3 G}\aftergroup\makenormalcolorknit}
    \def\knitlinecolor {\pdfliteral {0.7 0 0 rg 0.7 0 0 RG}\aftergroup\makenormalcolorknit}
    \def\rncolor{\pdfliteral {0.55 0 0 rg 0.55 0 0 RG}\aftergroup\makenormalcolorknit}
    \def\rnarrowcolor{\pdfliteral {0.35 0 0 rg 0.35 0 0 RG}\aftergroup\makenormalcolorknit}
    \def\makenormalcolorknit{\ifcase \passnum@knit \pdfliteral {0.65 g 0.65 G}\or \pdfliteral {0.3 g 0.3 G}\else \pdfliteral {0 g 0 G}\fi}
    \else
    \def\forecolor {\pdfcolorstack 0 push {0 g 0 G}\aftergroup\makenormalcolorknit}
    \def\purlgray {\pdfcolorstack 0 push {0.65 g 0.65 G}\aftergroup\makenormalcolorknit}
    \def\gridcolor {\pdfcolorstack 0 push {0.3 g 0.3 G}\aftergroup\makenormalcolorknit}
    \def\knitlinecolor {\pdfcolorstack 0 push {0.7 0 0 rg 0.7 0 0 RG}\aftergroup\makenormalcolorknit}
    \def\rncolor{\pdfcolorstack 0 push {0.55 0 0 rg 0.55 0 0 RG}\aftergroup\makenormalcolorknit}
    \def\rnarrowcolor{\pdfcolorstack 0 push {0.35 0 0 rg 0.35 0 0 RG}\aftergroup\makenormalcolorknit}
    \def\makenormalcolorknit{\pdfcolorstack 0 pop}
    \fi
\else
    \def\forecolor {\special{color push gray 0}\aftergroup\makenormalcolorknit}
    \def\purlgray {\special{color push gray 0.65}\aftergroup\makenormalcolorknit}
    \def\gridcolor {\special{color push gray 0.3}\aftergroup\makenormalcolorknit}
    \def\knitlinecolor {\special{color push rgb 0.7 0 0}\aftergroup\makenormalcolorknit}
    \def\rncolor{\special{color push rgb 0.55 0 0}\aftergroup\makenormalcolorknit}
    \def\rnarrowcolor{\special{color push rgb 0.35 0 0}\aftergroup\makenormalcolorknit}
    \def\makenormalcolorknit{\special{color pop}}
\fi
\def\knitoverlinecolor{\knitlinecolor}

%
% Plain TeX-only material (change knit size)
%

\def \changeknitsize#1{\fontsize@knit = #1
    \font\knitsf = cmss10 at \fontsize@knit
    \font\knitrm = cmr10 at \fontsize@knit
    \font\knitsfsmall@knit = cmss8 at 0.8\fontsize@knit
    \font\cablesf@knit = cmss8 at 0.8\fontsize@knit
    \font\cablesfsmall@knit = ecss0600 at 0.6\fontsize@knit
    % I would use cmss as the sans serif font here,
    % but cmss6 doesn't exist.
    %
    \font\gff@knit = knitgn at \fontsize@knit
    \font\wff@knit = knitwn at \fontsize@knit
    \font\nff@knit = knitnn at \fontsize@knit
    \font\mff@knit = knitmn at \fontsize@knit
    %
    \font\ggf@knit = knitgg at \fontsize@knit
    \font\wgf@knit = knitwg at \fontsize@knit
    \font\mgf@knit = knitmg at \fontsize@knit
    %
    \font\gpf@knit = knitgp at \fontsize@knit
    \font\wpf@knit = knitwp at \fontsize@knit
    \font\npf@knit = knitnp at \fontsize@knit
    \font\mpf@knit = knitmp at \fontsize@knit
    %
    \font\raisen@knit = knitnr at \fontsize@knit
    \font\lowern@knit = knitnl at \fontsize@knit
    \font\raisem@knit = knitmr at \fontsize@knit
    \font\lowerm@knit = knitml at \fontsize@knit
    \let \raiseg@knit \raisem@knit
    \let \raisew@knit \raisem@knit
    \let \lowerg@knit \lowerm@knit
    \let \lowerw@knit \lowerm@knit
    %
    \font \nstsout@knit = knitn_sc_out at \fontsize@knit
    \font  \nstsin@knit = knitn_sc_in  at \fontsize@knit
    \font \gstsout@knit = knitg_sc_out at \fontsize@knit
    \font  \gstsin@knit = knitg_sc_in  at \fontsize@knit
    \let \wstsout@knit \gstsout@knit
    \let  \wstsin@knit \gstsin@knit
    \let \mstsout@knit \nstsout@knit
    \let  \mstsin@knit \nstsin@knit
     %
    %%% Use the following if you can't get the grays to work.
    %%% In this case, don't use \Purl or \purlbox.
    % \let \gridpf@knit \nullfont
    % \let \widepf@knit \nullfont
    % \let \nogridpf@knit \nullfont
    % \let \purlgray \relax
}
\let \ngf@knit \nullfont


%
% Dimensions
%

\newdimen \leftgap@knit
\newdimen \bgshift@knit
\newdimen \chartwidth@knit
\newdimen \stitchcountwidth@knit
\newdimen \rnleftwd@knit
\newdimen \rnrightwd@knit
\newdimen \fontsize@knit

\newbox\bgbox@knit
\newbox\fgbox@knit
\newbox\ggbox@knit

\newcount \rownumber
\newcount \tempcount@knit
\newcount \rownumberskip \rownumberskip = 1
\newcount \stitchcountin
\newcount \stitchcountinprev
\newcount \stitchcountout
\newcount \shortrowstsin@knit
\newcount \shortrowstsout@knit

\def \passnum@knit{2}
\def \stitchwd{\fontdimen6\ff@knit}
\def \stitchwd@count@knit{\fontdimen6\stsout@knit}
\def \stitchht{\fontdimen5\ff@knit}
\def \stitchdp{\fontdimen8\ff@knit}
% fontdimen9 is the LaTeX stitch height
\def \gridwidth{\fontdimen10\ff@knit}
\def \knitlinewd{\fontdimen11\ff@knit}
\def \narrowincraise@knit{\fontdimen12\the\font}
\def \fontvoffset@knit{\fontdimen13\the\font}
\def \purlextend@knit{\fontdimen14\ff@knit}
\def \rownumberwd{\fontdimen6\ff@knit}
% The rest of them aren't \the\font because I want them to still work outside of a chart

%
% Fonts
%

\def \ff@knit{\csname \series@knit ff@knit\endcsname}
\def \gf@knit{\csname \series@knit gf@knit\endcsname}
\def \pf@knit{\csname \series@knit pf@knit\endcsname}
\def \raiseff@knit{\csname raise\series@knit @knit\endcsname}
\def \lowerff@knit{\csname lower\series@knit @knit\endcsname}
\def \stsout@knit{\csname \series@knit stsout@knit\endcsname}
\def \stsin@knit{\csname \series@knit stsin@knit\endcsname}

\def \knitnogrid{\gridfalse\knitsymboltrue \def\series@knit{n}}
\def \knitgrid{\gridtrue   \knitsymbolfalse\def\series@knit{g}}
\def \knitwide{\gridtrue   \knitsymbolfalse\def\series@knit{w}}
\def \knitmixed{\gridtrue  \knitsymboltrue \def\series@knit{m}}

\changeknitsize{10pt}

\knitgrid

%
% Single-pass commands
%

\def \purlpass{\futurelet\next@knit\purlpass@@knit}
\def \gridpass{\futurelet\next@knit\gridpass@@knit}
\def \mainpass{\futurelet\next@knit\mainpass@@knit}
\def \countpass{\futurelet\next@knit\mainpass@@knit}
\def \purlpass@@knit{\ifx\next@knit[\def\nextstep@knit{\purlpass@knit}\else\def\nextstep@knit{\purlpass@knit[]}\fi\nextstep@knit}
\def \gridpass@@knit{\ifx\next@knit[\def\nextstep@knit{\gridpass@knit}\else\def\nextstep@knit{\gridpass@knit[]}\fi\nextstep@knit}
\def \mainpass@@knit{\ifx\next@knit[\def\nextstep@knit{\mainpass@knit}\else\def\nextstep@knit{\mainpass@knit[]}\fi\nextstep@knit}
\def \countpass@@knit{\ifx\next@knit[\def\nextstep@knit{\countpass@knit}\else\def\nextstep@knit{\countpass@knit[]}\fi\nextstep@knit}
\def \purlpass@knit[#1]#2{\ifnum\passnum@knit = 0 \def\nextstep@@knit{#2}\else \def\nextstep@@knit{#1}\fi\nextstep@@knit}
\def \purlpass@knit[#1]#2{\ifnum\passnum@knit = 0 #2\else #1\fi}
\def \gridpass@knit[#1]#2{\ifnum\passnum@knit = 1 #2\else #1\fi}
\def \mainpass@knit[#1]#2{\ifnum\passnum@knit = 2 #2\else #1\fi}
\def \countpass@knit[#1]#2{\ifnum\passnum@knit = 3 #2\else #1\fi}

%
% Text knit
%

\def \textknit#1{\leavevmode\hbox{\let\|\bar@knit\let\!\barthin@knit
    \ff@knit \forecolor
    \rlap{\pf@knit \purlgray \def\passnum@knit{0}#1}%
    \ifgrid\rlap{\gf@knit \gridcolor \def\passnum@knit{1}#1}\fi
    \def\passnum@knit{2}#1}}

\def \do@endofpar@knit#1{\def\par{#1\endgraf\let\par\endgraf}}

%
% Special symbols
%

\def\narrowincreasestartnumber{1}
\def\narrowdecreaseendnumber{1}

\def  \narrowdecrease#1{\genbobble@knit{#1}{1}{-\narrowincraise@knit}\adjuststitchcount[#1]{\narrowdecreaseendnumber}\adjuststitchcount[-1]{-1}}
\def \pnarrowdecrease#1{\genbobble@knit{#1}{2}{-\narrowincraise@knit}\adjuststitchcount[#1]{\narrowdecreaseendnumber}\adjuststitchcount[-1]{-1}}
\def  \narrowincrease#1{\genbobble@knit{#1}{3}{\narrowincraise@knit}\adjuststitchcount[\narrowincreasestartnumber]{#1}\adjuststitchcount[-1]{-1}}
\def \pnarrowincrease#1{\genbobble@knit{#1}{4}{\narrowincraise@knit}\adjuststitchcount[\narrowincreasestartnumber]{#1}\adjuststitchcount[-1]{-1}}
\def \bobble#1{\genbobble@knit{#1}{0}{0pt}}

\def \genbobble@knit#1#2#3{\char#2 \ifnum \passnum@knit = 2
    \llap{\vbox to\stitchht{\vss \vskip\stitchdp \vskip\fontvoffset@knit \hbox to \stitchwd{\hfil\knitsfsmall@knit #1\hfil}\vskip #3\vss}}\fi}

\def \wideincrease#1{\strut@knit
    \ifnum\passnum@knit = 3 \narrowincrease{#1}\else
    \hbox to #1\stitchwd{\char25
        \hskip-0.1pt\leaders\hbox{\char22}\hfil\hskip-0.1pt
        \char29
        \hskip-0.1pt\leaders\hbox{\char22}\hfil\hskip-0.1pt
        \char26}\fi}
\def \widedecrease#1{\strut@knit
    \ifnum #1 = 5 \char31 \else
    \ifnum\passnum@knit = 3 \narrowdecrease{#1}\else
    \hbox to #1\stitchwd{\char27
        \hskip-0.1pt\leaders\hbox{\char22}\hfil\hskip-0.1pt
        \char30
        \hskip-0.1pt\leaders\hbox{\char22}\hfil\hskip-0.1pt
        \char28}\fi\fi}

% Standard chart commands

% \obeylines is normally defined with \let^^M\par, not \def^^M{\par};
% doing it this way makes it cooperate with \do@endofpar.

{\catcode`\^^M = \active \catcode`\| = \active
\global\def\commands@knit{%
    \let\[\pnarrowincrease
    \let\]\pnarrowdecrease
    \let\<\narrowincrease
    \let\>\narrowdecrease
    \let\@\bobble
    \let \! \barthin@knit
    \let \| \bar@knit
    \let |  \bar@knit
    \let \_ \horizlinenarrow@knit
    \let \= \horizlinewide@knit
    \let \- \horizline@knit
    \let\overline\overline@knit
    \let\underline\underline@knit
    \let\rn\rn@knit
    \let\rnbox\rnbox@knit
    \let\rnboxleft\rnboxleft@knit
    \let\rnboxright\rnboxright@knit
    \let\rnleft\rnleft@knit
    \let\rnright\rnright@knit
    \let\nonumber\relax
    \let\par\endgraf %Just in case someone's redefined it
    \leftgap@knit=0pt
    \def~{\ifnum\passnum@knit=3 \else \ifvmode \advance \leftgap@knit by \stitchwd
        \else \kern \stitchwd \fi \fi}%
    \def^^M{\par}%
    \def\\{\par}%
    }%
}

\def \strut@knit{\vrule width 0pt height \stitchht depth \stitchdp}

% Drawing lines on the chart

\def \horizlinenarrow@knit{\ifnum\passnum@knit<3 \ifvmode\nonumber\leavevmode\fi \dimen0 =   \stitchwd \advance \dimen0 \knitlinewd
    \ifnum\passnum@knit = 2
    \hskip -0.5\knitlinewd\smash{{\knitoverlinecolor \vrule width \dimen0 height 0.5\knitlinewd depth 0.5\knitlinewd}}\hskip -0.5\knitlinewd
    \else\hskip \stitchwd \fi\fi}
\def \horizlinewide@knit#1{\ifnum\passnum@knit<3 \ifvmode\nonumber\leavevmode\fi \dimen0 = #1\stitchwd \advance \dimen0 \knitlinewd
    \ifnum\passnum@knit = 2
                         \smash{{\knitoverlinecolor \vrule width \dimen0 height 0.5\knitlinewd depth 0.5\knitlinewd}}
    \else\hskip \dimen0 \fi\fi}

\def \horizline@knit{\futurelet\next@knit\horizline@@knit}
\def \horizline@@knit{\ifx\next@knit*%
    \def\nextstep@knit{\horizlinestar@knit}\else
    \def\nextstep@knit{\horizlinenostar@knit}\fi\nextstep@knit}

\def \horizlinestar@knit#1{\nonumber\nostitchcount\overlinestar@knit{\hskip#1\stitchwd}}
\def \horizlinenostar@knit#1{\nonumber\nostitchcount\overlinenostar@knit{\hskip#1\stitchwd}}

\def \bar@knit{\ifnum\passnum@knit < 3 \leavevmode
    \ifgrid
        \ifnum \passnum@knit = 0
        \hbox{{\knitlinecolor \vrule width \knitlinewd depth \stitchdp height \stitchht}}%
        \else
        \kern \knitlinewd
        \fi
    \else
        \ifnum \passnum@knit = 2
        \hbox{\knitlinecolor \vrule width \knitlinewd depth \stitchdp height \stitchht}%
        \else
        \kern \knitlinewd
        \fi
    \fi\fi}

\def \barthintop@knit{0pt}
\def \barthinbot@knit{0pt}

\def \barthin@knit{\leavevmode\strut@knit
    \ifnum \passnum@knit = 2
    \dimen2 = \stitchht \advance \dimen2 \barthintop@knit
    \dimen3 = \stitchdp \advance \dimen3 \barthinbot@knit
    \smash{\hbox to 0pt{\hss \knitlinecolor \vrule width \knitlinewd depth \dimen3 height \dimen2\hss}}%
    \fi}

\def \overline@knit{\futurelet\next@knit\overline@@knit}
\def \overline@@knit{\ifx\next@knit*%
    \def\nextstep@knit{\overlinestar@knit}\else
    \def\nextstep@knit{\overlinenostar@knit}\fi\nextstep@knit}

\def \overlinenostar@knit#1{\leavevmode{\def\barthintop@knit{\knitlinewd}%
    \setbox0 = \hbox{#1}%
    \ifgrid
    \ifnum \passnum@knit = 0
        \dimen1=\wd0 \advance\dimen1 by \gridwidth
        {\rlap{\raise\ht0\hbox{\hskip -0.5\gridwidth\knitoverlinecolor \vrule width \dimen1 height \knitlinewd depth 0pt}}}%
    \else
        \raise\ht0\hbox{\vrule width 0pt height \knitlinewd depth 0pt}%
    \fi
    \else
    \ifnum \passnum@knit = 2
        \dimen1=\wd0 \advance\dimen1 by \gridwidth
        {\rlap{\raise\ht0\hbox{\hskip -0.5\gridwidth\knitoverlinecolor \vrule width \dimen1 height \knitlinewd depth 0pt}}}%
    \else
        \dimen0=\ht0 \advance \dimen0 \knitlinewd
        \vrule width 0pt height \dimen0 depth 0pt
    \fi \fi
    #1}}

\def \overlinestar@knit#1#2{\leavevmode{\def\barthintop@knit{0.5\knitlinewd}% The #1 is to eat the *
    \setbox0 = \hbox{#2}%
    \ifnum \passnum@knit = 2
        \dimen1=\wd0 \advance\dimen1 by \gridwidth
        \smash{\rlap{\raise\ht0\hbox{\hskip -0.5\gridwidth\knitoverlinecolor \vrule width \dimen1 height 0.5\knitlinewd depth 0.5\knitlinewd}}}%
    \fi
    #2}}

\def \underline@knit{\futurelet\next@knit\underline@@knit}
\def \underline@@knit{\ifx\next@knit*%
    \def\nextstep@knit{\underlinestar@knit}\else
    \def\nextstep@knit{\underlinenostar@knit}\fi\nextstep@knit}

\def \underlinenostar@knit#1{\leavevmode{\def\barthinbot@knit{\knitlinewd}%
    \setbox0 = \hbox{#1}%
    \ifgrid
    \ifnum \passnum@knit = 0
        \dimen1=\wd0 \advance\dimen1 by \gridwidth
        \rlap{\raise-\dp0\hbox{\hskip -0.5\gridwidth\knitoverlinecolor \vrule width \dimen1 height 0pt depth \knitlinewd \hskip -0.5\gridwidth}}%
    \else
        \rlap{\raise-\dp0\hbox{\vrule width 0pt height 0pt depth \knitlinewd}}%
    \fi
    \else
    \ifnum \passnum@knit = 2
        \dimen1=\wd0 \advance\dimen1 by \gridwidth
        \rlap{\raise-\dp0\hbox{\hskip -0.5\gridwidth\knitoverlinecolor \vrule width \dimen1 height 0pt depth \knitlinewd \hskip -0.5\gridwidth}}%
    \else
        \rlap{\raise-\dp0\hbox{\vrule width 0pt height 0pt depth \knitlinewd}}%
    \fi \fi
    #1}}

\def \underlinestar@knit#1#2{\leavevmode{\def\barthinbot@knit{0.5\knitlinewd}%
    \setbox0 = \hbox{#2}%
    \ifnum \passnum@knit = 2
        \dimen1=\wd0 \advance\dimen1 by \gridwidth
        \smash{\rlap{\raise-\dp0\hbox{\hskip -0.5\gridwidth\knitoverlinecolor \vrule width \dimen1 height 0.5\knitlinewd depth 0.5\knitlinewd \hskip -0.5\gridwidth}}}%
    \fi
    #2}}

% Fancy cabling

% \ifnum \passnum@knit = 3 \leavevmode \fi causes problems
% due to the weird things we do automatically at the start of a paragraph
\def\doifcounting@knit#1{}

\def\cablebackground#1{\doifcounting@knit{\leavevmode}%
	\ifnum \passnum@knit = 0 \leavevmode \hbox to \stitchwd{#1\hss {\raiseff@knit \def\passnum@knit{2}\forecolor#1}}\else \char255 \fi}
\def\cableforeground#1{\doifcounting@knit{\leavevmode}%
	\ifnum \passnum@knit = 0 \leavevmode \hbox to \stitchwd{#1\hss {\lowerff@knit \def\passnum@knit{2}\forecolor#1}}\else \char254 \fi}
	
\def\orphancablewarning@knit{\message{Package knit warning: Orphaned half cable on input line \the\inputlineno.}}

\def \cableleft#1#2{\leavevmode{\ifgrid\knitmixed\fi
    \ifcase\passnum@knit
    \hbox{\pf@knit #1#2}%
    \or
    \setbox0=\hbox{\pf@knit #1#2}%
    \hbox to \wd0{\char6\leaders\hbox{\char5}\hfil\char6}%
    \or
    \hbox{\let\knitsf \cablesf@knit \let \knitsfsmall@knit \cablesfsmall@knit %
    	\setbox1=\hbox{#1}%
    	\setbox2=\hbox{#2}%
      	\ifdim \wd1 = 0pt \orphancablewarning@knit \fi
    	\ifdim \wd2 = 0pt \orphancablewarning@knit \fi
    	{\lowerff@knit \rlap{#1}\hbox to \wd1{\leaders\hbox to \stitchwd{\hfil\char15}\hfil\ifdim\wd1>0pt \hskip\stitchwd\char10\fi}%
    	\ifdim\wd1>0pt \ifdim \wd2>0pt \char13\fi \fi }%
    	{\raiseff@knit \rlap{#2}\hbox to \wd2{\ifdim\wd2>0pt \char12\hskip\stitchwd\fi\leaders\hbox to \stitchwd{\char8\hfil}\hfil}}}%
    \else
    #1#2\fi}}
\def \cableright#1#2{\leavevmode{\ifgrid\knitmixed\fi
    \ifcase\passnum@knit
    \hbox{\pf@knit #1#2}%
    \or
    \setbox0=\hbox{\pf@knit #1#2}%
    \hbox to \wd0{\char6\leaders\hbox{\char5}\hfil\char6}%
    \or
    \hbox{\let\knitsf \cablesf@knit \let \knitsfsmall@knit \cablesfsmall@knit %
    	\setbox1=\hbox{#1}%
    	\setbox2=\hbox{#2}%
     	\ifdim \wd1 = 0pt \orphancablewarning@knit \fi
    	\ifdim \wd2 = 0pt \orphancablewarning@knit \fi
	   	{\raiseff@knit \rlap{#1}\hbox to \wd1{\leaders\hbox to \stitchwd{\hfil\char16}\hfil\ifdim\wd1>0pt \hskip\stitchwd\char9\fi}%
    	\ifdim\wd1>0pt \ifdim \wd2>0pt \char14\fi \fi }%
    	{\lowerff@knit \rlap{#2}\hbox to \wd2{\ifdim\wd2>0pt \char11\hskip\stitchwd \fi\leaders\hbox to \stitchwd{\char7\hfil}\hfil}}}%
    \else
    #1#2\fi}}

% Knit, purl, knitboxes

\def \knit#1{\strut@knit\hbox to #1\stitchwd{\leaders\hbox{-}\hfil}}
\def \purl#1{\strut@knit\hbox to #1\stitchwd{\leaders\hbox{=}\hfil}}

\def \knitboxbackground{}
\def \purlboxbackground{\purlgray }
\def \purlboxforeground{}
\def \knitboxforeground{}

\def \Knit{\futurelet\next@knit\Knit@knit}
\def \Knit@knit{\ifx\next@knit[%
    \def\nextstep@knit{\Knit@@knit}\else
    \def\nextstep@knit{\Knit@@knit[0]}\fi\nextstep@knit}
\def \Knit@@knit[#1]#2#3{\strut@knit
    \setbox0 = \hbox{\knitsf #2}%
    \ifcase \passnum@knit
        \ifx \empty \knitboxbackground
        \vrule width #3\stitchwd height 0pt depth 0pt
        \else
        {\knitboxbackground \purlbackground{\vrule width #3\stitchwd depth \stitchdp height \stitchht}}\fi
    \or
    \ifknitsymbol
    	\hbox to #3\stitchwd{\char6\leaders\hbox{\char5}\hfil\char6}%
    \else
		\hbox{\hbox to #3\stitchwd{%
			\leaders \hbox to \stitchwd{\char6\hfil\char6}\hfil
			\hskip \wd0
			\leaders \hbox to \stitchwd{\char6\hfil\char6}\hfil}%
		\hskip -#3\stitchwd
		\hbox to #3\stitchwd{\char6\leaders\hbox{\char5}\hfil\char6}}%
    \fi
    \or
    \hbox to #3\stitchwd{%
        {\knitboxforeground\leaders\hbox{-}%
        \ifnum #1>0 \hskip #1\stitchwd plus 1fil minus #1\stitchwd \else\hfil\fi
        }%
        \lower\stitchdp\vbox to\stitchht{\vss\vskip\fontvoffset@knit\hbox{\knitsf #2}\vss\vskip\stitchdp}
        {\knitboxforeground \count255 = -#1 \leaders\hbox{-}%
        \ifnum #1<0  \hskip \count255\stitchwd plus 1fil minus \count255\stitchwd \else\hfil\fi
        }}%
    \or
    \hbox to \Knitstitchcount{#2}{#3}\stitchwd{\hfil}
    \fi}
\def \Purl{\futurelet\next@knit\Purl@knit}
\def \Purl@knit{\ifx\next@knit[%
    \def\nextstep@knit{\Purl@@knit}\else
    \def\nextstep@knit{\Purl@@knit[0]}\fi\nextstep@knit}
\def \Purl@@knit[#1]#2#3{\strut@knit
    \setbox0 = \hbox{\knitsf #2}%
    \ifcase \passnum@knit
        \ifx \empty \purlboxbackground
        \vrule width #3\stitchwd height 0pt depth 0pt
        \else
        {\purlboxbackground \purlbackground{\vrule width #3\stitchwd depth \stitchdp height \stitchht}}\fi
    \or
    \ifknitsymbol
    	\hbox to #3\stitchwd{\char6\leaders\hbox{\char5}\hfil\char6}%    
    \else
		\hbox{\hbox to #3\stitchwd{%
			\leaders \hbox to \stitchwd{\char6\hfil\char6}\hfil
			\hskip \wd0
			\leaders \hbox to \stitchwd{\char6\hfil\char6}\hfil}%
		\hskip -#3\stitchwd
		\hbox to #3\stitchwd{\char6\leaders\hbox{\char5}\hfil\char6}}%
    \fi
    \or
    \hbox to #3\stitchwd{%
        {\purlboxforeground\leaders\hbox{=}%
        \ifnum #1>0 \hskip #1\stitchwd plus 1fil minus #1\stitchwd \else\hfil\fi
        }%
        \lower\stitchdp\vbox to\stitchht{\vss\vskip\fontvoffset@knit\hbox{\knitsf #2}\vss\vskip\stitchdp}
        {\purlboxforeground \count255 = -#1 \leaders\hbox{=}%
        \ifnum #1<0  \hskip \count255\stitchwd plus 1fil minus \count255\stitchwd \else\hfil\fi
        }}%
    \or
    \hbox to \Purlstitchcount{#2}{#3}\stitchwd{\hfil}
    \fi}

\def \Knitstitchcount#1#2{#2}
\def \Purlstitchcount#1#2{#2}
\def \knitboxstitchcount#1#2{#2}
\def \purlboxstitchcount#1#2{#2}

\def \knitbox{\futurelet\next@knit\knitbox@knit}
\def \knitbox@knit{\ifx\next@knit[%
    \def\nextstep@knit{\knitbox@@knit}\else
    \def\nextstep@knit{\knitbox@@knit[0]}\fi\nextstep@knit}
\def \knitbox@@knit[#1]#2#3{\strut@knit
    \ifcase \passnum@knit
        \ifx \empty \knitboxbackground
        \vrule width #3\stitchwd height 0pt depth 0pt
        \else
        {\knitboxbackground \purlbackground{\vrule width #3\stitchwd depth \stitchdp height \stitchht}}\fi
    \or
    \hbox to #3\stitchwd{\char6\leaders\hbox{\char5}\hfil\char6}%
    \or
        \lower\stitchdp\vbox to\stitchht{%
        \vss\vskip\fontvoffset@knit
        \hbox to #3\stitchwd{\ifnum #1>0 \hskip #1\stitchwd plus 1fil minus #1\stitchwd \else\hfil\fi
        {\knitsf #2}%
        \count255 = -#1 \ifnum #1<0  \hskip \count255\stitchwd plus 1fil minus \count255\stitchwd \else\hfil\fi}%
        \vss\vskip\stitchdp}%
    \or
    \hbox to \knitboxstitchcount{#2}{#3}\stitchwd{\hfil}
    \fi}
\def \purlbox{\futurelet\next@knit\purlbox@knit}
\def \purlbox@knit{\ifx\next@knit[%
    \def\nextstep@knit{\purlbox@@knit}\else
    \def\nextstep@knit{\purlbox@@knit[0]}\fi\nextstep@knit}
\def \purlbox@@knit[#1]#2#3{\strut@knit
    \ifcase \passnum@knit
        \ifx \empty \purlboxbackground
        \vrule width #3\stitchwd height 0pt depth 0pt
        \else
        {\purlboxbackground \purlbackground{\vrule width #3\stitchwd depth \stitchdp height \stitchht}}\fi
    \or
    \hbox to #3\stitchwd{\char6\leaders\hbox{\char5}\hfil\char6}%
    \or
        \lower\stitchdp\vbox to\stitchht{%
        \vss\vskip\fontvoffset@knit
        \hbox to #3\stitchwd{\ifnum #1>0 \hskip #1\stitchwd plus 1fil minus #1\stitchwd \else\hfil\fi
        {\knitsf #2}%
        \count255 = -#1 \ifnum #1<0  \hskip \count255\stitchwd plus 1fil minus \count255\stitchwd \else\hfil\fi}%
        \vss\vskip\stitchdp}%
    \or
    \hbox to \purlboxstitchcount{#2}{#3}\stitchwd{\hfil}%
    \fi}

\def \purlbackground#1{%
	\ifnum\passnum@knit=0
		\setbox0=\hbox{#1}%
    	\dimen0 = \wd0 \advance\dimen0 2\purlextend@knit
    	\dimen1 = \stitchht \advance\dimen1 \purlextend@knit
    	\dimen2 = \stitchdp \advance\dimen2 \purlextend@knit
        \vrule width 0pt height \ht0 depth \dp0
        \smash{\vrule width \dimen0 height \dimen1 depth \dimen2}%
        \kern-\purlextend@knit
    \else#1\fi}

\def \widesymbol{\futurelet\next@knit\widesymbol@knit}
\def \widesymbol@knit{\ifx\next@knit[%
    \def\nextstep@knit{\widesymbol@@knit}\else
    \def\nextstep@knit{\widesymbol@@knit[0]}\fi\nextstep@knit}
\def \widesymbol@@knit[#1]#2#3{\strut@knit
	\ifcase \passnum@knit 
	\knitbox{}{#3}\or
	\knitbox{}{#3}\or
	\hbox to #3\stitchwd{\ifnum #1>0 \hskip #1\stitchwd plus 1fil minus #1\stitchwd \else\hfil\fi
        #2%
        \count255 = -#1 \ifnum #1<0  \hskip \count255\stitchwd plus 1fil minus \count255\stitchwd \else\hfil\fi}\else
    \widesymbolspacer{#2}{#3}\relax\fi}
    
\def\widesymbolspacer#1#2{#1}

    
% Row number commands

\def \numberrow#1#2#3{\ifnum\passnum@knit=3 \ifvmode\vskip\stitchht\fi\else
    \ifvmode\nonumber\leavevmode\fi
    \strut@knit
    \count255=#1
    \hbox to \stitchwd{\hss\ifnum \passnum@knit = 2 \rncolor \knitrm#1\fi\hss}%
    \ifnum #1 > #3
        \advance\count255 -1
        \loop \ifnum \count255>#3
        \tempcount@knit = \count255
        \divide\tempcount@knit #2
        \multiply \tempcount@knit #2
        \ifnum\tempcount@knit = \count255
        \hbox to \stitchwd{\hss\ifnum \passnum@knit = 2 \rncolor \knitrm\the\count255 \fi \hss}%
        \else
        \kern\stitchwd
        \fi
        \advance\count255 -1
        \repeat
    \else
        \advance\count255 1
        \loop \ifnum \count255<#3
        \tempcount@knit = \count255
        \divide\tempcount@knit #2
        \multiply \tempcount@knit #2
        \ifnum\tempcount@knit = \count255
        \hbox to \stitchwd{\hss\ifnum \passnum@knit = 2 \rncolor \knitrm\the\count255 \fi \hss}%
        \else
        \kern\stitchwd
        \fi
        \advance\count255 1
        \repeat
    \fi
    \hbox to \stitchwd{\hss\ifnum \passnum@knit = 2 \rncolor \knitrm#3\fi \hss}%
    \fi}

\def \rnoddonly{\def\rncore@knit##1{\ifshowrn@knit \ifodd\rownumber \csname print##1rownumber\endcsname{\therownumber}\fi\fi}}
\def \rnevenonly{\def\rncore@knit##1{\ifshowrn@knit \ifodd\rownumber \else\csname print##1rownumber\endcsname{\therownumber}\fi\fi}}
\def \rnnormal{\def\rncore@knit##1{\ifshowrn@knit \csname print##1rownumber\endcsname{\therownumber}\fi}}

\def \rncore@knit#1{\ifshowrn@knit \csname print#1rownumber\endcsname{\therownumber}\fi}
\def \rnstep@knit{\ifshowrn@knit
	\ifnum \passnum@knit = 2 \global\advance\rownumber -\rownumberskip \relax\fi
	\ifnum \passnum@knit = 0 \global\advance\rownumber -\rownumberskip \relax\fi
	\else\global\showrn@knittrue\fi}

\def \printrownumber#1{{\rncolor \knitrm #1}}
\def \printrightrownumber#1{\knitleftarrowhead{\rncolor \knitrm #1}}
\def \printleftrownumber#1{{\rncolor \knitrm #1}\knitrightarrowhead}
\def \knitrightarrowhead{{\rnarrowcolor \char125}}
\def \knitleftarrowhead{{\rnarrowcolor \char123}}

\def \therownumber{\number\rownumber}

\def \rn@knit{\ifnum \passnum@knit < 3 \leavevmode
    \hbox to \rownumberwd{\hss\ifnum \passnum@knit = 2 \rncore@knit{}\fi\rnstep@knit\hss}\fi}
\def \rnleft@knit{\ifnum \passnum@knit < 3 \leavevmode
    \setbox0 = \hbox{\ifnum \passnum@knit = 2 \rncore@knit{left}\fi\rnstep@knit}
    \dimen0 = \wd0 %\advance \dimen0 -\rownumberwd
    \ifchartsonly\advance \dimen0 1pt\fi
    \ifdim \dimen0 > \rnleftwd@knit \global\rnleftwd@knit = \dimen0 \fi
    \hbox to 0pt{\hss\box0}\fi}
\def \rnright@knit{\ifnum \passnum@knit < 3 \leavevmode
    \setbox0 = \hbox{\ifnum \passnum@knit = 2 \rncore@knit{right}\fi\rnstep@knit}
    \dimen0 = \wd0 %\advance \dimen0 -\rownumberwd
    \ifchartsonly\advance \dimen0 1pt\fi
    \ifdim \dimen0 > \rnrightwd@knit \global\rnrightwd@knit = \dimen0 \fi
    \hbox to 0pt{\box0\hss}\fi}

\def \rnbox@knit#1{\ifnum \passnum@knit < 3 \leavevmode
    \hbox to \rownumberwd{\hss\ifnum \passnum@knit = 2 {\printrownumber{#1}}\fi\hss}\fi}
\def \rnboxleft@knit#1{\ifnum \passnum@knit < 3 \leavevmode
    \setbox0 = \hbox{\ifnum \passnum@knit = 2 {\printleftrownumber{#1}}\fi}
    \dimen0 = \wd0 %\advance \dimen0 -\rownumberwd
    \ifchartsonly\advance \dimen0 1pt\fi
    \ifdim \dimen0 > \rnleftwd@knit \global\rnleftwd@knit = \dimen0 \fi
    \hbox to 0pt{\hss\box0}\fi}
\def \rnboxright@knit#1{\ifnum \passnum@knit < 3 \leavevmode
    \setbox0 = \hbox{\ifnum \passnum@knit = 2 {\printrightrownumber{#1}}\fi}
    \dimen0 = \wd0 %\advance \dimen0 -\rownumberwd
    \ifchartsonly \advance \dimen0 1pt \fi
    \ifdim \dimen0 > \rnrightwd@knit \global\rnrightwd@knit = \dimen0 \fi
    \hbox to 0pt{\box0\hss}\fi}
    
% Title for the chart
\def\charttitle@knit{}
\def\titlechart#1{\def\charttitle@knit{#1}}

% The chart commands

\def \chart{\futurelet\next@knit\chart@@knit}
\def \chart@@knit{\ifx\next@knit[%
    \def\nextstep@knit{\smallpage@knit\obeylines \catcode`\|=\active \catcode`\# = 12 \chart@knit}\else
    \def\nextstep@knit{\smallpage@knit\obeylines \catcode`\|=\active \catcode`\# = 12 \chart@knit[]}\fi\nextstep@knit}

% Some special stuff for chartsonly mode
\let\extracommands@knit\relax
\def \smallpage@knit{\noindent\hbox\bgroup}
\let\endsmallpage@knit\egroup

% The chart command proper
\long\def\chart@knit[#1]#2{%
    \global \chartwidth@knit = 0pt
    \ifresetrn \rownumber = 0 \else \tempcount@knit = \rownumber \fi
    \setbox\bgbox@knit=\vbox{\def\passnum@knit{0}\hsize=\maxdimen
        \pf@knit
        \lineskip=0pt
        \parskip=0pt
        \baselineskip=0pt
        \parindent=0pt
        \emergencystretch = \stitchwd
        \leftskip=0pt
        \rightskip=0pt
        \parfillskip=0pt plus 1fil
        \ifresetrn\else\let\rnstep@knit\relax\fi
        \commands@knit\extracommands@knit
        \def\nonumber{\global\showrn@knitfalse}%
        \csname auto#1@knit\endcsname #2\par}%
    \ifresetrn \tempcount@knit = -\rownumber \fi
    \ifgrid
    \setbox\ggbox@knit=\vbox{\def\passnum@knit{1}\hsize=\maxdimen
        \gf@knit
        \lineskip=0pt
        \parskip=0pt
        \baselineskip=0pt
        \parindent=0pt
        \emergencystretch = \stitchwd
        \leftskip=0pt
        \rightskip=0pt
        \parfillskip=0pt plus 1fil
        \commands@knit\extracommands@knit
        \def\nonumber{\global\showrn@knitfalse}%
        \csname auto#1@knit\endcsname #2\par}%
    \fi
    \rownumber = \tempcount@knit %
    \global \rnleftwd@knit = 0pt
    \global \rnrightwd@knit = 0pt
    \setbox\fgbox@knit=\vbox{\def\passnum@knit{2}\hsize=\maxdimen
        \ff@knit
        \lineskip=0pt
        \parskip=0pt
        \baselineskip=0pt
        \parindent=0pt
        \emergencystretch = \stitchwd
        \leftskip=0pt
        \rightskip=0pt
        \parfillskip=0pt plus 1fil
        \commands@knit\extracommands@knit
        \def\nonumber{\global\showrn@knitfalse}%
        \csname auto#1@knit\endcsname #2\par}%
    \global\advance \chartwidth@knit \rnleftwd@knit
    \global\advance \chartwidth@knit \rnrightwd@knit
    \ifchartsonly \global\advance \chartwidth@knit 0.5\gridwidth \fi
    \hbox to \chartwidth@knit{\hskip \rnleftwd@knit
    \rlap{\purlgray \box\bgbox@knit}%
    \ifgrid\rlap{\gridcolor \box\ggbox@knit}\fi
    %
    \ifchartsonly
    \dimen2 = \dp \fgbox@knit \dimen3 = \ht \fgbox@knit
    \advance\dimen2 0.5\gridwidth \advance\dimen3 0.5\gridwidth
    \vrule width 0pt height \dimen3 depth \dimen2
    \fi
    % If we are doing charts only, we want to enlarge things enough that
    % we can see the grid on all sides.
    % But if we aren't, we want adjacent charts to merge seamlessly
    % because using separate charts is the only way to allow charts to
    % break across pages.
    \vbox{%
    \ifx\empty\charttitle@knit\empty\else
    \hbox to \chartwidth@knit{\hskip \rnleftwd@knit\printcharttitle{\charttitle@knit}\hskip \rnrightwd@knit}\fi
    \box\fgbox@knit}%
    \hss}%
    \endsmallpage@knit
    \gdef\charttitle@knit{}
    }

\def\printcharttitle#1{\hfil\vrule depth 3pt height 9pt width 0pt \relax #1\hfil}

% Special charts only macros

\newif \ifchartsonlysideways \chartsonlysidewaysfalse

\def \chartsonly{\chartsonlytrue
    \ifpdf@knit\else\errmessage{Package knit error: \chartsonly should only be used with pdfTeX.}\fi%
    \hoffset=-1in
    \voffset=-1in
    \vsize = 120in
    \topskip = 0pt % Causes problems in one-row charts if this isn't present
    \def\smallpage{\vfil\break
        \global\chartwidth@knit=0pt
        \setbox0 = \vbox\bgroup
            \def\smallpage@knit{\let\endsmallpage@knit\egroup \noindent \hbox\bgroup}%
        }
    \def\endsmallpage{\egroup%
    	\ifchartsonlysideways
 			%
			\pdfpageheight=\wd0
			%
			\dimen0=\ht0 \advance \dimen0 by \dp0
			\pdfpagewidth=\dimen0
			%
			\ifdim \pdfpagewidth > \vsize
			%{\newlinechar=`|
			%\message{||The chart ending on line \the\inputlineno\space is too big.}
			%\message{|Compensate by increasing \string\vsize\space or by breaking the chart into pieces.}%
			%\message{|What do you want such a big chart for, anyway?||}}%
			\fi
			%
			% Commands borrowed from samplepdf.tex
			\setbox1=\hbox{\copy0}%
			\wd1 = 0pt
			\ht1 = 0pt
			\dp1 = 0pt
			\vtop{\vskip\wd0
			\leftline{\hskip-2pt\hskip\ht0\hskip\dp0%
			\pdfliteral{q 0 1 -1 0 0 0 cm}%
			\box1
			\pdfliteral{Q}}}
	   	\else
			%
			\pdfpagewidth=\wd0
			%
			\dimen0=\ht0 \advance \dimen0 by \dp0
			\pdfpageheight=\dimen0
			%
			\ifdim \pdfpageheight > \vsize
			%{\newlinechar=`|
			%\message{||The chart ending on line \the\inputlineno\space is too big.}
			%\message{Compensate by increasing \string\vsize\space or by breaking the chart into pieces.}%
			%\message{What do you want such a big chart for, anyway?||}}%
			\fi
			%
			\box0
       \fi
        \vfil\break
        }
    \let\smallpage@knit\smallpage
    \let\endsmallpage@knit\endsmallpage
    \def\extracommands@knit{%
        \leftskip = 0.5\gridwidth
        \rightskip = 0.5\gridwidth
        %\vskip \gridwidth
        }
}
\let\smallpage\begingroup
\let\endsmallpage\endgroup

% Autonumbering macros

\def \everypar@knit{\hskip\leftgap@knit \leftgap@knit=0pt \relax}

\def         \auto@knit{\let\nonumber\relax \everypar={\everypar@knit\do@endofpar@knit{\adjustchartwidth@knit}}}
\def     \autoleft@knit{\everypar={\everypar@knit\rnleft@knit\do@endofpar@knit{\adjustchartwidth@knit}}}
\def    \autoright@knit{\everypar={\everypar@knit\do@endofpar@knit{\rnright@knit\adjustchartwidth@knit}}}
\def  \autooddleft@knit{\everypar={\everypar@knit
    \ifodd \rownumber %
        \rnleft@knit\do@endofpar@knit{\adjustchartwidth@knit}%
    \else %\hskip\rownumberwd
        \do@endofpar@knit{\rnright@knit\adjustchartwidth@knit}\fi}}
\def \autooddright@knit{\everypar={\everypar@knit
    \ifodd \rownumber %\hskip\rownumberwd
        \do@endofpar@knit{\rnright@knit\adjustchartwidth@knit}%
    \else\rnleft@knit\do@endofpar@knit{\adjustchartwidth@knit}\fi}}
\def     \autoboth@knit{\everypar={\everypar@knit\rnleft@knit\global\advance\rownumber 1 \do@endofpar@knit{\rnright@knit\adjustchartwidth@knit}}}
\let\autoevenleft@knit\autooddright@knit
\let\autoevenright@knit\autooddleft@knit

\def \adjustchartwidth@knit{\endgraf
    \ifnum \passnum@knit = 2 \setbox0=\lastbox
    \setbox1=\hbox{\unhcopy0\unskip}%
    \box0
    \ifdim\wd1 >\chartwidth@knit \global\chartwidth@knit=\wd1\fi\fi}

% Stitch-counting macros

\def \adjuststitchcount{\futurelet\next@knit\adjuststitchcount@knit}
\def \adjuststitchcount@knit{\ifx\next@knit[%
    \def\nextstep@knit{\adjuststitchcount@@knit}\else
    \def\nextstep@knit{\adjuststitchcount@@knit[\relax]}\fi\nextstep@knit}
\def \adjuststitchcount@@knit[#1]#2{%
    \leavevmode\ifnum\passnum@knit=3 \null
    \ifcountingout@knit \kern #2\stitchwd \else \ifx#1\relax \kern#2\stitchwd \else \kern #1\stitchwd \fi \fi \null\fi}

\def \stitchcountwarningbar{%
	\ifnum \stitchcountinprev = \stitchcountout \else 
		\ifnum \stitchcountinprev > -99 
			\vrule width \overfullrule 
			\message{Package knit warning: Stitch count mismatch on input line \the\inputlineno.}
	\fi \fi}

\def \countstitches#1{%
    \global\stitchcountinprev = \stitchcountin
    \setbox0 = \hbox{\def\passnum@knit{3}\countingout@knittrue \let\stitchwd\stitchwd@count@knit \stsout@knit #1}%
    \stitchcountout = \wd0
    \dimen0 = 0.5\stitchwd@count@knit \advance \stitchcountout \dimen0
    \global\divide \stitchcountout \stitchwd@count@knit
    \setbox1 = \hbox{\def\passnum@knit{3}\countingout@knitfalse \let\stitchwd\stitchwd@count@knit \stsin@knit #1}%
    \stitchcountin = \wd1
    \dimen1 = 0.5\stitchwd@count@knit \advance \stitchcountin \dimen1
    \global\divide \stitchcountin \stitchwd@count@knit
    }

\def \stitchcountchart{\futurelet\next@knit\stitchcountchart@knit}
\def \stitchcountchart@knit{\ifx\next@knit[%
    \def\nextstep@knit{\stitchcountchart@@knit}\else
    \def\nextstep@knit{\stitchcountchart@@knit[]}\fi\nextstep@knit}
\def \stitchcountchart@@knit[#1]{\begingroup \catcode`\|=\active \catcode`\# = 12 \def\chartrn@knit{#1}\obeylines \afterassignment \printstitchcountchart@knit \toks0 =}

\def \printstitchcountchart@knit{\smallpage@knit\hbox{%
    \ifx\relax\printleftstitchcount\else\ifx \empty \printleftstitchcount\else
        \let\printstitchcount@knit\printleftstitchcount
        \def\stitchcountside@knit{0}\makestitchcounts@knit \fi\fi
    \chart[\chartrn@knit]{\the\toks0}%
    \ifx\relax\printrightstitchcount\else\ifx \empty \printrightstitchcount\else
        \let\printstitchcount@knit\printrightstitchcount
        \def\stitchcountside@knit{1}\makestitchcounts@knit\fi\fi
    }\endsmallpage@knit
    \endgroup}

{\obeylines
\gdef\countstitcheseachrow@knit#1^^M{%
    \setbox1 = \hbox{#1}%
    \ifCountStsThisRow@knit%
    \countstitches{#1}%
    \setstitchcountlabel@knit%
    \else%
    \global\CountStsThisRow@knittrue%
    \setbox0=\hbox{}%
    \fi%
    \printstitchcountlabel@knit}
\gdef\shortrows@countstitcheseachrow@knit#1^^M{\countstitches{#1} %
    \ifx \relax \shortrowrowcount@knit %
        \global\advance \shortrowstsin@knit \stitchcountin   \global\advance \shortrowstsout@knit \stitchcountout %
        \global\let \shortrowrowcount@knit 2 
        % For some reason, we MUST NOT have a % after the 2.
    \else%
        \global\advance \shortrowstsin@knit -\stitchcountout \global\advance \shortrowstsout@knit -\stitchcountin %
        \global\let \shortrowrowcount@knit \relax
    \fi%
    \global\stitchcountin = \stitchcountinprev %
    }
\gdef\shortrows@printstitchcountlabel@knit#1^^M{\setbox1 = \hbox{#1}\printstitchcountlabel@knit\setbox0=\hbox{}}
\gdef\shortrows#1{%
	\ifnum \passnum@knit = 3
		\shortrowstsin@knit = 0 \shortrowstsout@knit = 0 \global\let \shortrowrowcount@knit \relax  %
		\setbox2 = \vbox{\everypar = {\shortrows@countstitcheseachrow@knit}%
			#1
			}%
    	\ifx \shortrowrowcount@knit \relax 
    		\advance \stitchcountin \shortrowstsin@knit \advance \stitchcountin -\shortrowstsout@knit %
    	\else
    		\stitchcountinprev = \stitchcountin \stitchcountin = \shortrowstsin@knit \stitchcountout = \shortrowstsout@knit %
    		\fi %
		\setstitchcountlabel@knit%
		\vbox{\everypar = {\shortrows@printstitchcountlabel@knit}%
    		\ifx \shortrowrowcount@knit \relax \setbox0=\hbox{} \else 
    		\ifCountStsThisRow@knit\else \setbox0=\hbox{} \global\CountStsThisRow@knittrue \fi \fi
			#1
			}%
    \else%
    #1
    \fi%
    \par}
    }

\def\setstitchcountlabel@knit{\setbox0=\hbox{\def\passnum@knit{2}\strut@knit \printstitchcount@knit\stitchcountwarningbar}}
\def\printstitchcountlabel@knit{\ifdim \wd0 > \stitchcountwidth@knit \global\stitchcountwidth@knit = \wd0 \fi
    \hbox to 0pt{\ifnum\stitchcountside@knit = 0 \hss\fi
        \vrule width 0pt height \ht1 depth \dp1 \smash{\box0}%
        \ifnum\stitchcountside@knit = 1 \hss\fi}%
    \par}

\def\makestitchcounts@knit{\hbox{\setbox1=\vbox{\stitchcountin = -1001
    \global\stitchcountwidth@knit=0pt
    \global\CountStsThisRow@knittrue
    \parindent=0pt
    \def\passnum@knit{3}
    \def\doifcounting@knit##1{##1}
    \ff@knit
    \commands@knit
    \everypar={\countstitcheseachrow@knit} \offinterlineskip
    \the\toks0
    }%
    \ifnum\stitchcountside@knit = 0
    \hskip \stitchcountwidth@knit\rlap{\box1}%
    \else
    \rlap{\box1}\hskip \stitchcountwidth@knit
    \fi
}}

\def\nostitchcount{\ifnum \passnum@knit = 3 \global \CountStsThisRow@knitfalse \fi}

\def \knitdebug{\def \printleftstitchcount{{\rncolor \knitrm(\the\stitchcountout\ out, \the\stitchcountin\ in) }}}

\def \printleftstitchcount{{\rncolor \knitrm(\the\stitchcountout\ sts) }}
\def \printrightstitchcount{}

\def \knitdebugging{\def \printleftstitchcount{{\rncolor \knitrm(\the\stitchcountout\ out/\the\stitchcountin\ in) }}}

\catcode`\@=\catcountknit

