2603 \lst@ifletter
2604 \lst@Output
2605 \lst@fmtifignore\else
2606 \lst@AppendOther\lst@outputspace
2607 \fi
2608 \else \lst@ifkeepspaces
2609 \lst@AppendOther\lst@outputspace
2610 \else \ifnum\lst@newlines=\z@
2611 \lst@AppendSpecialSpace
2612 \else \ifnum\lst@length=\z@
2613 \global\advance\lst@lostspace\lst@width
2614 \global\advance\lst@pos\m@ne
2615 \else
2616 \lst@AppendSpecialSpace
2617 \fi
2618 \fi \fi \fi
2619 \lst@whitespacetrue}
Formatting identifiers
\lst@fmtIdentifier We install a (keyword) test for the ‘format identifiers’.
2620\lst@InstallTest{f}
2621 \lst@fmt@list\lst@fmt \lst@gfmt@list\lst@gfmt
2622 \lst@gfmt@wp
2623 wd
2624\gdef\lst@fmt@list{\lst@fmt\lst@gfmt}\global\let\lst@fmt\@empty
2625\gdef\lst@gfmt@list{\lst@fmt\lst@gfmt}\global\let\lst@gfmt\@empty
The working procedure expands\lst@fmt$hstringi(and defines\lst@PrintToken to do nothing).
2626\gdef\lst@gfmt@wp{%
2627 \begingroup \let\lst@UM\@empty
2628 \let\lst@PrintToken\@empty
2629 \csname\@lst @fmt$\the\lst@token\endcsname
2630 \endgroup}
This control sequence is probably defined as ‘working identifier’.
2631\gdef\lst@fmtIdentifier#1#2#3#4{%
2632 \lst@DefOther\lst@fmta{#2}\edef\lst@fmt{\lst@fmt,\lst@fmta}%
2633 \@namedef{\@lst @fmt$\lst@fmta}{#3#4}}
\lst@fmt$hidentifieriexpands to a\lst@fmtPre/\lst@fmtPostsequence defined by#2and#3.
2634\lst@EndAspect
2635h/misci
2639 \let\lst@PlaceNumber\@empty
2640 \lstKV@SwitchCases{#1}%
2641 {none:\\%
2642 left:\def\lst@PlaceNumber{\llap{\normalfont
2643 \lst@numberstyle{\thelstnumber}\kern\lst@numbersep}}\\%
2644 right:\def\lst@PlaceNumber{\rlap{\normalfont
2645 \kern\linewidth \kern\lst@numbersep
2646 \lst@numberstyle{\thelstnumber}}}%
2647 }{\PackageError{Listings}{Numbers #1 unknown}\@ehc}}
numberstyle numbersep stepnumber numberblanklines numberfirstline
Definition of the keys.
2648\lst@Key{numberstyle}{}{\def\lst@numberstyle{#1}}
2649\lst@Key{numbersep}{10pt}{\def\lst@numbersep{#1}}
2650\lst@Key{stepnumber}{1}{\def\lst@stepnumber{#1\relax}}
2651\lst@AddToHook{EmptyStyle}{\let\lst@stepnumber\@ne}
2652\lst@Key{numberblanklines}{true}[t]
2653 {\lstKV@SetIf{#1}\lst@ifnumberblanklines}
2654\lst@Key{numberfirstline}{f}[t]{\lstKV@SetIf{#1}\lst@ifnumberfirstline}
2655\gdef\lst@numberfirstlinefalse{\let\lst@ifnumberfirstline\iffalse}
firstnumber We select the first number according to the argument.
2656\lst@Key{firstnumber}{auto}{%
2657 \lstKV@SwitchCases{#1}%
2658 {auto:\let\lst@firstnumber\@undefined\\%
2659 last:\let\lst@firstnumber\c@lstnumber
2660 }{\def\lst@firstnumber{#1\relax}}}
2661\lst@AddToHook{PreSet}{\let\lst@advancenumber\z@}
\lst@firstnumber now set to\lst@lineno instead of \lst@firstline, as per changes inlstpatch.styfrom 1.3b pertaining to linerange markers.
2662\lst@AddToHook{PreInit}
2663 {\ifx\lst@firstnumber\@undefined
2664 \def\lst@firstnumber{\lst@lineno}%
2665 \fi}
\lst@SetFirstNumber
\lst@SaveFirstNumber
Boris Veytsman proposed to continue line numbers according to listing names.
We define the label number of the first printing line here. A bug reported by Jens Schwarzer has been removed by replacing\@ne by\lst@firstline.
2666\gdef\lst@SetFirstNumber{%
2667 \ifx\lst@firstnumber\@undefined
2668 \@tempcnta 0\csname\@lst no@\lst@intname\endcsname\relax
2669 \ifnum\@tempcnta=\z@ \@tempcnta\lst@firstline
2670 \else \lst@nololtrue \fi
2671 \advance\@tempcnta\lst@advancenumber
2672 \edef\lst@firstnumber{\the\@tempcnta\relax}%
2673 \fi}
The current label is stored in\lstno@hnamei. If the name is empty, we use a space instead, which leaves\lstno@undefined.
2674\gdef\lst@SaveFirstNumber{%
2675 \expandafter\xdef
2676 \csname\@lst no\ifx\lst@intname\@empty @ \else @\lst@intname\fi
2677 \endcsname{\the\c@lstnumber}}
\c@lstnumber This counter keeps the current label number. We use it as current label to make line numbers referenced by \ref. This was proposed by Boris Veytsman. We now use\refstepcounterto do the job—thanks to a bug report from Christian Gudrian.
2678\newcounter{lstnumber}% \global
2679\global\c@lstnumber\@ne % init
2680\renewcommand*\thelstnumber{\@arabic\c@lstnumber}
2681\lst@AddToHook{EveryPar}
2682 {\global\advance\c@lstnumber\lst@advancelstnum
2683 \global\advance\c@lstnumber\m@ne \refstepcounter{lstnumber}%
2684 \lst@SkipOrPrintLabel}%
2685\global\let\lst@advancelstnum\@ne
Note that the counter advances before the label is printed and not afterwards.
Otherwise we have wrong references—reported by Gregory Van Vooren.
2686\lst@AddToHook{Init}{\def\@currentlabel{\thelstnumber}}
The label number is initialized and we ensure correct line numbers for con- tinued listings. An apparently-extraneous advancement of the line number by -\lst@advancelstnumwhenfirstnumber=lastis specified was removed, follow- ing a bug report by Joachim Breitner.
2687\lst@AddToHook{InitVars}
2688 {\global\c@lstnumber\lst@firstnumber
2689 \global\advance\c@lstnumber\lst@advancenumber
2690 \global\advance\c@lstnumber-\lst@advancelstnum}
2691\lst@AddToHook{ExitVars}
2692 {\global\advance\c@lstnumber\lst@advancelstnum}
Walter E. Brown reported problems with pdftex and hyperref. A bad default of
\theHlstlabel was the reason. Heiko Oberdiek found another bug which was due to the localization of\lst@neglisting. He also provided the following fix, replacing\thelstlistingwith the\ifx. . . \ficonstruction. Ivo Pletikosi´c re- ported another problem with the redefinition of\thelstlisting. Heiko Oberdiek again provided a fix: \thelstlistingmust be replaced by\theHlstlisting.
2693\AtBeginDocument{%
2694 \def\theHlstnumber{\ifx\lst@@caption\@empty \lst@neglisting
2695 \else \theHlstlisting \fi
2696 .\thelstnumber}}
\lst@skipnumbers There are more things to do. We calculate how many lines must skip their label.
The formula is
\lst@skipnumbers=first printing linemod\lst@stepnumber.
Note that we use a nonpositive representative for\lst@skipnumbers.
2697\newcount\lst@skipnumbers % \global
2698\lst@AddToHook{Init}
2699 {\ifnum \z@>\lst@stepnumber
2700 \let\lst@advancelstnum\m@ne
2701 \edef\lst@stepnumber{-\lst@stepnumber}%
2702 \fi
2703 \ifnum \z@<\lst@stepnumber
2704 \global\lst@skipnumbers\lst@firstnumber
2705 \global\divide\lst@skipnumbers\lst@stepnumber
2706 \global\multiply\lst@skipnumbers-\lst@stepnumber
2707 \global\advance\lst@skipnumbers\lst@firstnumber
2708 \ifnum\lst@skipnumbers>\z@
2709 \global\advance\lst@skipnumbers -\lst@stepnumber
2710 \fi
If\lst@stepnumberis zero, no line numbers are printed:
2711 \else
2712 \let\lst@SkipOrPrintLabel\relax
2713 \fi}
\lst@SkipOrPrintLabel But default is this. We use the fact that \lst@skipnumbersis nonpositive. The counter advances every line and if that counter is zero, we print a line number and decrement the counter by\lst@stepnumber.
2714\gdef\lst@SkipOrPrintLabel{%
2715 \ifnum\lst@skipnumbers=\z@
2716 \global\advance\lst@skipnumbers-\lst@stepnumber\relax
2717 \lst@PlaceNumber
2718 \lst@numberfirstlinefalse
2719 \else
If the first line of a listing should get a number, it gets it here.
2720 \lst@ifnumberfirstline
2721 \lst@PlaceNumber
2722 \lst@numberfirstlinefalse
2723 \fi
2724 \fi
2725 \global\advance\lst@skipnumbers\@ne}%
2726\lst@AddToHook{OnEmptyLine}{%
2727 \lst@ifnumberblanklines\else \ifnum\lst@skipnumbers=\z@
2728 \global\advance\lst@skipnumbers-\lst@stepnumber\relax
2729 \fi\fi}
2730\lst@EndAspect
2731h/misci