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
indentation. Indentation is important because it helps
understand the code; it is thus desirable to preserve
indentation in program text. The pre text layout
already allows indentation to be preserved. This chapter presents two
new functions that complement it: prog and source, both of which are specially designed to represent computer
programs in text.
7.1 Program
A prog function call preserves the indentation of the
program. It may automatically introduce line numbers.
| prototype |
(prog [:mark ";!"] [:linedigit] [:line 1] [:class "prog"] [:ident]) |
| :ident | html lout latex context xml | The node identifier. |
| :class | html lout latex context xml | The node class. |
| :line | html lout latex context xml | 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 #f disables
the line numbering. |
| :linedigit | html lout latex context xml | The number of digit for representing line
numbers. |
| :mark | html lout latex context xml | A string or the boolean #f. If this option
is a string, that string is the prefix
of line marks. These marks can be used in the
ref reference. A mark
identifier is defined by the regular expression:
[_a-zA-Z][_a-zA-Z0-9]*. The prefix and the mark are removed from the output program. |
source pre ref |
Ex. 32: A program
... produces:
The main goal is specified on line 12. |
|
7.2 Source Code
The source function extracts part of the source code and
enables fontification. That is, some words of the program
can be rendered using different colors or faces.
Ex. 33: The source markup
... produces:
1: ;;; prgm.skb -- Computer programs
2: ;;;
3: ;;; Copyright 2008 Ludovic Courtès <ludo@gnu.org>
4: ;;; Copyright 2001, 2002, 2003, 2004 Manuel Serrano
5: ;;;
6: ;;;
7: ;;; This program is free software; you can redistribute it and/or modify
8: ;;; it under the terms of the GNU General Public License as published by
9: ;;; the Free Software Foundation; either version 2 of the License, or
10: ;;; (at your option) any later version.
11: ;;;
12: ;;; This program is distributed in the hope that it will be useful,
13: ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14: ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15: ;;; GNU General Public License for more details.
16: ;;;
17: ;;; You should have received a copy of the GNU General Public License
18: ;;; along with this program; if not, write to the Free Software
19: ;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
20: ;;; USA.
21:
22: ;*---------------------------------------------------------------------*/
23: ;* fib ... */
24: ;*---------------------------------------------------------------------*/
25: (define (fib x)
26: (if (< x 2)
27: 1
28: (+ (fib (- x 1)) (fib (- x 2)))))
|
The Fibonacci function is defined on line 25.
Here is the source of the frame above:
|
|
Note that even awful programming languages of the C family can be
highlighted!
Ex. 34: The source markup for C
... produces:
You would highlight Java™ code in a similar way, i.e.,
with :language java.
Files passed as the :file argument of source
are searched in the current source path, which is defined by the
*source-path* SRFI-39 parameter. This parameter contains
a list of directories and its value can be obtained using (*source-path*). Its value can be altered using the -S
command-line option of the skribilo compiler (see Chapter 14 for details).
The :language parameter of source takes a
language object, which performs the actual source highlighting.
Several programming languages are currently supported: the (skribilo source lisp) module provides skribe, scheme,
stklos, bigloo and lisp, which implement source
highlighting for the corresponding lispy dialects, while the (skribilo source c) module provides c and java.
Thus, you need to import the relevant module to get the right language,
for instance by adding (use-modules (skribilo source c)) at
the beginning of your document. Additional languages can be created
using the language function (see below).
7.3 Language
The language function builds a language that can be used
in source function call.
| prototype |
(language :name [:extractor] [:fontifier]) |
| :name | html lout latex context xml | A string which denotes the name of the language. |
| :fontifier | html lout latex context xml | A function of one argument (a string), that
colorizes a line source code. |
| :extractor | html lout latex context xml | A function of three arguments: an input port,
an identifier, a tabulation size. This function scans
in the input port the definition is looks for. |
prog source ref |