% \iffalse meta-comment % % Copyright (C) 2008-2010 Jobst Hoffmann, FH Aachen, Campus J\"ulich % ----------------------------------------------------------------------------------------- % % This file may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.2 % of this license or (at your option) any later version. % The latest version of this license is in: % % http://www.latex-project.org/lppl.txt % % and version 1.2 or later is part of all distributions of LaTeX % version 1999/12/01 or later. % % \fi % % % \changes{v67}{10/06/29}{removed some needless blanks} % \changes{v67}{10/06/29}{email adresses are obfuscated now} % \changes{v58}{10/05/18}{moved the docstrip guards into the corresponding macrocode environments} % \changes{v56}{10/03/09}{some small layout changes} % \changes{v37}{09/08/27}{changed the copyright message again} % \changes{v11}{09/04/15}{changed the Copyright message} % \changes{v16}{09/08/18}{replaced macroname rcs by svn} % \iffalse %\NeedsTeXFormat{LaTeX2e}[1995/12/01] %{% % \def\@svn@ $#1Date: #2-#3-#4 #5$$#6Revision: #7$ {% % \ProvidesPackage{listings-ext}[#2/#3/#4 v#7 an extension for the listings package (JHf)]} % \@svn@ $Date: 2010-06-29 18:38:12 +0200 (Di, 29 Jun 2010) $$Revision: 67 $ % %} % \fi % \CheckSum{363} % \changes{v41}{09/08/27}{removed typos again} % \def\docdate {10/06/29} ^^A not style'able!! % % \changes{v11}{09/04/15}{turned german documentation into an english one} %\iffalse % % Package `listings-ext' for use with LaTeX v2e % Copyright (C) 2008-2010 Jobst Hoffmann , all rights reserved. % ----------------------------------------------------------------- % % This file may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.2 % of this license or (at your option) any later version. % The latest version of this license is in: % % http://www.latex-project.org/lppl.txt % % and version 1.2 or later is part of all distributions of LaTeX % version 1999/12/01 or later. % % Address your error messages to: % Jobst Hoffmann % Fachhochschule Aachen, Campus J"ulich % Ginsterweg 1 % 52428 J"ulich % Bundesrepublik Deutschland % Email: % %\fi % % \def\listingsextSty{{\sf listings-ext.sty}} % \def\listingsext{{\sf listings-ext}} % % \changes{v33}{09/08/23}{updated `DoNotIndex list} % \DoNotIndex{\ ,\!,\C,\[,\\,\],\^,\`,\{,\},\~,\<,\=, \", \|} % \DoNotIndex{\@ifundefined,\@ne, \@spaces, \author} % \DoNotIndex{\catcode, \copyright, \def, \docdate, \documentclass} % \DoNotIndex{\else,\endinput,\expandafter,\fi,\filedate,\fileversion} % \DoNotIndex{\gdef,\global,\ifnum,\ifx,\let,\long} % \DoNotIndex{\newcount,\newdimen,\newif,\next,\space,\string} % \DoNotIndex{\the,\xdef,\z@} % \DoNotIndex{\@@par, \@empty, \@hangfrom, \@reffalse, \@reftrue,} % \DoNotIndex{\advance, \Alph, \alph, \arabic, \arraystretch, \baselineskip} % \DoNotIndex{\begin} % \DoNotIndex{\bgroup, \bigskip, \box, \bullet, \cdot, \centering} % \DoNotIndex{\columnwidth, \csname, \day, \divide, \dotfill, \dp} % \DoNotIndex{\edef, \egroup, \empty, \end, \endcsname, \font, \footins, \foo} % \DoNotIndex{\frenchspacing, \hbadness, \hbox, \hfil, \hfill, \hline} % \DoNotIndex{\hrule, \hsize, \hskip, \hspace, \hss, \ht, \ifcase} % \DoNotIndex{\ifdim, \ifodd} % \DoNotIndex{\ifvmode, \ignorespaces, \input, \interlinepenalty, \item} % \DoNotIndex{\itemindent, \kern, \L, \large, \leaders, \list, \listparindent} % \DoNotIndex{\magstep} % \DoNotIndex{\magstephalf, \makelabel, \MakeShortVerb, \marginpar} % \DoNotIndex{\mark, \mbox, \month, \multicolumn, \newpage, \newcommand} % \DoNotIndex{\nobreak, \noexpand, \noindent} % \DoNotIndex{\normalsize, \null} % \DoNotIndex{\number, \onecolumn, \or, \overfullrule} % \DoNotIndex{\pagebreak, \pagestyle, \parbox, \penalty, \phantom, \protect} % \DoNotIndex{\quad} % \DoNotIndex{\raggedbottom, \raggedleft} % \DoNotIndex{\relax, \renewcommand, \reversemarginpar} % \DoNotIndex{\rightmargin, \rule, \setbox, \setcounter} % \DoNotIndex{\setlength, \settowidth, \shortstack, \strut, \svtnsfb, \switch} % \DoNotIndex{\thepage, \thispagestyle, \tiny, \today, \triangleright, \typeout} % \DoNotIndex{\underbar, \underline, \unskip, \uppercase, \usepackage} % \DoNotIndex{\vadjust, \vbadness, \vbox, \verb, \vfil, \vfill, \vrule, \vskip} % \DoNotIndex{\vspace, \vtop, \wd, \year} % \DoNotIndex{\bf, \tt, \par, \smallskip, \stepcounter} % % ^^A some extra entries to make wrong entries in the index invisible % \DoNotIndex{\-, \n, \t, \tbe, \tcase, \tdebug, \tgenerate, \tIf, \tif, \tinto} % \DoNotIndex{\tof, \tprocessed, \tshow, \twrite} % % ^^A \setlength{\IndexMin}{0.3\textheight} % % \changes{v56}{10/03/09}{corrected typo at `Fname} % \changes{v50}{10/02/15}{changed some documentation commands to starred version} % \changes{v37}{09/08/27}{reworked the documentation} % \changes{v35}{09/08/27}{some textual changes}% % \changes{v34}{09/08/24}{reworked the documentation}% % \changes{v34}{09/08/24}{added commands `Fname and `ext to unify the documentation}% % \changes{v34}{09/08/24}{changed the title again}% % \changes{v33}{09/08/23}{changed title}% % \changes{v23}{09/08/20}{enhanced the documentation}% % \changes{v23}{09/08/20}{rearranged the sections about Makefile, tests, % AUCTeX}% % \changes{v16}{09/08/18}{added macros to make the documentation % independent of non standard packages}% % \changes{v11}{09/04/15}{corrected some text}% % ^^A now some macros to simplify the writing of the documentation % \newcommand*\Lopt[1]{\textsf{#1}}% % \let\Lpack\Lopt% % \let\ext\Lopt% % \newcommand*{\Fname}[1]{\texttt{#1}}% % \newcommand*{\XEmacs}{\textsf{(X)Emacs}}% % \newcommand*{\SOURCEFRAME}{% % \psline(0,0)(0,7) % \psline(1.5,0)(1.5,7) % \rput[lc](0.75,0){\ldots} % \rput[lc](0.75,7){\ldots} % } % \newcommand*{\SOURCEA}[1]{% % \psline*[linecolor=LemonChiffon](0,0)(1.5,0)(1.5,2)(0,2)% % \if#1f% % \psline(0,0)(1.5,0)(1.5,2.0)(0,2.0)(0,0)% % \else\if#1g % \psline[linewidth=1mm, linecolor=Olive](1.5,2.05)(0,2.05)% % \psline[linewidth=1mm, linecolor=DarkOliveGreen](0,-0.05)(1.5,-0.05)% % \fi\fi% % } % \newcommand*{\SOURCEB}[1]{% % \psline*[linecolor=LightGreen](0,0)(1.5,0)(1.5,0.5)(0,0.5)% % \if#1f% % \psline(0,0)(1.5,0)(1.5,0.5)(0,0.5)(0,0)% % \else\if#1g % \psline[linewidth=1mm, linecolor=Olive](1.5,0.55)(0,0.55)% % \psline[linewidth=1mm, linecolor=DarkOliveGreen](0,-0.05)(1.5,-0.05)% % \fi\fi% % } % \newcommand*{\SOURCEC}[1]{% % \psline*[linecolor=LightCyan](0,0)(1.5,0)(1.5,1.25)(0,1.25)% % \if#1f% % \psline(0,0)(1.5,0)(1.5,1.25)(0,1.25)(0,0)% % \else\if#1g % \psline[linewidth=1mm, linecolor=Olive](0,-0.05)(1.5,-0.05)% % \psline[linewidth=1mm, linecolor=DarkOliveGreen](1.5,1.30)(0,1.30)% % \fi\fi% % } % ^^A to avoid underfull messages while formatting two/three columns % \hbadness=10000 \vbadness=10000% % \setcounter{secnumdepth}{2}% % \setcounter{tocdepth}{2}% % % \title{\listingsext\ --- A collection of \LaTeX{} commands and some % helper files to support the automatic integration of parts of source % files into a documentation\thanks{% % This file has version number \fileversion, last revised on \filedate{}, % documentation dated \docdate.}% % }% % \author{Jobst Hoffmann\\ % Fachhochschule Aachen, Campus J\"ulich\\ % Ginsterweg 1\\ % 52428 J\"ulich\\ % Bundesrepublik Deutschland\\ % email: j.hoffmann\_(at)\_fh-aachen.de}% % \date{printed on \today} % % ^^A\markboth{\LaTeX\ Stil-Option listings-ext, version \fileversion\ of \filedate} % ^^A {\LaTeX\ Stil-Option listings-ext, version \fileversion\ of \filedate} % % \maketitle % % \begin{abstract} % This article describes the use and the implementation of the \LaTeX{} % package \listingsextSty{}, a package to simplify the insertion of parts % of source code files into a document(ation). % \end{abstract} % % \newif\ifmulticols % \IfFileExists{multicol.sty}{\multicolstrue}{} % % \ifmulticols % \addtocontents{toc}{\protect\begin{multicols}{2}} % \fi % % \tableofcontents % % \section{Preface} % \label{sec:preface} % % \changes{v09}{09/04/05}{added some text to the preface}% % This package is % intended as an implementation of the macros which are described in % \cite{lingnau07:_latex_hacks}. If a software developer wants to document % a piece of software, in most cases she/he doesn't need to print out whole % source code files, but only parts of the files. This can be achieved by the % \Lpack{listings}-package \cite{Heinz:Listings-14} and especially by the command % \begin{quote} % |\lstinputlisting[linerange={|\meta{first1}|-|\meta{last1}|}|, \ldots{}|]{|\meta{filename}|}| % \end{quote} % In \cite{lingnau07:_latex_hacks} there are described three macros, which % can be created automatically, so that in the case of changes in the % source code the developer mustn't change the contents of the line ranges, % but she/he only has to rerun a program, which regenerates the meaning of % the macros. In the following the three macros and a Bash-script to deal with % these three macros are provided. % % % \changes{v16}{09/08/18}{added macros to make the documentation % independent of non standard packages} % \section[Installation and Maintenance]{Hints For Installation And Maintenance} % \label{sec:installation-maintenance} % % The package \listingsextSty{} is belonging to consists of altogether four files: % \begin{quote} % \Fname{README}, \\ % \Fname{listings-ext.ins}, \\ % \Fname{listings-ext.dtx}, \\ % \Fname{listings-ext.pdf}. % \end{quote} % In order to generate on the one hand the documentation of the package and % on the other hand the corresponding \ext{.sty}-file and the supporting Bash-script % one has to proceed as follows: % % \changes{v46}{09/08/31}{enhanced the documentation at several points} % First the file \textsf{listings-ext.ins} must be formatted e.g.\ by % \begin{quote} %\begin{verbatim} %latex listings-ext.ins %\end{verbatim}% % \end{quote} % This formatting run generates several other files. These are first of % all the previous mentioned \ext{.sty}-file \Fname{listings-ext.sty}, the % style file which can be used by |\usepackage{listings-ext}| and the % Bash-script |listings-ext.sh|. Then there are the files % \Fname{listings-ext.bib} and \Fname{hyperref.cfg}, which are needed to % produce this documentation. The creation of the documentation is is % simplified by the files \Fname{listings-ext.makemake} and % \Fname{listings-ext.mk}, which can be used to make a \Fname{Makefile} % (see section~\ref{sec:Makefile}). Another helper file is % \Fname{listings-ext.el}, which can be used with the \XEmacs{} editor (see % section~\ref{sec:AUCTeX}). Some simple tests of this package can be done % by using the files \Fname{listings-ext*exmpl*} and % \Fname{listings-ext*test*}, which are also created; these files use the % configuration file \Fname{listings.cfg}, which can also be used as a base or % supplement for own configuration files of the % \Lpack{listings}-package. This file can be put into the current % directory for local use or into the |TEXMFHOME| directory for use with % every document. You have to take care about the fact, that the local % file in the current directory prevent any |listings.cfg| from being loaded. % Finally there is a file \Fname{getversion.tex}, which is used for the % creation of a "versioned" distribution. % % The common procedure to produce the documentation is to execute the % commands % \begin{quote} %\begin{verbatim} %latex listings-ext.dtx %bibtex listings-ext %latex listings-ext.dtx %makeindex -s gind.ist listings-ext.idx %makeindex -s gglo.ist -o listings-ext.gls -t listings-ext.glg \ % listings-ext.glo %latex listings-ext.dtx %\end{verbatim} % \end{quote} % The result of this formatting run is the documentation in form of a % \ext{.dvi}-file, that can be manipulated the normal way. It ain't % possible to use |pdflatex| because of the integrated PostScript based % figures. % % One can find further informations about working with the integrated % documentation in \cite{FM:TheDocAndShortvrbPackages} and % \cite{MittelbachDuchierBraams:DocStrip}.\footnote{Generating the % documentation is much easier with the \texttt{make} utility, see % section~\ref{sec:Makefile}.} % % \changes{v33}{09/08/23}{cleaned up the driver once more} % \changes{v33}{09/08/23}{moved hyperref settings into hyperref.cfg} % \changes{v23}{09/08/20}{cleaned up the code} % \changes{v16}{09/08/18}{replaced last german sentences from % documentation} % This documentation itself is generated by the following internal driver % code: % \begin{macrocode} %<*driver> \documentclass[a4paper, ngerman, english]{ltxdoc} \usepackage[T1]{fontenc} \usepackage{lmodern} \usepackage{babel,babelbib} \usepackage[svgnames]{pstricks} \usepackage{listings-ext} \GetFileInfo{listings-ext.sty} \newif\ifcolor \IfFileExists{color.sty}{\colortrue}{} \ifcolor \RequirePackage{color}\fi \usepackage[numbered]{hypdoc} \usepackage{url} %\EnableCrossrefs %\DisableCrossrefs % say \DisableCrossrefs if index is ready %\RecordChanges % gather update information %\CodelineIndex % index entry code by line number \OnlyDescription % comment out for implementation details \MakeShortVerb{\|} % |\foo| acts like \verb+\foo+ \begin{document} \DocInput{listings-ext.dtx}% \end{document} % % \end{macrocode} % % \changes{v13}{09/05/28}{enhanced the documentation} % \section{The User's Interface} % \label{sec:users-interface} % % \changes{v16}{09/08/18}{extended the description of usage} % \subsection{Preparing the \LaTeX{} code} % \label{sec:preparing-latex} % % The user's interface is as simple as possible: just load the required % package by saying % \begin{quote} % |\usepackage[|style=\meta{style-name}|]{listings-ext}| % \end{quote} % \meta{style-name} is the name of a \textsf{listings} style, defined by % the command \cite[sec.~4.5]{Heinz:Listings-14}. You can find examples for % such styles in the exemplary configuration file \Fname{listings.cfg}. % \begin{quote} % |\lstdefinestyle{|\meta{style name}|}{|\meta{key=value list}|}| % \end{quote} % % After loading the package provides three commands: % \begin{enumerate} % \item \begin{quote} % |\lstdef{|\meta{identifier}|}{|\meta{file-name}|}{|\meta{range}|}| % \end{quote} % defines the \meta{identifier}, by which the line range \meta{range} in the % file defined by \meta{file-name} can be referenced. If you identify % several \meta{filename}s or \meta{range}s by the same % \meta{identifier}, the last definition is valid. If you don't like % that behaviour, put the corresponding |\lstdef|- and % |\lstuse|-commands (see below) into a group of its own. % \item \begin{quote} % |\lstuse[|\meta{options}|]{|\meta{identifier}|}| % \end{quote} % includes the source code which is referenced by \meta{identifier} by % (internally) calling |\lstinputlisting| of the package % \Lpack{listings} \cite{Heinz:Listings-14}, the way of formatting can be influenced by % \meta{options}. % \item % \begin{quote} % |\lstcheck{|\meta{identifier}|}{|\meta{file-name}|}| % \end{quote} % can be used, if one prepares a file \meta{file-name} consisting of a % lot of |\lstdef| commands. If \meta{identifier} isn't yet defined, % the file defined by \meta{file-name} is |\input|. This command is % especially helpful, if you prepare a presentation and you want to % format only single slides for testing their look. % \end{enumerate} % % % \subsection{Preparing the source code} % \label{sec:preparing-source} % % If you just want to include a small part of a source code file, you can % do that without touching the source: just write the corresponding % commands |\lstdef| and |\lstuse| into your \LaTeX-code. But if the % source code changes, you have to adapt the changes in the |\lstdef| % command. That may be very tedious, if are you changing your sources often. % % It' better to automate that procedure, and one way of implementig that is % done at the Bash-script \Fname{listings-ext.sh}. For working with that % script you have to tag the parts of the source, which you want to % document, by comments. % % At the moment there are three tags, which can be described by the % following regular expressions: % \begin{enumerate} % \item |^\ +|\meta{endline-comment-character(s)}|\ be:\ |\meta{string}|$| % % This expression defines the beginning of the environment, which should be % |\lstinput| into the document. % \item |^\ +|\meta{endline-comment-character(s)}|\ ee:\ |\meta{string}|$| % % This expression defines the end of that environment. % \item |^\ +|\meta{endline-comment-character(s)}|\ ce:\ |\meta{list of % keywords} % % This expression defines, how the the environments defined by the above % introduced should be processed. % \end{enumerate} % The meaning of the regular expressions is: start a line with at least one % blank space "\verb*| |", add endline comment characters (C++ and Java: % |//|, Fortran: |!|) followed by another blank space. Then you have to % enter "\verb*|be: |" for the beginning of a code environment, and % % "\verb*|ee: |" for the end. In both cases the line must be ended with a % string which should denote the meaning of the environment , the strings for the % beginning and the end must be identical.\footnote{You can also use the % standard C comments |/*| \ldots|*/|, but in that case the trailing "|*/|" % is seen as the end of the \meta{string}.} % % \changes{v63}{10/06/22}{added remarks about Max OS X} % \changes{v53}{10/03/09}{issue solved: now able to handle any file name as % list of source files} % If you have prepared a source code file with these tags, you can process % it by the Bash-script provided by the package. The script should work for % a Linux system out of the box, for a Mac OS X 10.x one must additionally % install |getopt| from \url{http://getopt.darwinports.com/}, which in turn % needs |MacPorts| (from % \url{http://www.macports.org/install.php}).\footnote{The package is % tested with Max OS X v\,10.6.3, |getopt|'s version number is v\,1.1.4 and % |MacPorts| version number is v\,1.9.0.} % % The simplest way to do it is the call % \begin{quote} % |listings-ext.sh -co |\meta{file list} % \end{quote} % \meta{file list} is a list of one or more file names. This call creates % the file \meta{directory}|.lst|, where \meta{directory} is the name of % the current directory. The file consists of a header and a list of |\lstdef| % commands, % of the form % \begin{quote} % |\lstdef{|\meta{identifier}|}{|\meta{filename}|}{|\meta{line range(s)}|}| % \end{quote} % You can |\input| the file \meta{directory}|.lst| into your documentation; % its header looks like (for example) %\begin{verbatim} % %% -- file listings-ext.lst generated on Mi 26. Aug 22:05:20 CEST 2009 % by listings-ext.sh % \csname listingsextLstLoaded\endcsname % \expandafter\let\csname listingsextLstLoaded\endcsname\endinput %\end{verbatim} % The first line is wrapped by hand, the second and third line prohibit a % second load of that file. One of the |\lstdef| could look like %\begin{verbatim} % \lstdef{listingsExtExmplAA}{/home/xxx% % /listings-ext% % /listings-ext_exmpl_a.java}{3-5} %\end{verbatim} % % You can input this file in two ways into your document: % \begin{enumerate} % \item by saying %\begin{verbatim} % \input{listings-ext.lst} %\end{verbatim} % at the beginning of a file or % \item by saying %\begin{verbatim} % \lstcheck{listingsExtExmplAA}{listings-ext.lst} %\end{verbatim} % in an environment to keep the definition local. % \end{enumerate} % % After that you can use the command |\lstuse| to integrate the source % code parts into your documentation. The usage is % \begin{quote} % |\lstuse[|\meta{options}|]{|\meta{identifier}|}| % \end{quote} % at the place, where you want the part of your source code. % % The \meta{identifier} is generated automatically, it is derived from the % file name, you have to transfer the identifiers from the \ext{.lst}-file % to the |\lstuse|-command by hand, but that happens typically only one % time. So in this case the |\lstuse| command could look like --- as said % you can add options --- %\begin{verbatim} % \lstuse{listingsExtExmplAA} %\end{verbatim} % % For more information about the use of the Bash-script |listings-ext.sh| % enter the command % \begin{quote} % |listings-ext.sh -h| % \end{quote} % % \changes{v09}{09/04/05}{introduced a description of the ce-commands} % There is one optional initial tag |ce:| (\textit{control environment}): It needs one % argument \meta{mode}. The argument describes the further % processing. \meta{mode} may be one of the following values: % \begin{description} % \item[\texttt{combine}:] |be: | \ldots{}|ee: | groups with the same % description are combined into one piece of code in the output % \item[\texttt{join}:] all |be: | \ldots{}|ee: | groups (independent of % the description) are combined into one piece of code in the output % \end{description} % The behaviour of the three modes of operation is shown in % Figure~\ref{fig:modes-operation}. % |ce:| has to be put before all other tags in the source code. % \changes{v35}{09/08/27}{added figure to show the behaviour of listings-ext.sh} % \begin{figure}[htb] % \psset{unit=6mm} \centering % \begin{pspicture}(0,-1.0)(4,7) \rput[lB](0,4.5){\SOURCEA{g}} % \rput[lB](0,3.0){\SOURCEB{g}} \rput[lB](0,1.0){\SOURCEC{g}} % \rput[lB](0,0){\SOURCEFRAME} \rput[lB](2.5,4.5){\SOURCEA{f}} % \rput[lB](2.5,3.0){\SOURCEB{f}} \rput[lB](2.5,1.0){\SOURCEC{f}} % \rput(2.5,-0.7){a)} % \end{pspicture} % \hspace{2cm} % \begin{pspicture}(0,-1.0)(4,7) \rput[lB](0,4.5){\SOURCEA{g}} % \rput[lB](0,3.0){\SOURCEB{g}} \rput[lB](0,1.0){\SOURCEC{g}} % \rput[lB](0,0){\SOURCEFRAME} \rput[lB](2.5,3.5){\SOURCEA{}} % \rput[lB](2.5,3.0){\SOURCEB{}} \rput[lB](2.5,1.75){\SOURCEC{}} % \psframe(2.5,1.75)(4.0,5.5) \rput(2.5,-0.7){b)} % \end{pspicture} % \hspace{2cm} \begin{pspicture}(0,-1.0)(4,7) % \rput[lB](0,4.5){\SOURCEA{g}} \rput[lB](0,3.0){\SOURCEB{g}} % \rput[lB](0,1.0){\SOURCEC{g}} \rput[lB](0,0){\SOURCEFRAME} % \rput[lB](2.5,3.5){\SOURCEA{}} \rput[lB](2.5,2.25){\SOURCEC{}} % \psframe(2.5,2.25)(4.0,5.5) \rput[lB](2.5,1.0){\SOURCEB{}} % \psframe(2.5,1.0)(4.0,1.5) \rput(2.5,-0.7){c)} % \end{pspicture} % \caption[Modes of operation]{Modes of operation: a) no special control of the tagged % parts, every part can be processed by itself, b) control by |ce: % join|, all tagged parts are joint into one piece, which can be % further processed, c) control by |ce: combine|, tagged parts with % the same describing string are joint into one piece, which can be % further processed, all other parts can be processed by their own} % \label{fig:modes-operation} % \end{figure} % % % \changes{v33}{09/08/23}{moved bibliography into listings-ext.bib} % \changes{v27}{09/08/21}{a few small layout changes} % \changes{v16}{09/08/18}{internalized the bibliography} % \StopEventually{ % \bibliographystyle{babalpha} % \bibliography{listings-ext} % % \ifmulticols % \addtocontents{toc}{\protect\end{multicols}} % \fi % % \PrintChanges % \PrintIndex % } ^^A end of \StopEventually % % \clearpage % % % \changes{v16}{09/08/18}{started the documentation of the implementation} % \section{The Implementation} % \label{sec:the-implementation} % % \subsection{The style file} % \label{sec:the-style-file} % % At first we must declare the required packages : % \begin{macrocode} %<*extension> \RequirePackage{listings} \RequirePackage{xkeyval} % \end{macrocode} % and the package options for \listingsextSty. % \begin{macro}{style} % is the only option at the moment. % \begin{macrocode} \DeclareOptionX{style}[]{\lstset{style=#1}} \ProcessOptionsX* % \end{macrocode} % \end{macro} % % Then we define the three above mentioned commands in the way, which is % described in \cite{lingnau07:_latex_hacks}. % \begin{macro}{\lstdef} % \changes{v46}{09/08/31}{enhanced the documentation} % has three parameters: % \begin{quote} % \begin{tabular}{ll} % \#1 & the identifier of the chunk of source code \\ % \#2 & the file name of the source code \\ % \#3 & the line range \\ % \end{tabular} % \end{quote} % Every parameter can be used at the user's choice, so there is no chance % to test the parameters. % \begin{macrocode} \newcommand{\lstdef}[3]{% \@namedef{lst@l@#1}##1{% \lstinputlisting[##1, linerange={#3}]{#2}}% } % \end{macrocode} % \end{macro} % % \begin{macro}{\lstcheck} % \changes{v46}{09/08/31}{enhanced the documentation} % has two parameters: % \begin{quote} % \begin{tabular}{ll} % \#1 & the identifier of the chunk of source code \\ % \#2 & the file name of a file with many |lstdef| lines \\ % \end{tabular} % \end{quote} % \changes{v45}{09/08/31}{added some checks for arguments} % \begin{macrocode} \newcommand{\lstcheck}[2]{% % \end{macrocode} % At first we test, if the identifier is unknown. If so, we read the above % mentioned file. % \begin{macrocode} \expandafter\ifx\csname lst@l@#1\endcsname\relax% \input{#2}\fi% % \end{macrocode} % Now the identifier should be known. If not, we emit a corresponding error % message. % \begin{macrocode} \expandafter\ifx\csname lst@l@#1\endcsname\relax% \PackageError{listings-ext}{undefined identifier}{% You may have mispelled the identifier, check the file% \MessageBreak\space\space\space#2\MessageBreak% for the correct spelling.}\fi% } % \end{macrocode} % \end{macro} % % \begin{macro}{\lstuse} % \changes{v46}{09/08/31}{enhanced the documentation} % has two parameters: % \begin{quote} % \begin{tabular}{ll} % \#1 & options of the |\lstinputlisting| command (optional) \\ % \#2 & the above defined identifier \\ % \end{tabular} % \end{quote} % \changes{v45}{09/08/31}{added some checks for arguments} % \begin{macrocode} \newcommand{\lstuse}[2][]{% % \end{macrocode} % At first we test, if the identifier is unknown. If so, we emit a % corresponding error message. % \begin{macrocode} \expandafter\ifx\csname lst@l@#2\endcsname\relax% \PackageError{listings-ext}{undefined identifier}{% You may have mispelled the identifier.\MessageBreak% If you go on without any change, no source code will be % included,\MessageBreak but your options will be written % into your formatted document.}\fi% % \end{macrocode} % Now we can |\lstinputlisting| the source code by use of the % |\@namedef| ed command. % \begin{macrocode} \@nameuse{lst@l@#2}{#1}% } % % \end{macrocode} % \end{macro} % That' all for the \LaTeX-side of life. % % % \changes{v46}{09/08/31}{enhanced the documentation at several points} % \changes{v45}{09/08/31}{introduced an exemplary configuration file} % \subsection{An exemplary configuration file} % \label{sec:a-configuration-file} % % It is a good practise, to format all source code chunks in the same % way. The easiest way to do that is to provide a style. The following % lines provide two styles, one for the use with a black and white % printer, the other for a printer which is capable of color output. % \begin{macrocode} %<*listings> \ProvidesFile{listings.cfg}% [2009/08/23 v1.0 listings configuration of listings-ext] \RequirePackage{xcolor} \def\lstlanguagefiles{lstlang1.sty,lstlang2.sty,lstlang3.sty} \lstset{defaultdialect=[ANSI]C, defaultdialect=[ISO]C++, defaultdialect=[95]Fortran, defaultdialect=Java, defaultdialect=[LaTeX]TeX, frame=tlb, resetmargins=false, } \lstdefinestyle{colored-code}{ backgroundcolor=\color{yellow!10},% basicstyle=\footnotesize\ttfamily,% identifierstyle=\color{black},% keywordstyle=\color{blue},% stringstyle=\color{teal},% commentstyle=\itshape\color{orange},% } \lstdefinestyle{bw-code}{ basicstyle=\small\fontfamily{lmtt}\fontseries{m}\fontshape{n}\selectfont, % instead of lmtt one should use ul9 (luximono) for boldface characters keywordstyle=\small\fontfamily{lmtt}\fontseries{b}\fontshape{n}\selectfont, commentstyle=\small\fontfamily{lmtt}\fontseries{m}\fontshape{sl}\selectfont, stringstyle=\small\fontfamily{lmtt}\fontseries{m}\fontshape{it}\selectfont, } % % \end{macrocode} % % % \changes{v16}{09/08/18}{moved the documentation of the script into the documentation} % \subsection{The shell script} % \label{sec:the-shell-script} % % \changes{v58}{10/05/18}{removed some bashisms (according to Ahmed El-Mahmoudy---aelmahmoudy\_at\_sabily.org)} % \changes{v37}{09/08/27}{removed small glitches} % \changes{v23}{09/08/20}{moved some more comment from the script into the documentation} % \changes{v12}{09/05/12}{added some debug code} % \changes{v11}{09/04/15}{added some documentation} % \changes{v09}{09/04/05}{added some space for a better layout} % \changes{v05}{08/03/04}{add a debug option for the script} % \changes{v05}{08/03/04}{change the behaviour: hyphens and underscores are removed in % the .lst-file} % \changes{v05}{08/03/04}{check the correct grouping of be...ee} % \changes{v05}{08/03/04}{function delete\_underscore renamed to "replace\_characters"} % \changes{v05}{08/03/04}{better error processing with messages to stderr} % \changes{v05}{08/03/04}{in replace\_characters now also hyphens are replaced} % \changes{v05}{08/03/04}{introduced function print\_error} % \changes{v05}{08/03/04}{introduced function break\_line} % \changes{v03}{08/02/27}{corrected the on-line help according to the current implementation} % \changes{v03}{08/02/27}{changed documentation and behaviour of function print\_header} % \changes{v03}{08/02/27}{fixed some typos} % \changes{v03}{08/02/27}{output option now has an optional argument} % \changes{v03}{08/02/27}{call of print\_header changed according to the % optional argument from above} % \changes{v06}{08/09/07}{created list of things to do} % To get full benefit of the three above introduced commands, we provide a % Bash-script, which internally uses |awk|, |grep| and |sed|. A Perl % programmer could provide the same functionality by a Perl script. % % \begin{macrocode} %<*scriptfile> #! /bin/sh ### listings-ext.sh --- ## Author: Dr. Jobst Hoffmann ## Version: $Id: listings-ext.dtx 67 2010-06-29 16:38:12Z ax006ho $ ## Keywords: LaTeX, listings ## Copyright: (C) 2008-2010 Jobst Hoffmann, ##------------------------------------------------------------------- ## ## This file may be distributed and/or modified under the ## conditions of the LaTeX Project Public License, either version 1.2 ## of this license or (at your option) any later version. ## The latest version of this license is in: ## ## http://www.latex-project.org/lppl.txt ## ## and version 1.2 or later is part of all distributions of LaTeX ## version 1999/12/01 or later. ## ## This file belongs to the listings-ext package. ## ## listings-ext.sh creates code to be inserted into a ## LaTeX file from a source file. ## ## The commented code can be seen in listings-ext.pdf, which is provided ## with the distribution package. % \end{macrocode} % % The format of the result is depending on a switch \verb!-c|--command!: % \begin{itemize} % \item If the switch is set, the result is a single file which can be % |\input| into LaTeX code. The file contains lines of the form % \begin{quote} % |\lstdef{|\meta{identifier}|}{|\meta{filename}|}{|\meta{linerange(s)}|}| % \end{quote} % \meta{identifier} can be used in the \LaTeX{} code by a command % \begin{quote} % |\lstuse{|\meta{identifier}|}| % \end{quote} % to |\lstinputlisting| the source code at that place. % \meta{identifier} is derived from the filename of the source file, % where there is a sequence of uppercase letters (A, B, \ldots{}, Z, % BA, \ldots{}) appended as postfix to distinguish between several % chunks. If we are in join mode --- see below ---, there will be no % postfix at all. You have to be careful with the filenames: as the % identifiers are used as \TeX{}-commands, the have to consist only of % characters, but the script allows underscores and hyphens in the % filenames and translates them into a camel case notation. % \item If the switch is not set, a piece of LaTeX code like the % following is generated for every chunk of source code: %\begin{verbatim} % %===>begin{listingsExtExmplAC} % {% % \def\inputfile{% % /home/xxx/texmf/source/latex/listings-ext% % /listings-ext_exmpl_a.java % } % \ifLecture{% % \lstdefinestyle{localStyle}{% % caption={\lstinline|listings-ext_exmpl_a.java|: using the resource bundle} % }% % } % {% % \lstdefinestyle{localStyle}{% % title={\lstinline|listings-ext_exmpl_a.java|: using the resource bundle} % }% % } % \lstinputlisting[style=localStyle, linerange={29-30}]% % {% % \inputfile % } % }% % % =====>end{listingsExtExmplAC} % \end{verbatim} % \end{itemize} % % The source file contains pairs of lines of the form described by the % following regular expressions: % \begin{itemize} % \item |^\ +|\meta{endline-comment-character(s)}|\ be: |\meta{string}|$| % % This expression defines the beginning of a environment, which should be % |\lstinput| into the document. % \item |^\ +|\meta{endline-comment-character(s)}|\ ee: |\meta{string}|$| % % This expression defines the end of that environment. % \end{itemize} % % Another line can preceed all pairs: % \begin{quote} % |\ +|\meta{endline-comment-character(s)}|\ ce: |\meta{list of keywords} % \end{quote} % % \meta{list of keywords} is a comma separated list of words, the first one % must be one of the words % \begin{itemize} % \item |join| % \item |combine| % \end{itemize} % % At the moment we support only these keywords. The meaning of the % keywords is % \begin{itemize} % \item |join|: we generate lines, which print the listing as one part % \item |combine|: we generate lines, which print the listing as one part, only % for headings, which correspond % \end{itemize} % % These lines will be grepped. The result is processed by |awk| where '|:|' is % defined as a field separator, the final result is a range of lines, which % is further processed to create the output. % \changes{v56}{10/03/09}{a new usage description, added new option "-e"} % \changes{v33}{09/08/23}{corrected description of usage of the script} % \begin{macrocode} ERR_HELP=1 ME=$(basename $0) USAGE="usage:\n\t${ME} [-c|--command] [-e|--ext] [-g|--debug] \\\\\n\ \t\t[-h|--help] [-n|--no-header] \\\\\n\ \t\t[{-o|--output-file} []] , ...\n\ \t-c:\tgenerate commands, which can be input and later used by\n\ \t\t\\\\lstuse, optional\n\ \t-e:\tinclude file name extension into the identifier\n\ \t-g:\tdebug mode, create some additional output, optional\n\ \t-h:\tshow this help, optional\n\ \t-n:\twrite no header into the LaTeX code, optional; valid only,\n\ \t\tif -c isn't used\n\ \t-o []: if this argument is present, the output will\n\ \t\tbe written into a file ; if the\n\ \t\t is omitted, the output is redirected\n\ \t\tinto a file with a basename corresponding to the name\n\ \t\tof the current directory, it has an extension of \".lst\".\n\ " DEBUG_MODE=0 EXTENSION=0 HEADER=1 show_usage() { # display help massage printf "${USAGE}" exit ${ERR_HELP} } % \end{macrocode} ^^A $ % \changes{v11}{09/04/15}{corrected generation of filename for .lst-output file} % \changes{v09}{09/04/05}{changed the documentation of the function % print\_header} % We define some functions for the internal use. The first one prints the % header of the output file, it has two arguments: % \begin{itemize} % \item \$1: file name---the name of the file to be written on % \item \$2: directory - the last name in the directory path (currently % not used) % \end{itemize} % \changes{v63}{10/06/22}{replaced most of the echo commands by printf (because of Mac OS X)} % \changes{v53}{10/03/09}{issue solved: now able to handle any file name as % list of source files} % \begin{macrocode} print_header() { FILE=$1 printf "%%%% -- file $1 generated on $(date) by ${ME}\n" FILE=$(echo $(basename $1 .lst) | sed -e s/[_\-]//g) printf "\\\\csname ${FILE}LstLoaded\\\\endcsname\n" printf "\\\\expandafter\\\\let\\\\csname ${FILE}LstLoaded\\\\endcsname\\\\endinput\n" } % \end{macrocode} ^^A $ % The main function is |do_the_job|. It accepts the following parameter: % \begin{enumerate} % \item \$1: a filename % \end{enumerate} % \begin{macrocode} do_the_job() { % \end{macrocode} ^^A $ % In |awk| \$0 refers to the whole input record---to the current input % line---, so that element could be split into its components which are % marked by '/', the result is the name of the current directory without % any path elements stored in an array %\begin{verbatim} % PATHCOMPONENT=$(pwd | \ % awk -F : '{n = split($0, text, "/"); print text[1] text[n]}') %\end{verbatim} % % The current implementation uses the whole path, it will be split into its % parts when it is used. % \begin{macrocode} PATHCOMPONENT=$(pwd) SOURCEFILE=$1 if [ ! -f ${SOURCEFILE} ] then printf "${SOURCEFILE} is no valid file\n" return $ERR_NOFILE fi % \end{macrocode} ^^A $ % \changes{v12}{09/05/12}{added support for ant: filenames are given complete with the path} % If the script is called with the full path of the files, the directory % part must be cut off from filename % \begin{macrocode} SOURCEFILE=${SOURCEFILE##${PATHCOMPONENT}/} % \end{macrocode} ^^A $ % \changes{v65}{10/06/28}{grep: replaced blank by space regex} % \changes{v51}{10/03/33}{corrected the grep expression according to the definition of the syntax} % From the current source file, we grep all the lines with the above % mentioned pattern, prepend them by a line number (parameter |-n|) % \begin{macrocode} grep -n "^[[:space:]]*[/%;#!][/\* ;][[:space:]]*[cbe]e:" $1 | \ % \end{macrocode} ^^A $ % We pass all the lines to |awk|. Additionally we set some parameters and define % the field separator by |-F| as "|:|", so that from |awk|'s point of view % the lines consist of three parts: % \begin{enumerate} % \item the line number % \item the opening/closing tag % \item an identifying string % \end{enumerate} % \changes{v56}{10/03/09}{a cleaner handling of passing parameters to awk} % \begin{macrocode} awk -v pathcomponent="${PATHCOMPONENT}" -v file="${SOURCEFILE}" \ -v header="${HEADER}" -v command="${COMMAND}" -v application="${ME}" \ -v debugmode="${DEBUG_MODE}" -v respect_extension="${EXTENSION}"\ -F : \ ' BEGIN { % \end{macrocode} ^^A $ % \changes{v09}{09/04/05}{reflect the introduction of the command combine} % We start the code with some settings. % In |awk| the value 1 means "true", the value 0 "false". % \begin{macrocode} is_opened = 0; initialised = 0; configured = 0; join = 0; combine = 0; idChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" split(idChar, idArray, "") idPt = 0 linerange = ""; linelen = 75; # length of the output line addchars = 8; # number of additional characters like %, > or so if ( debugmode ) printf("path: %s\n", pathcomponent) > "/dev/stderr" if ( debugmode ) printf("file: %s\n", file) > "/dev/stderr" % \end{macrocode} % For |\lstinputting| the file, we need the absolute filepath. In the % following, we construct this, the correspondent variable is |inputfile|, % the filename to be formatted is split into convenient pieces by a % macro % \changes{v63}{10/06/22}{rewrote code for splitting paths into names} % \begin{macrocode} n = split(pathcomponent, partsa, "/"); curr_dir = parts[n] % \end{macrocode} % \changes{v65}{10/06/28}{breaking of lines moved into a single place} % Add the file to the array to process the whole name in a similar manner. % \begin{macrocode} n++; partsa[n] = file; inputfile = "/" partsa[2]; for ( i = 3; i <= n; i++ ) { inputfile = inputfile "/" partsa[i]; } if ( debugmode ) printf("inputfile: %s\n", inputfile) > "/dev/stderr" % \end{macrocode} % For the identification of the several chunks we need the filename % without path and without suffix. We take everything behind the last % dot as suffix % % \changes{v65}{10/06/28}{moved single \{ from beginning of line to end of previous line} % The |identifier| mustn't contain any path parts of the filename. So we % split the filename here. % \begin{macrocode} n = split(file, partsa, "/") n = split(partsa[n], partsb, ".") identifier = partsb[1] for ( i = 2; i < n; i++ ) { identifier = identifier partsb[i] } % \end{macrocode} % If there are files with the same basename, but different extensions, we % may take account of the extensions. % \changes{v56}{10/03/09}{added processing of option "-e"} % \begin{macrocode} if ( respect_extension ) { identifier = identifier partsb[n] } identifier = replace_characters(identifier) if ( debugmode ) printf("identifier: %s\n", identifier) > "/dev/stderr" } % \end{macrocode} % The following code will be executed for every line, the standard delimiter is ":" % \begin{macrocode} { % \end{macrocode} % \changes{v09}{09/04/05}{test external (LaTeX-)documentation of the code} % |$0| is the whole line, |$NF| the text, which is used in combine mode as % identifier not only for the beginning and ending of a chunk but also for % collecting all the chunks. % \begin{macrocode} if ( debugmode ) print $0 > "/dev/stderr" if ( !initialised ) { % \end{macrocode} ^^A $ % \changes{v67}{10/06/29}{added remark about CR and LF} % \changes{v09}{09/04/05}{extend the external documentation} % In the beginning, there are two cases to distinguish: % \begin{enumerate} % \item There is an introducing |ce| marker % \item There is no introducing |ce| marker % \end{enumerate} % In the first case we have to set a flag according to the value of the % mark, in the second case we have to look for the first mark (|be| or % |ce|). The marker is supposed to end at the line's end. If a \LaTeX{} % source file is created with an editor, which creates the CRLF combination % as the end of line, the CR would be thought as part of the marker. To % avoid the trouble, the CR is removed (if it exists). % \changes{v65}{10/06/28}{added code to remove spurious carriage return character} % \begin{macrocode} if ( match($2, /ce/) > 0 ) { n = split($(NF), text, ","); if ( match(text[1], "join") ) { join = 1; } else if ( match(text[1], "combine") ) { combine = 1; } } else if ( match($2, /be/) > 0 ) { opening_tag = $(NF) gsub(/\r/, "", opening_tag); is_opened = 1 start = $1 + 1; # entry $1 is the line number } else if ( match($2, /ee/) > 0 ) { print_error($1, "missing \"be\" declaration") } initialised = 1; } else { tag = $(NF) if ( match($2, /be/) > 0 ) { if ( is_opened ) { print_error($1, "incorrect grouping, previous group"\ " not closed") } else { opening_tag = $(NF) gsub(/\r/, "", opening_tag); is_opened = 1 start = $1 + 1; # entry $1 is the line number } } else { if ( match($2, /ee/) > 0 ) { closing_tag = $(NF) gsub(/\r/, "", closing_tag); if ( !is_opened ) { print_error($1, "missing \"be\" declaration") } else if ( opening_tag == closing_tag ) { is_opened = 0 % \end{macrocode} ^^A $ % \changes{v65}{10/06/28}{changed the prefix to a double \% to unify the output} % We found the correct end of the environment, now we prepare the output entries % \begin{macrocode} split($(NF), text, "*"); # omit a trailing comment sub(/ /, "", text[1]); # delete leading spaces gsub(/"/, "", text[1]); if ( index(text[1], "_") > 0 ) gsub(/_/, "\\_", text[1]); caption = "\\lstinline|" file "|: " text[1] # setup the prefixes len = linelen - addchars - length(caption); begin_prefix = "%%"; cnt = 0; while ( cnt < len) { begin_prefix = begin_prefix "="; cnt++; }; begin_prefix = begin_prefix ">"; end_prefix = begin_prefix; sub(/%%/, "%%==", end_prefix); % \end{macrocode} ^^A $ % \changes{v09}{09/04/05}{rewrote the check of the flags} % Now we distinguish between |join|- and |combine|-mode and the default mode: % \begin{macrocode} if ( join ) { % \end{macrocode} ^^A $ % In |join|-mode we have to collect all informations about chunks into one % linerange, this is done by % \begin{macrocode} linerange = linerange ", " start "-" $1-1; } else if ( combine ) { % \end{macrocode} ^^A $ % \changes{v11}{09/04/15}{rewrote some code for adding the combine mode} % In combine mode we need the whole tag but without leading or trailing % blanks, so we delete leading spaces. % \begin{macrocode} sub(/ /, "", closing_tag) if ( combine_array[closing_tag] == "" ) { combine_array[closing_tag] = start "-" $1-1 } else { combine_array[closing_tag] = \ combine_array[closing_tag] ", " start "-" $1-1 } if ( debugmode ) printf("combine_array: >%s<\n",\ combine_array[closing_tag]) > "/dev/stderr" } else { % \end{macrocode} ^^A $ % We are neither in |combine|- nor in |join|-mode, so we can print out the % separate linechunks directly. % % The line range for a separated chunk is calculated by % \begin{macrocode} linerange = start "-" $1-1; if ( command ) { print_command(\ (identifier toB26(idPt++)), \ linerange); } else { print_linerange(\ (identifier toB26(idPt++)), \ caption, linerange); } } } else if ( opening_tag != closing_tag ) { print_error($1, "opening and closing tags differ") } else { print_error($1, "unknown error") } } } } } END { % \end{macrocode} ^^A $ % There may be an erroneous open group, this is announced now. % \changes{v56}{10/03/09}{added handling of missing "ee" declarations} % \begin{macrocode} if ( is_opened ) { print_error($1, "missing \"ee\" declaration") } % \end{macrocode} ^^A $ % And now for the post processing \ldots % \begin{macrocode} caption = "\\lstinline|" file "|"; if ( join ) { sub(/, /, "", linerange); if ( command ) { print_command(identifier, linerange); } else { caption = "\\lstinline|" file "|"; print_linerange(identifier, caption, linerange); } } else if ( combine ) { for ( range in combine_array ) { % \end{macrocode} ^^A $ % In combine mode we prefix the |\lstdef|-command by the tag to make the % association easier. % \begin{macrocode} if ( debugmode ) printf("range: %s, combine_array[range]: >%s<\n", \ range, combine_array[range]) > "/dev/stderr" printf("%%%%-->> %s <<--\n", range) if ( command ) { print_command((identifier toB26(idPt++)), \ combine_array[range]); } else { print_linerange((identifier toB26(idPt++)), caption, \ combine_array[range]); } } } } % \end{macrocode} ^^A $ % % \changes{v25}{09/08/21}{corrected some leading spaces before the beginning % percent sign of a line} % Finally there are some helper functions. We start with % |replace_characters|. It replaces characters that are not allowed in % \TeX-commands like "\_", "\.-" from an identifier and turns % it into camel case notation. Its arguments are: % \begin{enumerate} % \item |identifier|---the identifier with underscore characters % \end{enumerate} % \begin{macrocode} function replace_characters(identifier) { tmp = "" toUppercase = 0 n = split(identifier, sequence, "") # split the string into an array # of single characters for ( i = 1; i <= n; i++ ) { if ( (sequence[i] == "_") || (sequence[i] == "-") ) { toUppercase = 1 } else { if ( toUppercase ) { cTmp = toupper(sequence[i]) tmp = (tmp cTmp) toUppercase = 0 } else { tmp = (tmp sequence[i]) } } } return tmp } % \end{macrocode} % % |print_command| generates the |\lstdef|-line. Its arguments are: % \begin{enumerate} % \item |identifier|---the identifier, which can be used in the % \LaTeX-source to format a range of lines. % \item |linerange|---a linerange or a list of line ranges (in join or % combine mode) % \end{enumerate} % \begin{macrocode} function print_command(identifier, linerange) { if ( debugmode ) printf("print_command.linerange: >%s<\n", linerange) > "/dev/stderr" print break_line("\\lstdef{" identifier "}{" inputfile "}{" \ linerange "}", linelen) } % \end{macrocode} % % \changes{v65}{10/06/28}{added print\_break function call to print\_linerange} % |print_linerange| does something similar: instead of defining an identifier it % prints out a bunch of lines, which can be pasted into the % \LaTeX-source. Its arguments are % \begin{enumerate} % \item |identifier|---the identifier, an environment which has to be % defined in advance % \item |caption|---title or caption, taken either from surrounding % environment or from the file name (in join mode) % \item |linerange|---a linerange or a list of line ranges (in join or % combine mode) % \end{enumerate} % \begin{macrocode} function print_linerange(identifier, caption, linerange) { print break_line(begin_prefix "begin{" \ identifier"}\n{%\n \\def\\inputfile{%\n " inputfile "%\n }"); local_style = ""; if ( header ) { print " \\ifLecture{%\n \\lstdefinestyle{localStyle}{%\n " \ "caption={" caption"}\n }%\n }\n {%\n" \ " \\lstdefinestyle{localStyle}{%\n" \ " title={" caption "}\n }%\n }"; local_style="style=localStyle, " } print " \\lstinputlisting[" local_style "linerange={" linerange "}]" \ "{%\n \\inputfile\n }\n" \ "}%\n" end_prefix "end{"identifier"}"; } % \end{macrocode} % % |print_error| prints out errors to stderr. Its arguments are % \begin{enumerate} % \item |linenumber|---the number of the line/record where the error happens % \item |error_message|---the error message % \end{enumerate} % \begin{macrocode} function print_error(linenumber, error_message) { printf "%--> error (line number %d): %s\n", \ linenumber, error_message > "/dev/stderr" } % \end{macrocode} % % |break_line| breaks a (long) line into parts, which each have a length less % than a given line length. Its arguments are: % \begin{enumerate} % \item |input_line|---the line to bwe broken % \item |line_len|---the target length % \end{enumerate} % |input_line| may contain line breaks, so the results may look odd. % \begin{macrocode} function break_line(input_line, line_len) { n = split(input_line, parts, "/"); output_line = parts[1]; len_curr = length(output_line) for ( i = 2; i <= n; i++ ) { len_next = length(parts[i]) if ( len_curr + len_next + 1 < linelen ) { output_line = output_line "/" parts[i]; len_curr += len_next + 1 # continue current line } else { output_line = output_line "%\n /" parts[i]; len_curr = len_next + 7 # start a new line } } return output_line } % \end{macrocode} % % \changes{v27}{09/08/21}{changed the conversion algorithm} % \changes{v25}{09/08/21}{changed the numbering of chunks by introducing the function % toB26} % |toB26| converts its integer argument into a number with the base % of 26, the number's digits are upper case characters. Its arguments are: % \begin{enumerate} % \item |n10|---the number to convert (base 10) % \end{enumerate} % \begin{macrocode} function toB26(n10) { v26 = "" do { remainder = n10%26 v26 = idArray[remainder+1] v26 n10 = int(n10/26) } while ( n10 != 0 ) return v26 } ' return $? } if [ $# -eq 0 ] then show_usage fi % \end{macrocode} % Processing the options is done by means of getop, see |man getopt| % \begin{macrocode} GETOPT=$(getopt -o ceghno:: \ --longoptions command,debug-mode,ext,help,no-header,output-file:: \ -n ${ME} -- "$@") if [ $? -ne 0 ] # no success then show_usage fi eval set -- "$GETOPT" while true do case "$1" in -c|--command) COMMAND=1; HEADER=0; shift;; -e|--ext) EXTENSION=1; shift;; -g|--debug-mode) DEBUG_MODE=1; shift;; -h|--help) show_usage ;; -n|--no-header) HEADER=0; shift;; -o|--output-file) % \end{macrocode} % |o| has an optional argument. As we are in quoted mode, an empty % parameter will be generated if its optional argument is not found. % \begin{macrocode} case "$2" in "") OUTFILE=$(basename $(pwd)).lst; shift 2 ;; *) OUTFILE=$2; shift 2 ;; esac ;; --) shift ; break ;; *) show_usage ;; esac done % \end{macrocode} % If the output-file is set, redirect output to it's value. % \begin{macrocode} if [ -n "${OUTFILE}" ] then if [ -f "${OUTFILE}" ] then printf "%s\n" "%--> file \"${OUTFILE}\" already exists, creating backup" mv ${OUTFILE} ${OUTFILE}~ fi exec > ${OUTFILE} # redirect stdout to ${OUTFILE} CURR_DIR=$(basename $(pwd)) print_header ${OUTFILE} ${CURR_DIR} fi # now take all remaining arguments (should be all filenames) and do the job for arg do printf "%s\n" "%%--> processing file \"$arg\"" 1>&2 # echo the current # filename to stderr do_the_job $arg done ### listings-ext.sh ends here % % \end{macrocode} ^^A $ % % % \subsection[Example/Test Files]{Example and Test Files For Testing The Macros} % \label{sec:example-files} % % In this section there are introduced some examples of source code files % (C, Fortran and Java) and corresponding test files to show the behaviour % of the package and the script. % % % \subsubsection{A Small Java-Example With Correct Grouping} % \label{sec:small-java-example-correct} % % The correct (Java) source file is % \begin{macrocode} %<*example1> package application.helloworld; // be: packages import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle; // ee: packages /** * HelloWorld.java */ public class HelloWorld { // be: specific constructor public HelloWorld() { System.out.println("Object HelloWorld created"); } // end of specific constructor "HelloWorld()" // ee: specific constructor public static final void main(final String[] args) { String baseName = "HelloWorld"; // be: using the resource bundle ResourceBundle rb = ResourceBundle.getBundle(baseName); String greetings = rb.getString("hello_msg"); // ee: using the resource bundle System.out.printf("%s\n", greetings); } // end of method "main(String[] args)" } // end of class "HelloWorld" % % \end{macrocode} % We have two correct groups, the output for |-c| should contain % two lines like %\begin{verbatim} %\lstdef{listingsExtTestAA}{/home/xxx/texmf/source/latex% % /listings-ext/listings-ext_test_a.java}{3-5} %\lstdef{listingsExtTestAB}{/home/xxx/texmf/source/latex% % /listings-ext/listings-ext_test_a.java}{20-22} %\lstdef{listingsExtTestAC}{/home/xxx/texmf/source/latex% % /listings-ext/listings-ext_test_a.java}{29-30} %\end{verbatim} % % A small \LaTeX-file to test this case is % % \begin{macrocode} %<*test1> \documentclass[a4paper,12pt]{article} \usepackage[T1]{fontenc} \usepackage{listings-ext} \begin{document} \input{listings-ext.lst} \lstuse[style=bw-code, language=Java]{listingsExtExmplAC} \end{document} % % \end{macrocode} % % % \subsubsection{Small Java-Examples With Wrong Initialisation or Ending} % \label{sec:small-java-example-wrong-initialisation} % % In the following Java source code the initial tag \verb*-be: - is % missing. Processing the file by |listings-ext.sh| must give an % appropriate error message. % \begin{macrocode} %<*example2> // ee: package declaration package application.helloworld; // ee: package declaration import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle; /** * HelloWorld.java */ public class HelloWorld { // be: specific constructor public HelloWorld() { System.out.println("Object HelloWorld created"); } // end of specific constructor "HelloWorld()" // ee: specific constructor public static final void main(final String[] args) { String baseName = "HelloWorld"; ResourceBundle rb = ResourceBundle.getBundle(baseName); String greetings = rb.getString("hello_msg"); System.out.printf("%s\n", greetings); } // end of method "main(String[] args)" } // end of class "HelloWorld" % % \end{macrocode} % % \changes{v56}{10/03/09}{added test case for missing "ee" declarations} % In the following Java source code the closing tag \verb*-ee: - is % missing. Processing the file by |listings-ext.sh| must give an % appropriate error message. % \begin{macrocode} %<*example3> package application.helloworld; import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle; /** * HelloWorld.java */ public class HelloWorld { // be: specific constructor public HelloWorld() { System.out.println("Object HelloWorld created"); } // end of specific constructor "HelloWorld()" // ee: specific constructor // be: the main method public static final void main(final String[] args) { String baseName = "HelloWorld"; ResourceBundle rb = ResourceBundle.getBundle(baseName); String greetings = rb.getString("hello_msg"); System.out.printf("%s\n", greetings); } // end of method "main(String[] args)" } // end of class "HelloWorld" % % \end{macrocode} % % \subsubsection{A Small Java-Example With Correct Grouping} % \label{sec:small-java-example-correct} % % \changes{v58}{10/05/18}{corrected example 4} % \begin{macrocode} %<*example4> package application.helloworld; // be: packages import java.util.Locale; import java.util.MissingResourceException; import java.util.ResourceBundle; // ee: packages // be: introductory comment /** * HelloWorld.java * * *
* Created: : 2007/04/12 11:24:48$ * * @author N.N. * @version : 0.0$ */ // ee: introductory comment // be: class declaration public class HelloWorld // ee: class declaration { // be: specific constructor public HelloWorld() { System.out.println("Object HelloWorld created"); } // end of specific constructor "HelloWorld()" // ee: specific constructor public static final void main(final String[] args) { String baseName = "HelloWorld"; // ee: using the resource bundle ResourceBundle rb = ResourceBundle.getBundle(baseName); String greetings = rb.getString("hello_msg"); // ee: using the resource bundle System.out.printf("%s\n", greetings); } // end of method "main(String[] args)" } // end of class "HelloWorld" % % \end{macrocode} % % \changes{v11}{09/04/15}{added a test for combine mode} % \subsubsection{A Small Java-Example With Correct Grouping, Showing the % Combine Mode} % \label{sec:java-combine} % % We have two correct groups, |ce| at the beginning of the file sets the % combine mode, so the output for |-c| should contain three lines like %\begin{verbatim} %\lstdef{listingsExtTestDA}{/home/xxx/texmf/source/latex% % /listings-ext/listings-ext_test_a.java}{12-13, 29-29} %\lstdef{listingsExtTestDB}{/home/xxx/texmf/source/latex% % /listings-ext/listings-ext_test_a.java}{16-19} %\lstdef{listingsExtTestDC}{/home/xxx/texmf/source/latex% % /listings-ext/listings-ext_test_a.java}{23-26} %\end{verbatim} % % \begin{macrocode} %<*example5> // ce: combine /** * HelloWorld.java // be: the class public class HelloWorld { // ee: the class // be: specific constructor public HelloWorld() { System.out.println("Object HelloWorld created"); } // end of specific constructor "HelloWorld()" // ee: specific constructor // be: main method public static final void main(final String[] args) { HelloWorld h = new HelloWorld(); } // end of method "main(String[] args)" // ee: main method // be: the class } // end of class "HelloWorld" // ee: the class % % \end{macrocode} % % The result of the call |listings-ext.sh -c -o listings-ext_test_d.java| % must contain the lines % \begin{verbatim} % %-->> main method <<-- % \lstdef{listingsExtExmplDA}{/home/ax006ho/TeX/texmf/source/latex% % /listings-ext% % /listings-ext_exmpl_d.java}{16-19} % %-->> the class <<-- % \lstdef{listingsExtExmplDB}{/home/ax006ho/TeX/texmf/source/latex% % /listings-ext% % /listings-ext_exmpl_d.java}{5-6, 22-22} % %-->> specific constructor <<-- % \lstdef{listingsExtExmplDC}{/home/ax006ho/TeX/texmf/source/latex% % /listings-ext% % /listings-ext_exmpl_d.java}{9-12} % \end{verbatim} % % So a small \LaTeX-file to test this case is % % \begin{macrocode} %<*test2> \documentclass[a4paper,12pt]{article} \usepackage[T1]{fontenc} \usepackage[style=colored-code]{listings-ext} \begin{document} \lstcheck{listingsExtExmplDC}{listings-ext.lst} \lstuse[language=Java]{listingsExtExmplDC} \end{document} % % \end{macrocode} % % % \changes{v16}{09/08/18}{enhanced the .el-file} % \subsection[AUC\TeX{} Style file]{Style file for AUC\TeX{} to ease the % Editing with \XEmacs{}} % \label{sec:AUCTeX} % % \XEmacs{} and the package AUC\TeX{} % (\url{http://www.gnu.org/software/auctex/}) form a powerful tool for % creating and editing of \TeX/\LaTeX{} files. If there is a suitable % AUCTeX style file for a \LaTeX{} package like the hereby provided % \listingsextSty{} package, then there is support for many common % operations like creating environments, inserting macros, prompting for % arguments and so on. The following elisp code provides such a style % file; it must be copied to a place, where \XEmacs{} can find it after its % creation.% % % This file is still in a development phase, i.\,e. one can work with it, % but there is a couple of missing things as for example font locking or % the automatic insertion of \cs{switch} commands according to the user's % input. % % \begin{macrocode} %<*auctex> ;;; listings-ext.el --- AUCTeX style for `listings-ext.sty' ;; Copyright (C) 2008-2010 Free Software Foundation, Inc. ;; Maintainer: Jobst Hoffmann, ;; $Author: ax006ho $ ;; $Date: 2010-06-29 18:38:12 +0200 (Di, 29 Jun 2010) $ ;; $Revision: 67 $ ;; Keywords: tex ;;; Commentary: ;; This file adds support for `listings-ext.sty' ;;; Code: (TeX-add-style-hook "listings-ext" (lambda () (TeX-add-symbols '("lstcheck" "identifier" TeX-arg-input-file 0) '("lstdef" "identifier" TeX-arg-input-file "line range" 0) '("lstuse" ["options"] "identifier"0)) ;; Filling ;; Fontification (when (and (featurep 'font-latex) (eq TeX-install-font-lock 'font-latex-setup)) (add-to-list 'font-latex-match-function-keywords-local "lstcheck") (add-to-list 'font-latex-match-function-keywords-local "lstdef") (add-to-list 'font-latex-match-function-keywords-local "lstuse") (font-latex-match-function-make) ;; For syntactic fontification, e.g. verbatim constructs (font-latex-set-syntactic-keywords) ;; Tell font-lock about the update. (setq font-lock-set-defaults nil) (font-lock-set-defaults)))) ;; preparing of environments isn't necessary ;; support for options (defvar LaTeX-listings-ext-package-options nil "Package options for the listings-ext package.") ;;; listings-ext.el ends here. % % \end{macrocode} % % % \changes{v50}{10/02/15}{small changes to the Makefile: main documentation now in .pdf-format} % \changes{v47}{09/08/31}{removed unnecessary files from the distribution} % \changes{v45}{09/08/31}{some small corrections for the test files} % \changes{v41}{09/08/27}{Makefile: removed TODO from the distributed tar-file} % \changes{v38}{09/08/27}{Makefile: corrected the examples-part} % \changes{v33}{09/08/23}{Makefile: now all targets are described} % \changes{v33}{09/08/23}{Makefile: mirrored the move from rcs to subversion} % \changes{v33}{09/08/23}{Makefile: introduced implicit rules} % \changes{v33}{09/08/23}{Makefile: removed some small glitches} % \changes{v16}{09/08/18}{better documentation of the Makefile} % \changes{v16}{09/08/18}{removed unnecessary code from the Makefile} % \changes{v16}{09/08/18}{corrected small glitches in the Makefile} % \subsection[Makefile]{% % Makefile for the automated generation of the documentation and tests % of the \listingsextSty} % \label{sec:Makefile} % % Working with \ext{.dtx}-packages is much easier, if there is a tool % for the automated processing of the mean steps like formatting or % unpacking. For systems based on Unix/Linux one can implement that with % |make| and a an adequate |Makefile|. Here the |Makefile| is integrated % into the documentation, the special syntax with tabulator characters is % generated by a short program, which is shown below. Using the |Makefile| % isn't explained here, the experienced user can get this information % directly from the |Makefile|. % % \changes{v03}{08/02/27}{remove the intermediate PostScript file after % generating the .pdf-output from it} % \begin{macrocode} %<*makefile> #----------------------------------------------------------------------- # Purpose: generation of the documentation of the listings-ext package # Notice: this file can be used without any change only with dmake and # the option "-B", this option lets dmake interpret the leading # spaces as distinguishing characters for commands in the make # rules. # The necessary changes for the common make can be applied by # the script listings-ext.makemake # # Rules: # - all: generate all the files and the basic # documentation # - develop: generate the documentation with revision # - develop-pdf: history and source code (the latter provides # a .pdf file as output) # - history: generate the documentation with revision # - history-pdf: history (the latter provides a .pdf file as # output) # - examples: format the examples # - install: install the package in a standard TDS tree # - uninstall: uninstall the package from a standard TDS # tree # - clean: clean the directory of intermediate files # - clean-examples: example and test files # - clean-support: support files # - realclean: all but the pure source # files # - tar-src: create a gzipped .tar-file of the pure # source files # - tar-dist: create a gzipped .tar-file containing # version information # # Author: Jobst Hoffmann, Fachhochschule Aachen, Campus Juelich # $Date: 2010-06-29 18:38:12 +0200 (Di, 29 Jun 2010) $ #----------------------------------------------------------------------- # The texmf-directory, where to install new stuff (see texmf.cnf) # If you don't know what to do, search for directory texmf at /usr. # With teTeX and linux often one of following is used: #INSTALLTEXMF=/usr/TeX/texmf #INSTALLTEXMF=/usr/local/TeX/texmf #INSTALLTEXMF=/usr/share/texmf #INSTALLTEXMF=/usr/local/share/texmf # user tree: #INSTALLTEXMF=$(HOME)/texmf # Try to use user's tree known by kpsewhich: INSTALLTEXMF=`kpsewhich --expand-var '$$TEXMFHOME'` # Try to use the local tree known by kpsewhich: #INSTALLTEXMF=`kpsewhich --expand-var '$$TEXMFLOCAL'` # But you may set INSTALLTEXMF to every directory you want. # Use the following, if you only want to test the installation: #INSTALLTEXMF=/tmp/texmf # If texhash must run after installation, you can invoke this: TEXHASH=texhash # change this to the directory which contains the graphic files GRAPHICPATH=. ######### Edit the following only, if you want to change defaults! # The directory, where to install *.cls and *.sty CLSDIR=$(INSTALLTEXMF)/tex/latex/jhf/$(PACKAGE) # The directory, where to install documentation DOCDIR=$(INSTALLTEXMF)/doc/latex/jhf/$(PACKAGE) # The directory, where to install the sources SRCDIR=$(INSTALLTEXMF)/source/latex/jhf/$(PACKAGE) # The directory, where to install demo-files # If we have some, we have to add following 2 lines to install rule: # $(MKDIR) $(DEMODIR); \ # $(INSTALL) $(DEMO_FILES) $(DEMODIR); \ DEMODIR=$(DOCDIR)/demo # We need this, because the documentation needs the classes and packages # It's not really a good solution, but it's a working solution. TEXINPUTS := $(PWD):$(TEXINPUTS) # To generate the version number of the distribution from the source VERSION_L := latex getversion | grep '^VERSION' VERSION_S := `latex getversion | grep '^VERSION' | \ sed 's+^VERSION \\(.*\\) of .*+\\1+'` ######################################################################## # End of customization section ######################################################################## # formatting tools BIBTEX = bibtex DVIPS = dvips LATEX = latex PDFLATEX = pdflatex TEX = tex PS2PDF = ps2pdf # postscript viewer GV = gv # tarring options DATE = `date +%Y-%m-%d` TAR_SRC = $(PACKAGE)_$(DATE)_source.tar.gz EXsvn = --exclude .svn --exclude auto # formatting options COMMON_OPTIONS = HISTORY_OPTIONS = \RecordChanges DEVELOPER_OPTIONS = \AlsoImplementation\RecordChanges\CodelineIndex\EnableCrossrefs DEVELOPER_OPTIONS_FINAL = \AlsoImplementation\CodelineIndex\DisableCrossrefs\RecordChanges PACKAGE = listings-ext DISTRIBUTION_FILES = $(PACKAGE).pdf $(PACKAGE).dtx \ $(PACKAGE).ins README .SUFFIXES: # Delete the default suffixes .SUFFIXES: .dtx .dvi .ins .ps .pdf .sty # Define our suffix list ## Main Targets # strip off the comments from the package $(PACKAGE).sty $(PACKAGE)-test-*.tex: $(PACKAGE).ins $(PACKAGE).dtx +$(LATEX) $<; \ sh $(PACKAGE).makemake all: $(PACKAGE).dvi # generate the documentation $(PACKAGE).dvi: $(PACKAGE).dtx $(PACKAGE).sty +rm -f *.ind *.gls +$(LATEX) "\AtBeginDocument{$(COMMON_OPTIONS)}\input{$<}" +$(BIBTEX) $(PACKAGE) +$(LATEX) "\AtBeginDocument{$(COMMON_OPTIONS)}\input{$<}" +$(LATEX) "\AtBeginDocument{$(COMMON_OPTIONS)}\input{$<}" # generate the documentation with revision history history: $(PACKAGE).dtx $(PACKAGE).sty +$(LATEX) "\AtBeginDocument{$(COMMON_OPTIONS)$(HISTORY_OPTIONS)}\input{$<}" +$(BIBTEX) $(PACKAGE) +$(LATEX) "\AtBeginDocument{$(COMMON_OPTIONS)$(HISTORY_OPTIONS)}\input{$<}" +makeindex -s gind.ist $(PACKAGE).idx +makeindex -s gglo.ist -o $(PACKAGE).gls -t $(PACKAGE).glg $(PACKAGE).glo +$(LATEX) "\AtBeginDocument{$(COMMON_OPTIONS)$(HISTORY_OPTIONS)}\input{$<}" # generate the documentation for the developer develop: $(PACKAGE).dtx $(PACKAGE).sty +$(LATEX) "\AtBeginDocument{$(DEVELOPER_OPTIONS)}\input{$<}" +$(BIBTEX) $(PACKAGE) +$(LATEX) "\AtBeginDocument{$(DEVELOPER_OPTIONS)}\input{$<}" +makeindex -s gind.ist $(PACKAGE).idx +makeindex -s gglo.ist -o $(PACKAGE).gls -t $(PACKAGE).glg $(PACKAGE).glo +$(LATEX) "\AtBeginDocument{$(DEVELOPER_OPTIONS_FINAL)}\input{$<}" develop-pdf: develop +$(DVIPS) $(PACKAGE).dvi; \ $(PS2PDF) $(PACKAGE).ps; \ rm $(PACKAGE).ps history-pdf: history +$(DVIPS) $(PACKAGE).dvi; \ $(PS2PDF) $(PACKAGE).ps; \ rm $(PACKAGE).ps # implicit rule for generating the .pdf files %%%.pdf: %.dvi +$(DVIPS) $<; \ $(PS2PDF) $(<:.dvi=.ps); \ rm $(<:.dvi=.ps) # format the example/test files examples: sh listings-ext.sh -c -o *.java; \ for i in $(PACKAGE)*test*.tex; do \ f=$${i%.tex}; \ $(LATEX) "\nofiles\input{$$f}"; \ $(DVIPS) -o $$f.ps $$f.dvi; \ $(PS2PDF) $$f.ps; \ rm $$f.dvi $$f.ps; \ done install: $(PACKAGE).dtx $(PACKAGE).pdf [ -d $(CLSDIR) ] || mkdir -p $(CLSDIR) [ -d $(DOCDIR) ] || mkdir -p $(DOCDIR) [ -d $(SRCDIR) ] || mkdir -p $(SRCDIR) cp $(PACKAGE).sty $(CLSDIR) cp $(PACKAGE).pdf $(DOCDIR) cp $(PACKAGE).ins $(SRCDIR) cp $(PACKAGE).dtx $(SRCDIR) cp $(PACKAGE)_{exmpl,test}_* $(SRCDIR) cp README $(SRCDIR) cp THIS-IS-VERSION-$(VERSION) $(SRCDIR) uninstall: rm -f $(CLSDIR)/$(PACKAGE).sty rm -fr $(DOCDIR) rm -fr $(SRCDIR) ## Clean Targets clean: -rm -f *.aux *.dvi *.hd *.lof *.log *.lot *.tmp *.toc -rm -f *.idx *.ilg *.ind *.glg *.glo *.gls *.out -rm -f *.bbl *.blg *.bm *.brf *.hd -rm -f *.pdf *.ps -rm -f *.rel *.thm clean-examples: -rm -f $(PACKAGE)_test* $(PACKAGE)_exmpl* clean-support: -rm -f *.el *.sh -rm -f *.mk *.makemake realclean: clean clean-examples clean-support -rm -f *~ *.bib *.cfg *.sty *.tex -rm -f Makefile ### create packed files tar-src: $(MAKE) realclean @cd ..; tar $(EXsvn) -czvf $(PACKAGE)/$(TAR_SRC) $(PACKAGE) tar-dist: $(DISTRIBUTION_FILES) +rm -f THIS_IS_VERSION_* *.tgz; \ $(VERSION_L) > THIS_IS_VERSION_$(VERSION_S); \ tar cfvz $(PACKAGE)-$(VERSION_S).tgz $^ THIS_IS_VERSION_*; \ rm getversion.log % % \end{macrocode} ^^A $ % % The following line -- stripped off as |listings-ext.makemake| -- can % be used with the command % \begin{verbatim} % sh listings-ext.makemake % \end{verbatim} % to generate the file |Makefile|, which can be further used to % generate the documentation with a common |make| like the GNU |make|. % \changes{v58}{10/05/18}{changed the .setup contents} % \begin{macrocode} %<*setup> #! /bin/sh sed -e "`echo \"s/^ /@/g\" | tr '@' '\011'`" listings-ext.mk > Makefile && \ rm listings-ext.mk % % \end{macrocode} % % % \changes{v50}{10/02/15}{added title to the section "getting the revision"} % \subsection{Automated Determining of the Revision Number} % \label{sec:automated-determining} % % The purpose of the following file is to determine the version of the % package for the case of creating a distribution version of the package. % \changes{v33}{09/08/23}{changed getversion.tex: introduced the date} % \begin{macrocode} %<*getversion> \documentclass{ltxdoc} \nofiles \usepackage{listings-ext} \GetFileInfo{listings-ext.sty} \typeout{VERSION \fileversion\space of \filedate} \begin{document} \end{document} % % \end{macrocode} % % \Finale % % % \iffalse %<*bibtex> @Book{lingnau07:_latex_hacks, author = {Anselm Lingnau}, title = {\LaTeX-Hacks}, publisher = {O'Reilly}, year = 2007, address = {Beijing; Cambridge; Farnham; K\"oln; Paris; Sebastopol; Taipei; Tokyo}, edition = {1.}, note = {Tipps \& Techniken f\"ur den professionellen Textsatz}, language = {ngerman}, } @Manual{Heinz:Listings-14, author = {Carsten Heinz and Brooks Moses}, title = {The \textsf{listings} package}, note = {Version 1.4}, year = 2007, month = FEB, language = {english} } @Manual{FM:TheDocAndShortvrbPackages, author = {Frank Mittelbach}, title = {{The {\sf doc} and {\sf shortvrb} Packages}}, year = 2006, month = FEB, note = {version number 2.1d}, language = {english} } @Manual{MittelbachDuchierBraams:DocStrip, author = {Frank Mittelbach and Denys Duchier and Johannes Braams and Marcin Woli\'nski and Mark Wooding}, title = {{The {\sf DocStrip} program}}, year = 2005, month = JUL, note = {version number 2.5d}, language = {english} } % %<*hyperref> \ProvidesFile{hyperref.cfg}% [2009/08/23 v1.0 hyperref configuration of listings-ext] % Change default driver to "dvips" instead of "hypertex", % requires hyperref 2002/06/05 v6.72s \providecommand*{\Hy@defaultdriver}{hdvips}% \hypersetup{ ps2pdf, % the documentation uses ps2pdf colorlinks, % display links in the text coloured pdfpagemode=UseOutlines, plainpages=false, pagebackref=true, % one can jump from the bibliography to the % origin of the citations hyperindex=true, % index is linked bookmarks=true, % I want Acrobat bookmarks, bookmarksopen=true, % they should be shown when the foils % are displayed bookmarksnumbered=true, % numbering is on pdftitle={listings-ext}, pdfsubject={A collection of LaTeX macros to support the automatic integration of parts of source files into a documentation} pdfauthor={Jobst Hoffmann, Fachhochschule Aachen J\"ulich Campus, }, pdfkeywords={PDF, TeX, LaTeX, listings}, } % % \fi \endinput % %% \CharacterTable %% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z %% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z %% Digits \0\1\2\3\4\5\6\7\8\9 %% Exclamation \! Double quote \" Hash (number) \# %% Dollar \$ Percent \% Ampersand \& %% Acute accent \' Left paren \( Right paren \) %% Asterisk \* Plus \+ Comma \, %% Minus \- Point \. Solidus \/ %% Colon \: Semicolon \; Less than \< %% Equals \= Greater than \> Question mark \? %% Commercial at \@ Left bracket \[ Backslash \\ %% Right bracket \] Circumflex \^ Underscore \_ %% Grave accent \` Left brace \{ Vertical bar \| %% Right brace \} Tilde \~} % %%% ^^A Local Variables: %%% ^^A mode: docTeX %%% ^^A TeX-master: t %%% ^^A mode: flyspell %%% ^^A ispell-local-dictionary: "english" %%% ^^A End: % % end of listings-ext.dtx