;;; prgm.skb -- Computer programs ;;; -*- coding: iso-8859-1 -*- ;;; ;;; Copyright 2008 Ludovic Courtès <ludo@gnu.org> ;;; Copyright 2001, 2002, 2003, 2004 Manuel Serrano ;;; ;;; ;;; This file is part of Skribilo. ;;; ;;; Skribilo is free software: you can redistribute it and/or modify ;;; it under the terms of the GNU General Public License as published by ;;; the Free Software Foundation, either version 3 of the License, or ;;; (at your option) any later version. ;;; ;;; Skribilo is distributed in the hope that it will be useful, ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with Skribilo. If not, see <http://www.gnu.org/licenses/>. ;*---------------------------------------------------------------------*/ ;* fib ... */ ;*---------------------------------------------------------------------*/ (define (fib x) ;!fib (if (< x 2) 1 (+ (fib (- x 1)) (fib (- x 2))))) ;*---------------------------------------------------------------------*/ ;* Computer programs */ ;*---------------------------------------------------------------------*/ (chapter :title "Computer Programs" :ident "programs" (p [In a document describing a computer programming language, it is common to include excerpt of programs. Program code is typically typeset in a specific font, with no justification, and with a precise ,(emph "indentation"). Indentation is important because it helps understand the code,(begin ";") it is thus desirable to preserve indentation in program text. The ,(markup-ref "pre") text layout already allows indentation to be preserved. This chapter presents two new functions that complement it: ,(markup-ref "prog") and ,(markup-ref "source"), both of which are specially designed to represent computer programs in text.]) ;*---------------------------------------------------------------------*/ ;* Programs ... @label prog@ */ ;*---------------------------------------------------------------------*/ (section :title "Program" (p [A ,(code "prog") function call preserves the indentation of the program. It may automatically introduce line numbers.]) (doc-markup 'prog `((:line ,[Enables/disables automatic line numbering. An integer value enables the line number and specifies the number of the first line of the program. A value of ,(code "#f") disables the line numbering.]) (:linedigit ,[The number of digit for representing line numbers.]) (:mark ,[A string or the boolean ,(code "#f"). If this option is a string, that string is the prefix of line marks. These marks can be used in the ,(markup-ref "ref") reference. A mark identifier is defined by the regular expression: ,(code [,(char "[")_a-zA-Z,(char "]"),(char "[")_a-zA-Z0-9,(char "]")*]). The prefix and the mark are removed from the output program.])) :force-engines *api-engines* :see-also '(source pre ref)) (example-produce (example :legend "A program" (prgm :file "src/prgm1.skb")) (disp (include "src/prgm1.skb")))) ;*---------------------------------------------------------------------*/ ;* Source code ... @label source@ */ ;*---------------------------------------------------------------------*/ (section :title "Source Code" (p [The ,(code "source") function extracts part of the source code and enables ,(emph "fontification"). That is, some words of the program can be rendered using different colors or faces.]) ;!source-start (doc-markup 'source `((:language ,[The ,(markup-ref "language") of the source code.]) (:file ,[The file containing the actual source code. The file is searched in the ,(markup-ref "*source-path*") path.]) (:start [A start line number or a start marker.]) (:stop [A stop line number or a stop marker.]) (:definition [The identifier of the definition to extract.]) (:tab [The tabulation width.])) :common-args '() :force-engines *api-engines* :see-also '(prog language ref *source-path*)) ;!source-stop (linebreak) (example-produce (example :legend "The source markup" (prgm :file "src/prgm2.skb")) (disp (include "src/prgm2.skb"))) (p [Note that even awful programming languages of the C family can be highlighted!]) (linebreak) (example-produce (example :legend "The source markup for C" (prgm :file "src/prgm4.skb")) (disp (include "src/prgm4.skb"))) (p [You would highlight Java,(symbol "tm") code in a similar way, i.e., with ,(tt [:language java]).]) (mark "*source-path*") (p [Files passed as the ,(tt [:file]) argument of ,(markup-ref "source") are searched in the current ,(emph [source path]), which is defined by the ,(tt [*source-path*]) ,(srfi-ref 39) parameter. This parameter contains a list of directories and its value can be obtained using ,(code [(*source-path*)]). Its value can be altered using the ,(tt [-S]) command-line option of the ,(tt [skribilo]) compiler (see ,(numref :text [Chapter] :ident "compiler") for details).]) (p [The ,(param :language) parameter of ,(markup-ref "source") takes a ,(tt [language]) object, which performs the actual source highlighting. Several programming languages are currently supported: the ,(tt [(skribilo source lisp)]) module provides ,(tt [skribe]), ,(tt [scheme]), ,(tt [stklos]), ,(tt [bigloo]) and ,(tt [lisp]), which implement source highlighting for the corresponding lispy dialects, while the ,(tt [(skribilo source c)]) module provides ,(tt [c]) and ,(tt [java]). Thus, you need to import the relevant module to get the right language, for instance by adding ,(code [(use-modules (skribilo source c))]) at the beginning of your document. Additional languages can be created using the ,(markup-ref "language") function (see below).])) ;*---------------------------------------------------------------------*/ ;* Language ... @label language@ */ ;*---------------------------------------------------------------------*/ (section :title "Language" (index "source" :note "fontification") (index "fontification") (p [The ,(code "language") function builds a language that can be used in ,(markup-ref "source") function call.]) (doc-markup 'language `((:name [A string which denotes the name of the language.]) (:fontifier [A function of one argument (a string), that colorizes a line source code.]) (:extractor [A function of three arguments: an input port, an identifier, a tabulation size. This function ,(emph "scans") in the input port the definition is looks for.])) :common-args '() :force-engines *api-engines* :see-also '(prog source ref)) ; **** FIXME: (cond-expand (bigloo (example-produce (example :legend "An ad-hoc fontification" (prgm :file "src/prgm3.skb")) (disp (include "src/prgm3.skb")))) (else '())))) ;;; Local Variables: ;;; ispell-local-dictionary: "american" ;;; End: