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.
A prog function call preserves the indentation of the
program. It may automatically introduce line numbers.
(prog [:mark ";!"] [:linedigit] [:line 1] [:class "prog"] [:ident])#f disables
the line numbering.
html
lout
latex
context
info
xml #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.
html
lout
latex
context
info
xml ... produces:
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.
(source :language [:tab 8] [:definition] [:stop] [:start] [:file])(use-modules (skribilo source lisp)) (linebreak) (frame :width 100. (prog (source :language scheme :file "prgm.skb" :definition 'fib))) (p [The Fibonacci function is defined on line ,(ref :line "fib").]) (linebreak) (frame :width 100. (prog :line 23 :mark #f (source :language skribe :file "prgm.skb" :start 22 :stop 29))) (p [Here is the source of the frame above:]) (linebreak) (frame :width 100. (prog :line 30 :mark #f (source :language skribe :file "src/prgm2.skb" :start (string-append ";" "!start") ;; trick! :stop (string-append ";" "!stop"))))
... produces:
The Fibonacci function is defined on line 1.
23: ;*---------------------------------------------------------------------*/ 24: ;* fib ... */ 25: ;*---------------------------------------------------------------------*/ 26: (define (fib x) ;!fib 27: (if (< x 2) 28: 1 29: (+ (fib (- x 1)) (fib (- x 2))))) 30:
Here is the source of the frame above:
Note that even awful programming languages of the C family can be highlighted!
(use-modules (skribilo source c)) (p [Here's how:]) (linebreak) (prog (source :language c [#include <stdlib.h> static int foo = 10; static float bar; /* This is the function responsible for integer chbouibification. */ float chbouibify (int x) { bar = foo + (float) x / random (); foo = (float) x * random (); if (x > 2) /* Great! */ printf ("hello world!\n"); else printf ("lower than two\n"); return ((float) foo * bar); }]))
... produces:
Here's how:
1: #include <stdlib.h> 2: 3: static int foo = 10; 4: static float bar; 5: 6: /* This is the function responsible 7: for integer chbouibification. */ 8: float 9: chbouibify (int x) 10: { 11: bar = foo + (float) x / random (); 12: foo = (float) x * random (); 13: 14: if (x > 2) 15: /* Great! */ 16: printf ("hello world!n"); 17: else 18: printf ("lower than twon"); 19: 20: return ((float) foo * bar); 21: }
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).
The language function builds a language that can be used
in
source function call.
(language :name [:extractor] [:fontifier])