• Tidak ada hasil yang ditemukan

Line numbers

Dalam dokumen The Listings Package (Halaman 168-171)

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

Dalam dokumen The Listings Package (Halaman 168-171)