summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am3
-rw-r--r--src/guile/Makefile.am3
-rw-r--r--[-rwxr-xr-x]src/guile/skribilo.scm67
-rw-r--r--src/guile/skribilo/Makefile.am15
-rw-r--r--src/guile/skribilo/Makefile.in463
-rw-r--r--src/guile/skribilo/ast.scm3
-rw-r--r--src/guile/skribilo/biblio.scm44
-rw-r--r--src/guile/skribilo/coloring/Makefile.am2
-rw-r--r--src/guile/skribilo/debug.scm27
-rw-r--r--src/guile/skribilo/engine.scm2
-rw-r--r--src/guile/skribilo/engine/lout.scm68
-rw-r--r--src/guile/skribilo/evaluator.scm29
-rw-r--r--src/guile/skribilo/lib.scm23
-rw-r--r--src/guile/skribilo/location.scm3
-rw-r--r--src/guile/skribilo/module.scm86
-rw-r--r--src/guile/skribilo/output.scm47
-rw-r--r--src/guile/skribilo/package/slide.scm75
-rw-r--r--src/guile/skribilo/parameters.scm33
-rw-r--r--src/guile/skribilo/resolve.scm49
-rw-r--r--src/guile/skribilo/skribe/Makefile.am2
-rw-r--r--src/guile/skribilo/skribe/bib.scm3
-rw-r--r--src/guile/skribilo/source.scm5
-rw-r--r--src/guile/skribilo/utils/Makefile.am4
-rw-r--r--src/guile/skribilo/utils/syntax.scm68
-rw-r--r--src/guile/skribilo/verify.scm59
-rw-r--r--src/guile/skribilo/writer.scm4
-rw-r--r--src/skribilo.in7
27 files changed, 434 insertions, 760 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 1d3db1f..4a83f1a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1 +1,4 @@
 SUBDIRS = guile
+
+EXTRA_DIST = skribilo.in
+bin_SCRIPTS = skribilo
diff --git a/src/guile/Makefile.am b/src/guile/Makefile.am
index afe4667..e410a87 100644
--- a/src/guile/Makefile.am
+++ b/src/guile/Makefile.am
@@ -1,4 +1,5 @@
 SUBDIRS = skribilo
 
-bin_SCRIPTS = skribilo.scm
+guilemoduledir = $(GUILE_SITE)
+dist_guilemodule_DATA = skribilo.scm
 EXTRA_DIST = README
diff --git a/src/guile/skribilo.scm b/src/guile/skribilo.scm
index c4a5eac..a560b46 100755..100644
--- a/src/guile/skribilo.scm
+++ b/src/guile/skribilo.scm
@@ -39,9 +39,6 @@ exec ${GUILE-guile} --debug -l $0 -c "(apply $main (cdr (command-line)))" "$@"
 ;;;;
 ;;;; Code:
 
-;; Allow for this `:style' of keywords.
-(read-set! keywords 'prefix)
-
 (let ((gensym-orig gensym))
   ;; In Skribe, `gensym' expects a symbol as its (optional) argument, while
   ;; Guile's `gensym' expect a string.  XXX
@@ -62,7 +59,8 @@ exec ${GUILE-guile} --debug -l $0 -c "(apply $main (cdr (command-line)))" "$@"
 
 (define-module (skribilo)
   :autoload (skribilo module) (make-run-time-module)
-  :autoload (skribilo engine) (*current-engine*))
+  :autoload (skribilo engine) (*current-engine*)
+  :use-module (skribilo utils syntax))
 
 (use-modules (skribilo evaluator)
 	     (skribilo debug)
@@ -74,13 +72,18 @@ exec ${GUILE-guile} --debug -l $0 -c "(apply $main (cdr (command-line)))" "$@"
 	     (ice-9 getopt-long))
 
 
+;; Install the Skribilo module syntax reader.
+(set-current-reader %skribilo-module-reader)
+
+(if (not (keyword? :kw))
+    (error "guile-reader sucks"))
 
 
 
 
-(define* (process-option-specs longname #:key (alternate #f)
-			       (arg #f) (help #f)
-			       #:rest thunk)
+(define* (process-option-specs longname
+			       :key (alternate #f) (arg #f) (help #f)
+			       :rest thunk)
   "Process STkLos-like option specifications and return getopt-long option
 specifications."
   `(,(string->symbol longname)
@@ -180,6 +183,7 @@ specifications."
    (with-input-from-string expr
       (lambda () (eval (read))))))
 
+
 ; (define skribilo-options
 ;   ;; Skribilo options in getopt-long's format, as computed by
 ;   ;; `raw-options->getopt-long'.
@@ -216,7 +220,7 @@ Processes a Skribilo/Skribe source file and produces its output.
 
   --help           Give this help list
   --version        Print program version
-"))
+~%"))
 
 (define (skribilo-show-version)
   (format #t "skribilo ~a~%" (skribilo-release)))
@@ -370,18 +374,26 @@ Processes a Skribilo/Skribe source file and produces its output.
 ; 		   *skribe-src*)
 ; 	 (skribe-eval-port (current-input-port) *skribe-engine*))))
 
+(define *skribilo-output-port* (make-parameter (current-output-port)))
+
 (define (doskribe)
-  (let ((user-module (current-module)))
+  (let ((output-port (current-output-port))
+	(user-module (current-module)))
     (dynamic-wind
 	(lambda ()
+	  ;; FIXME: Using this technique, anything written to `stderr' will
+	  ;; also end up in the output file (e.g. Guile warnings).
+	  (set-current-output-port (*skribilo-output-port*))
 	  (set-current-module (make-run-time-module)))
 	(lambda ()
-	  (format #t "engine is ~a~%" (*current-engine*))
+	  ;;(format #t "engine is ~a~%" (*current-engine*))
 	  (skribe-eval-port (current-input-port) (*current-engine*)))
 	(lambda ()
+	  (set-current-output-port output-port)
 	  (set-current-module user-module)))))
 
 
+
 ;;;; ======================================================================
 ;;;;
 ;;;;				      M A I N
@@ -392,7 +404,9 @@ Processes a Skribilo/Skribe source file and produces its output.
 					 skribilo-options))
 	 (engine            (string->symbol
 			     (option-ref options 'target "html")))
+	 (output-file       (option-ref options 'output #f))
 	 (debugging-level   (option-ref options 'debug "0"))
+	 (warning-level     (option-ref options 'warning "2"))
 	 (load-path         (option-ref options 'load-path "."))
 	 (bib-path          (option-ref options 'bib-path "."))
 	 (preload           '())
@@ -405,7 +419,6 @@ Processes a Skribilo/Skribe source file and produces its output.
     (debug-enable 'debug)
     (debug-enable 'backtrace)
     (debug-enable 'procnames)
-    (read-enable  'positions)
 
     (cond (help-wanted    (begin (skribilo-show-help) (exit 1)))
 	  (version-wanted (begin (skribilo-show-version) (exit 1))))
@@ -422,7 +435,11 @@ Processes a Skribilo/Skribe source file and produces its output.
     (parameterize ((*current-engine* engine)
 		   (*document-path*  (cons load-path (*document-path*)))
 		   (*bib-path*       (cons bib-path (*bib-path*)))
-		   (*verbose*        (option-ref options 'verbose #f)))
+		   (*warning*        (string->number warning-level))
+		   (*verbose*        (let ((v (option-ref options
+							  'verbose 0)))
+				       (if (number? v) v
+					   (if v 1 0)))))
 
       ;; Load the user rc file
       ;;(load-rc)
@@ -443,26 +460,22 @@ Processes a Skribilo/Skribe source file and produces its output.
 	    (error "you can specify at most one input file and one output file"
 		   files))
 
-	(let* ((source-file (if (null? files) #f (car files)))
-	       (dest-file (if (or (not source-file)
-				  (null? (cdr files)))
-			      #f
-			      (cadr files)))
-	       (do-it! (lambda ()
-			 (if (string? dest-file)
-			     (with-output-to-file dest-file doskribe)
-			     (doskribe)))))
+	(let* ((source-file (if (null? files) #f (car files))))
 
-	  (parameterize ((*destination-file* dest-file)
-			 (*source-file*      source-file))
+	  (if (and output-file (file-exists? output-file))
+	      (delete-file output-file))
 
-	    (if (and dest-file (file-exists? dest-file))
-		(delete-file dest-file))
+	  (parameterize ((*destination-file* output-file)
+			 (*source-file*      source-file)
+			 (*skribilo-output-port*
+			  (if (string? output-file)
+			      (open-output-file output-file)
+			      (current-output-port))))
 
 	    ;;	(start-stack 7
 	    (if source-file
-		(with-input-from-file source-file do-it!)
-		(do-it!))))))))
+		(with-input-from-file source-file doskribe)
+		(doskribe))))))))
 
 
 (define main skribilo)
diff --git a/src/guile/skribilo/Makefile.am b/src/guile/skribilo/Makefile.am
index c86f2f3..c6765f5 100644
--- a/src/guile/skribilo/Makefile.am
+++ b/src/guile/skribilo/Makefile.am
@@ -1,9 +1,10 @@
 guilemoduledir = $(GUILE_SITE)/skribilo
-dist_guilemodule_DATA = biblio.scm color.scm config.scm			\
-                        debug.scm engine.scm evaluator.scm		\
-		        lib.scm module.scm output.scm prog.scm		\
-		        reader.scm resolve.scm runtime.scm		\
-			source.scm types.scm vars.scm verify.scm	\
-			writer.scm
+dist_guilemodule_DATA = biblio.scm color.scm config.scm		\
+                        debug.scm engine.scm evaluator.scm	\
+		        lib.scm module.scm output.scm prog.scm	\
+		        reader.scm resolve.scm runtime.scm	\
+			source.scm parameters.scm verify.scm	\
+			writer.scm ast.scm location.scm		\
+			compat.scm
 
-SUBDIRS = reader engine package skribe coloring
+SUBDIRS = utils reader engine package skribe coloring
diff --git a/src/guile/skribilo/Makefile.in b/src/guile/skribilo/Makefile.in
deleted file mode 100644
index add7d0e..0000000
--- a/src/guile/skribilo/Makefile.in
+++ /dev/null
@@ -1,463 +0,0 @@
-# Makefile.in generated by automake 1.9.6 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-srcdir = @srcdir@
-top_srcdir = @top_srcdir@
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-top_builddir = ../../..
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-INSTALL = @INSTALL@
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-subdir = src/guile/skribilo
-DIST_COMMON = $(dist_guilemodule_DATA) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in $(srcdir)/config.scm.in
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.ac
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-mkinstalldirs = $(install_sh) -d
-CONFIG_CLEAN_FILES = config.scm
-SOURCES =
-DIST_SOURCES =
-RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
-	html-recursive info-recursive install-data-recursive \
-	install-exec-recursive install-info-recursive \
-	install-recursive installcheck-recursive installdirs-recursive \
-	pdf-recursive ps-recursive uninstall-info-recursive \
-	uninstall-recursive
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
-am__installdirs = "$(DESTDIR)$(guilemoduledir)"
-dist_guilemoduleDATA_INSTALL = $(INSTALL_DATA)
-DATA = $(dist_guilemodule_DATA)
-ETAGS = etags
-CTAGS = ctags
-DIST_SUBDIRS = $(SUBDIRS)
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-GUILE = @GUILE@
-GUILE_CONFIG = @GUILE_CONFIG@
-GUILE_SITE = @GUILE_SITE@
-GUILE_TOOLS = @GUILE_TOOLS@
-HAVE_LOUT_FALSE = @HAVE_LOUT_FALSE@
-HAVE_LOUT_TRUE = @HAVE_LOUT_TRUE@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LOUT = @LOUT@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-SKRIBILO_DOC_DIR = @SKRIBILO_DOC_DIR@
-SKRIBILO_EXT_DIR = @SKRIBILO_EXT_DIR@
-SKRIBILO_SKR_PATH = @SKRIBILO_SKR_PATH@
-STRIP = @STRIP@
-VERSION = @VERSION@
-ac_ct_STRIP = @ac_ct_STRIP@
-am__leading_dot = @am__leading_dot@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build_alias = @build_alias@
-datadir = @datadir@
-exec_prefix = @exec_prefix@
-host_alias = @host_alias@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-guilemoduledir = $(GUILE_SITE)/skribilo
-dist_guilemodule_DATA = biblio.scm color.scm config.scm			\
-                        debug.scm engine.scm evaluator.scm		\
-		        lib.scm module.scm output.scm prog.scm		\
-		        reader.scm resolve.scm runtime.scm		\
-			source.scm types.scm vars.scm verify.scm	\
-			writer.scm
-
-SUBDIRS = reader engine package skribe coloring
-all: all-recursive
-
-.SUFFIXES:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  src/guile/skribilo/Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  src/guile/skribilo/Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
-config.scm: $(top_builddir)/config.status $(srcdir)/config.scm.in
-	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
-uninstall-info-am:
-install-dist_guilemoduleDATA: $(dist_guilemodule_DATA)
-	@$(NORMAL_INSTALL)
-	test -z "$(guilemoduledir)" || $(mkdir_p) "$(DESTDIR)$(guilemoduledir)"
-	@list='$(dist_guilemodule_DATA)'; for p in $$list; do \
-	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
-	  f=$(am__strip_dir) \
-	  echo " $(dist_guilemoduleDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(guilemoduledir)/$$f'"; \
-	  $(dist_guilemoduleDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(guilemoduledir)/$$f"; \
-	done
-
-uninstall-dist_guilemoduleDATA:
-	@$(NORMAL_UNINSTALL)
-	@list='$(dist_guilemodule_DATA)'; for p in $$list; do \
-	  f=$(am__strip_dir) \
-	  echo " rm -f '$(DESTDIR)$(guilemoduledir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(guilemoduledir)/$$f"; \
-	done
-
-# This directory's subdirectories are mostly independent; you can cd
-# into them and run `make' without going through this Makefile.
-# To change the values of `make' variables: instead of editing Makefiles,
-# (1) if the variable is set in `config.status', edit `config.status'
-#     (which will cause the Makefiles to be regenerated when you run `make');
-# (2) otherwise, pass the desired values on the `make' command line.
-$(RECURSIVE_TARGETS):
-	@failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	target=`echo $@ | sed s/-recursive//`; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    dot_seen=yes; \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done; \
-	if test "$$dot_seen" = "no"; then \
-	  $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
-	fi; test -z "$$fail"
-
-mostlyclean-recursive clean-recursive distclean-recursive \
-maintainer-clean-recursive:
-	@failcom='exit 1'; \
-	for f in x $$MAKEFLAGS; do \
-	  case $$f in \
-	    *=* | --[!k]*);; \
-	    *k*) failcom='fail=yes';; \
-	  esac; \
-	done; \
-	dot_seen=no; \
-	case "$@" in \
-	  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
-	  *) list='$(SUBDIRS)' ;; \
-	esac; \
-	rev=''; for subdir in $$list; do \
-	  if test "$$subdir" = "."; then :; else \
-	    rev="$$subdir $$rev"; \
-	  fi; \
-	done; \
-	rev="$$rev ."; \
-	target=`echo $@ | sed s/-recursive//`; \
-	for subdir in $$rev; do \
-	  echo "Making $$target in $$subdir"; \
-	  if test "$$subdir" = "."; then \
-	    local_target="$$target-am"; \
-	  else \
-	    local_target="$$target"; \
-	  fi; \
-	  (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
-	  || eval $$failcom; \
-	done && test -z "$$fail"
-tags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
-	done
-ctags-recursive:
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
-	done
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS: tags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
-	  include_option=--etags-include; \
-	  empty_fix=.; \
-	else \
-	  include_option=--include; \
-	  empty_fix=; \
-	fi; \
-	list='$(SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test ! -f $$subdir/TAGS || \
-	      tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
-	  fi; \
-	done; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
-	fi
-ctags: CTAGS
-CTAGS: ctags-recursive $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
-	list='$(DISTFILES)'; for file in $$list; do \
-	  case $$file in \
-	    $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
-	    $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
-	  esac; \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
-	  if test "$$dir" != "$$file" && test "$$dir" != "."; then \
-	    dir="/$$dir"; \
-	    $(mkdir_p) "$(distdir)$$dir"; \
-	  else \
-	    dir=''; \
-	  fi; \
-	  if test -d $$d/$$file; then \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-	list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
-	  if test "$$subdir" = .; then :; else \
-	    test -d "$(distdir)/$$subdir" \
-	    || $(mkdir_p) "$(distdir)/$$subdir" \
-	    || exit 1; \
-	    distdir=`$(am__cd) $(distdir) && pwd`; \
-	    top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
-	    (cd $$subdir && \
-	      $(MAKE) $(AM_MAKEFLAGS) \
-	        top_distdir="$$top_distdir" \
-	        distdir="$$distdir/$$subdir" \
-	        distdir) \
-	      || exit 1; \
-	  fi; \
-	done
-check-am: all-am
-check: check-recursive
-all-am: Makefile $(DATA)
-installdirs: installdirs-recursive
-installdirs-am:
-	for dir in "$(DESTDIR)$(guilemoduledir)"; do \
-	  test -z "$$dir" || $(mkdir_p) "$$dir"; \
-	done
-install: install-recursive
-install-exec: install-exec-recursive
-install-data: install-data-recursive
-uninstall: uninstall-recursive
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-recursive
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-recursive
-
-clean-am: clean-generic mostlyclean-am
-
-distclean: distclean-recursive
-	-rm -f Makefile
-distclean-am: clean-am distclean-generic distclean-tags
-
-dvi: dvi-recursive
-
-dvi-am:
-
-html: html-recursive
-
-info: info-recursive
-
-info-am:
-
-install-data-am: install-dist_guilemoduleDATA
-
-install-exec-am:
-
-install-info: install-info-recursive
-
-install-man:
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-recursive
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-recursive
-
-mostlyclean-am: mostlyclean-generic
-
-pdf: pdf-recursive
-
-pdf-am:
-
-ps: ps-recursive
-
-ps-am:
-
-uninstall-am: uninstall-dist_guilemoduleDATA uninstall-info-am
-
-uninstall-info: uninstall-info-recursive
-
-.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am check check-am \
-	clean clean-generic clean-recursive ctags ctags-recursive \
-	distclean distclean-generic distclean-recursive distclean-tags \
-	distdir dvi dvi-am html html-am info info-am install \
-	install-am install-data install-data-am \
-	install-dist_guilemoduleDATA install-exec install-exec-am \
-	install-info install-info-am install-man install-strip \
-	installcheck installcheck-am installdirs installdirs-am \
-	maintainer-clean maintainer-clean-generic \
-	maintainer-clean-recursive mostlyclean mostlyclean-generic \
-	mostlyclean-recursive pdf pdf-am ps ps-am tags tags-recursive \
-	uninstall uninstall-am uninstall-dist_guilemoduleDATA \
-	uninstall-info-am
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/src/guile/skribilo/ast.scm b/src/guile/skribilo/ast.scm
index fc6859e..b1c9a14 100644
--- a/src/guile/skribilo/ast.scm
+++ b/src/guile/skribilo/ast.scm
@@ -22,6 +22,7 @@
 (define-module (skribilo ast)
   :use-module (oop goops)
   :autoload (skribilo location) (location?)
+  :use-module (skribilo utils syntax)
   :export (<ast> ast? ast-loc ast-loc-set!
 		 ast-parent ast->string
 
@@ -54,7 +55,7 @@
 ;;;
 ;;; Code:
 
-(read-set! keywords 'prefix)
+(set-current-reader %skribilo-module-reader)
 
 (define *node-table* (make-hash-table))
 					; Used to stores the nodes of  an AST.
diff --git a/src/guile/skribilo/biblio.scm b/src/guile/skribilo/biblio.scm
index dd04f68..cbb9202 100644
--- a/src/guile/skribilo/biblio.scm
+++ b/src/guile/skribilo/biblio.scm
@@ -22,14 +22,17 @@
 
 (define-module (skribilo biblio)
   :use-module (skribilo runtime)
-  :use-module (skribilo lib)      ;; `when', `unless'
+  :use-module (skribilo utils syntax) ;; `when', `unless'
   :use-module (skribilo module)
   :use-module (skribilo skribe bib) ;; `make-bib-entry'
+  :autoload   (skribilo reader)      (%default-reader)
   :autoload   (skribilo parameters)  (*bib-path*)
   :autoload   (ice-9 format)         (format)
   :export (bib-table? make-bib-table default-bib-table
-	   bib-add!))
+	   bib-add! bib-duplicate
+	   skribe-open-bib-file parse-bib))
 
+(set-current-reader %skribilo-module-reader)
 
 
 ;; FIXME: Should be a fluid?
@@ -91,24 +94,25 @@
 ;;;
 ;;; ======================================================================
 (define (parse-bib table port)
-  (if (not (bib-table? table))
-      (skribe-error 'parse-bib "Illegal bibliography table" table)
-      (let ((from (port-file-name port)))
-	(let Loop ((entry (read port)))
-	  (unless (eof-object? entry)
-	    (cond
-	      ((and (list? entry) (> (length entry) 2))
-	       (let* ((kind   (car entry))
-		      (key    (format #f "~A" (cadr entry)))
-		      (fields (cddr entry))
-		      (old    (hash-ref table key)))
-		 (if old
-		     (bib-duplicate ident from old)
-		     (hash-set! table key
-				(make-bib-entry kind key fields from)))
-		 (Loop (read port))))
-	      (else
-	       (%bib-error 'bib-parse entry))))))))
+  (let ((read %default-reader)) ;; FIXME: We should use a fluid
+    (if (not (bib-table? table))
+	(skribe-error 'parse-bib "Illegal bibliography table" table)
+	(let ((from (port-filename port)))
+	  (let Loop ((entry (read port)))
+	    (unless (eof-object? entry)
+	      (cond
+	       ((and (list? entry) (> (length entry) 2))
+		(let* ((kind   (car entry))
+		       (key    (format #f "~A" (cadr entry)))
+		       (fields (cddr entry))
+		       (old    (hash-ref table key)))
+		  (if old
+		      (bib-duplicate ident from old)
+		      (hash-set! table key
+				 (make-bib-entry kind key fields from)))
+		  (Loop (read port))))
+	       (else
+		(%bib-error 'bib-parse entry)))))))))
 
 
 ;;; ======================================================================
diff --git a/src/guile/skribilo/coloring/Makefile.am b/src/guile/skribilo/coloring/Makefile.am
index d518553..c8f9242 100644
--- a/src/guile/skribilo/coloring/Makefile.am
+++ b/src/guile/skribilo/coloring/Makefile.am
@@ -1,2 +1,2 @@
-guilemoduledir = $(GUILE_SITE)/skribilo
+guilemoduledir = $(GUILE_SITE)/skribilo/coloring
 dist_guilemodule_DATA = c.scm lisp.scm xml.scm
diff --git a/src/guile/skribilo/debug.scm b/src/guile/skribilo/debug.scm
index cc0dfb2..953997e 100644
--- a/src/guile/skribilo/debug.scm
+++ b/src/guile/skribilo/debug.scm
@@ -1,8 +1,8 @@
+;;; debug.scm  --  Debug facilities.
 ;;;
-;;; debug.scm	-- Debug Facilities (stolen to Manuel Serrano)
+;;; Copyright 2003-2004  Erick Gallesio - I3S-CNRS/ESSI <eg@unice.fr>
+;;; Copyright 2005  Ludovic Courtès <ludovic.courtes@laas.fr>
 ;;;
-;;;
-;;; Copyright © 2003-2004 Erick Gallesio - I3S-CNRS/ESSI <eg@unice.fr>
 ;;; This program 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 2 of the License, or
@@ -17,19 +17,20 @@
 ;;; along with this program; if not, write to the Free Software
 ;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
 ;;; USA.
-;;;
-;;;           Author: Erick Gallesio [eg@essi.fr]
-;;;    Creation date: 10-Aug-2003 20:45 (eg)
-;;; Last file update: 28-Oct-2004 13:16 (eg)
-;;;
 
 
 (define-module (skribilo debug)
-   :export (with-debug %with-debug
-	    debug-item skribe-debug set-skribe-debug! add-skribe-debug-symbol
-	    no-debug-color)
-   :use-module (srfi srfi-17))
+  :export (with-debug %with-debug
+	   debug-item skribe-debug set-skribe-debug! add-skribe-debug-symbol
+	   no-debug-color)
+  :use-module (skribilo utils syntax)
+  :use-module (srfi srfi-17))
 
+(set-current-reader %skribilo-module-reader)
+
+
+;;; FIXME: Use SRFI-39 fluids.
+;;; FIXME: Move this to `parameters.scm'?
 
 (define *skribe-debug*			0)
 (define *skribe-debug-symbols*		'())
@@ -160,3 +161,5 @@
 ;	(debug-item 'foo4.2))
 ;      (debug-item 'foo3.3))
 ;   (debug-item 'foo2.4))
+
+;;; debug.scm ends here
diff --git a/src/guile/skribilo/engine.scm b/src/guile/skribilo/engine.scm
index 5b18b5c..1c36e52 100644
--- a/src/guile/skribilo/engine.scm
+++ b/src/guile/skribilo/engine.scm
@@ -21,6 +21,7 @@
 
 (define-module (skribilo engine)
   :use-module (skribilo debug)
+  :use-module (skribilo utils syntax)
   :use-module (skribilo lib)
 
   ;; `(skribilo writer)' depends on this module so it needs to be loaded
@@ -43,6 +44,7 @@
 	   push-default-engine pop-default-engine))
 
 
+(set-current-reader %skribilo-module-reader)
 
 
 ;;;
diff --git a/src/guile/skribilo/engine/lout.scm b/src/guile/skribilo/engine/lout.scm
index 64a3c5d..6d3dbfa 100644
--- a/src/guile/skribilo/engine/lout.scm
+++ b/src/guile/skribilo/engine/lout.scm
@@ -1,30 +1,30 @@
-;*=====================================================================*/
-;*    Lout Skribe engine                                               */
-;*    -------------------------------------------------------------    */
-;*    (C) Copyright 2004, 2005 Ludovic Courtès                         */
-;*                                                                     */
-;*    Taken from `lcourtes@laas.fr--2004-libre/                        */
-;*                skribe-lout--main--0.2--patch-15'                    */
-;*    Based on `latex.skr', copyright 2003,2004 Manuel Serrano.        */
-;*=====================================================================*/
-
-(define-skribe-module (skribilo engine lout))
-
-;*  This is the Lout engine, part of Skribilo.
-;*
-;*  Skribe 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 2 of the License, or
-;*  (at your option) any later version.
-;*
-;*  Skribe 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 Skribe; if not, write to the Free Software
-;*  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+;;; lout.scm  --  A Lout engine.
+;;;
+;;; Copyright 2004, 2005  Ludovic Courtès <ludovic.courtes@laas.fr>
+;;;
+;;;
+;;; This program 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 2 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; This program 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 this program; if not, write to the Free Software
+;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+;;; USA.
+
+;;;    Taken from `lcourtes@laas.fr--2004-libre',
+;;;               `skribe-lout--main--0.2--patch-15'.
+;;;    Based on `latex.skr', copyright 2003, 2004 Manuel Serrano.
+
+
+(define-skribe-module (skribilo engine lout)
+  :autoload (ice-9 rdelim)  (read-line))
 
 
 ;*---------------------------------------------------------------------*/
@@ -1277,8 +1277,10 @@
 		     "`document-type' should be one of `book', `report' or `doc'"
 		     doc-type)))))
 
-(define (lout-structure-number-string markup)
+(define-public (lout-structure-number-string markup)
   ;; Return a structure number string such as "1.2".
+  ;; FIXME: External code has started to rely on this.  This should be
+  ;;        generalized and moved elsewhere.
   (let loop ((struct markup))
     (if (document? struct)
 	""
@@ -1496,7 +1498,7 @@
 ;*    footnote ...                                                     */
 ;*---------------------------------------------------------------------*/
 (markup-writer 'footnote
-   :options '(:number)
+   :options '(:label)
    :before (lambda (n e)
 	     (let ((number (markup-option n :number))
 		   (use-number?
@@ -2777,7 +2779,7 @@
 ;*---------------------------------------------------------------------*/
 ;*    Illustrations                                                    */
 ;*---------------------------------------------------------------------*/
-(define (lout-illustration . args)
+(define-public (lout-illustration . args)
   ;; Introduce a Lout illustration (such as a diagram) whose code is either
   ;; the body of `lout-illustration' or the contents of `file'.  For engines
   ;; other than Lout, an EPS file is produced and then converted if needed.
@@ -2879,7 +2881,7 @@
 ;* At some point, we might want to move this to `slide.scm'.           */
 ;*---------------------------------------------------------------------*/
 
-(use-modules (skribilo packages slide))
+(use-modules (skribilo package slide))
 
 (markup-writer 'slide
    :options '(:title :number :toc :ident) ;; '(:bg :vspace :image)
@@ -2941,8 +2943,8 @@
                (display (lout-embedded-postscript-code
                          (filter pdfmark))))))
 
-For movies, see
-http://www.tug.org/tex-archive/macros/latex/contrib/movie15/movie15.sty .
+;; For movies, see
+;; http://www.tug.org/tex-archive/macros/latex/contrib/movie15/movie15.sty .
 (markup-writer 'slide-embed
    :options '(:alt :geometry :rgeometry :geometry-opt :command)
    ;; FIXME:  `pdfmark'.
diff --git a/src/guile/skribilo/evaluator.scm b/src/guile/skribilo/evaluator.scm
index bbf92e3..e4ef208 100644
--- a/src/guile/skribilo/evaluator.scm
+++ b/src/guile/skribilo/evaluator.scm
@@ -23,7 +23,7 @@
 (define-module (skribilo evaluator)
   :export (skribe-eval skribe-eval-port skribe-load skribe-load-options
 	   skribe-include)
-  :autoload (skribilo parameters) (*verbose*)
+  :autoload (skribilo parameters) (*verbose* *document-path*)
   :autoload (skribilo location)   (<location>)
   :autoload (skribilo ast)        (ast? markup?)
   :autoload (skribilo engine)     (engine? find-engine engine-ident)
@@ -33,7 +33,8 @@
   :autoload (skribilo resolve)    (resolve!))
 
 
-(use-modules (skribilo debug)
+(use-modules (skribilo utils syntax)
+	     (skribilo debug)
 	     (skribilo output)
              (skribilo lib)
 
@@ -43,7 +44,7 @@
 	     (srfi srfi-1))
 
 
-
+(set-current-reader %skribilo-module-reader)
 
 
 (define *skribe-loaded* '())		;; List of already loaded files
@@ -54,15 +55,15 @@
 ;;;
 (define (%evaluate expr)
   (let ((result (eval expr (current-module))))
-    (if (or (ast? result) (markup? result))
+
+    (if (ast? result)
 	(let ((file (source-property expr 'filename))
 	      (line (source-property expr 'line))
 	      (column (source-property expr 'column)))
-	  (format #t "~%~%*** source props for `~a': ~a~%~%"
-		  result (source-properties expr))
 	  (slot-set! result 'loc
 		     (make <location>
 		       :file file :line line :pos column))))
+
     result))
 
 
@@ -71,7 +72,7 @@
 ;;;
 ;;; SKRIBE-EVAL
 ;;;
-(define* (skribe-eval a e #:key (env '()))
+(define* (skribe-eval a e :key (env '()))
   (with-debug 2 'skribe-eval
      (debug-item "a=" a " e=" (engine-ident e))
      (let ((a2 (resolve! a e env)))
@@ -83,8 +84,8 @@
 ;;;
 ;;; SKRIBE-EVAL-PORT
 ;;;
-(define* (skribe-eval-port port engine #:key (env '())
-			                     (reader %default-reader))
+(define* (skribe-eval-port port engine :key (env '())
+			                    (reader %default-reader))
   (with-debug 2 'skribe-eval-port
      (debug-item "engine=" engine)
      (debug-item "reader=" reader)
@@ -92,9 +93,7 @@
      (let ((e (if (symbol? engine) (find-engine engine) engine)))
        (debug-item "e=" e)
        (if (not (engine? e))
-	   (begin
-	     (format #t "engine: ~a~%" e)
-	     (skribe-error 'skribe-eval-port "cannot find engine" engine))
+	   (skribe-error 'skribe-eval-port "cannot find engine" engine)
 	   (let loop ((exp (reader port)))
 	     (with-debug 10 'skribe-eval-port
 		(debug-item "exp=" exp))
@@ -112,7 +111,7 @@
 (define (skribe-load-options)
   *skribe-load-options*)
 
-(define* (skribe-load file #:key (engine #f) (path #f) #:rest opt)
+(define* (skribe-load file :key (engine #f) (path #f) :rest opt)
   (with-debug 4 'skribe-load
      (debug-item "  engine=" engine)
      (debug-item "  path=" path)
@@ -120,7 +119,7 @@
 
      (let* ((ei  (*current-engine*))
 	    (path (append (cond
-			   ((not path) (skribe-path))
+			   ((not path) (*document-path*))
 			   ((string? path) (list path))
 			   ((not (and (list? path) (every? string? path)))
 			    (skribe-error 'skribe-load "illegal path" path))
@@ -159,7 +158,7 @@
 ;;;
 ;;; SKRIBE-INCLUDE
 ;;;
-(define* (skribe-include file #:optional (path (skribe-path)))
+(define* (skribe-include file :optional (path (*document-path*)))
   (unless (every string? path)
     (skribe-error 'skribe-include "illegal path" path))
 
diff --git a/src/guile/skribilo/lib.scm b/src/guile/skribilo/lib.scm
index b15960e..7a0c306 100644
--- a/src/guile/skribilo/lib.scm
+++ b/src/guile/skribilo/lib.scm
@@ -20,9 +20,8 @@
 ;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
 ;;; USA.
 
-(read-set! keywords 'prefix)
-
 (define-module (skribilo lib)
+  :use-module (skribilo utils syntax)
   :export (skribe-eval-location skribe-ast-error skribe-error
            skribe-type-error
            skribe-warning skribe-warning/ast
@@ -32,10 +31,7 @@
 	   %procedure-arity)
 
   :export-syntax (new define-markup define-simple-markup
-                  define-simple-container define-processor-markup
-
-                  ;; for compatibility
-                  unwind-protect unless when)
+                  define-simple-container define-processor-markup)
 
   :use-module (skribilo config)
   :use-module (skribilo ast)
@@ -52,6 +48,7 @@
   :use-module (ice-9 optargs))
 
 
+(set-current-reader %skribilo-module-reader)
 
 
 ;;;
@@ -253,7 +250,6 @@
 ;;; Various things.
 ;;;
 
-(define %skribe-reader (make-reader 'skribe))
 
 (define* (skribe-read #:optional (port (current-input-port)))
   (%skribe-reader port))
@@ -261,18 +257,5 @@
 (define (%procedure-arity proc)
     (car (procedure-property proc 'arity)))
 
-(define-macro (unwind-protect expr1 expr2)
-  ;; This is no completely correct.
-  `(dynamic-wind
-       (lambda () #f)
-       (lambda () ,expr1)
-       (lambda () ,expr2)))
-
-(define-macro (unless condition . exprs)
-  `(if (not ,condition) (begin ,@exprs)))
-
-(define-macro (when condition . exprs)
-  `(if ,condition (begin ,@exprs)))
-
 
 ;;; lib.scm ends here
diff --git a/src/guile/skribilo/location.scm b/src/guile/skribilo/location.scm
index a134f8a..516d8ad 100644
--- a/src/guile/skribilo/location.scm
+++ b/src/guile/skribilo/location.scm
@@ -21,6 +21,7 @@
 
 (define-module (skribilo location)
   :use-module (oop goops)
+  :use-module ((skribilo utils syntax) :select (%skribilo-module-reader))
   :export (<location> location? ast-location
 	   location-file location-line location-pos))
 
@@ -32,7 +33,7 @@
 ;;;
 ;;; Code:
 
-(read-set! keywords 'prefix)
+(set-current-reader %skribilo-module-reader)
 
 
 ;;;
diff --git a/src/guile/skribilo/module.scm b/src/guile/skribilo/module.scm
index 21917b2..b88c3b7 100644
--- a/src/guile/skribilo/module.scm
+++ b/src/guile/skribilo/module.scm
@@ -19,10 +19,14 @@
 ;;; USA.
 
 (define-module (skribilo module)
-  :use-module (skribilo reader)
+  :autoload   (skribilo reader) (make-reader)
   :use-module (skribilo debug)
+  :use-module (system reader confinement) ;; `set-current-reader'
   :use-module (srfi srfi-1)
-  :use-module (ice-9 optargs))
+  :use-module (ice-9 optargs)
+  :use-module (skribilo utils syntax))
+
+(set-current-reader %skribilo-module-reader)
 
 ;;; Author:  Ludovic Courtès
 ;;;
@@ -41,11 +45,9 @@
   '((srfi srfi-1)         ;; lists
     (srfi srfi-13)        ;; strings
     (ice-9 optargs)       ;; `define*'
-    (ice-9 and-let-star)  ;; `and-let*'
-    (ice-9 receive)       ;; `receive'
 
+    (skribilo utils syntax) ;; `unless', `when', etc.
     (skribilo module)
-    (skribilo parameters) ;; run-time parameters
     (skribilo compat)     ;; `skribe-load-path', etc.
     (skribilo ast)        ;; `<document>', `document?', etc.
     (skribilo config)
@@ -57,25 +59,46 @@
     (skribilo writer)
     (skribilo output)
     (skribilo evaluator)
-    (skribilo color)
     (skribilo debug)
-    (skribilo source)     ;; `source-read-lines', `source-fontify', etc.
-    (skribilo coloring lisp) ;; `skribe', `scheme', `lisp'
-    (skribilo coloring xml)  ;; `xml'
     ))
 
+(define %skribilo-user-autoloads
+  ;; List of auxiliary modules that may be lazily autoloaded.
+  '(((skribilo engine lout)   . (lout-illustration
+				 ;; FIXME: The following should eventually be
+				 ;;        removed from here.
+				 lout-structure-number-string))
+    ((skribilo source)        . (source-read-lines source-fontify))
+    ((skribilo coloring lisp) . (skribe scheme lisp))
+    ((skribilo coloring xml)  . (xml))
+    ((skribilo color) .
+     (skribe-color->rgb skribe-get-used-colors skribe-use-color!))
+
+    ((ice-9 and-let-star)     . (and-let*))
+    ((ice-9 receive)          . (receive))))
+
 (define %skribe-core-modules
   '("utils" "api" "bib" "index" "param" "sui"))
 
+
+
+;; The very macro to turn a legacy Skribe file (which uses Skribe's syntax)
+;; into a Guile module.
+
 (define-macro (define-skribe-module name . options)
   `(begin
      (define-module ,name
-       #:reader (make-reader 'skribe)
-       #:use-module (skribilo reader)
+       :use-module ((skribilo reader) :select (%default-reader))
+       :use-module (system reader confinement)
+       :use-module (srfi srfi-1)
+       ,@(append-map (lambda (mod)
+		       (list :autoload (car mod) (cdr mod)))
+		     %skribilo-user-autoloads)
        ,@options)
 
      ;; Pull all the bindings that Skribe code may expect, plus those needed
      ;; to actually create and read the module.
+     ;; TODO: These should be auto-loaded.
      ,(cons 'use-modules
 	    (append %skribilo-user-imports
 		    (filter-map (lambda (mod)
@@ -83,7 +106,12 @@
 						      ,(string->symbol
 							mod))))
 				    (and (not (equal? m name)) m)))
-				%skribe-core-modules)))))
+				%skribe-core-modules)))
+
+     ;; Change the current reader to a Skribe-compatible reader.  If this
+     ;; primitive is not provided by Guile, it should be provided by the
+     ;; `confinement' module (version 0.2 and later).
+     (set-current-reader %default-reader)))
 
 
 ;; Make it available to the top-level module.
@@ -122,38 +150,4 @@ execution of Skribilo/Skribe code."
   %skribilo-user-module)
 
 
-;; FIXME:  This will eventually be replaced by the per-module reader thing in
-;;         Guile.
-(define-public (load-file-with-read file read module)
-  (with-debug 5 'load-file-with-read
-     (debug-item "loading " file)
-
-     (with-input-from-file (search-path %load-path file)
-       (lambda ()
-;      (format #t "load-file-with-read: ~a~%" read)
-	 (let loop ((sexp (read))
-		    (result #f))
-	   (if (not (eof-object? sexp))
-	       (begin
-;              (format #t "preparing to evaluate `~a'~%" sexp)
-		 (primitive-eval sexp)
-		 (loop (read)))))))))
-
-(define-public (load-skribilo-file file reader-name)
-  (load-file-with-read file (make-reader reader-name) (current-module)))
-
-(define*-public (load-skribe-modules #:optional (debug? #f))
-  "Load the core Skribe modules, both in the @code{(skribilo skribe)}
-hierarchy and in @code{(run-time-module)}."
-  (for-each (lambda (mod)
-              (format #t "~~ loading skribe module `~a'...~%" mod)
-              (load-skribilo-file (string-append "skribilo/skribe/"
-                                                 mod ".scm")
-                                  'skribe)
-              (module-use! (run-time-module)
-                           (resolve-module `(skribilo skribe
-                                             ,(string->symbol mod)))))
-            %skribe-core-modules))
-
-
 ;;; module.scm ends here
diff --git a/src/guile/skribilo/output.scm b/src/guile/skribilo/output.scm
index cbd4523..8110418 100644
--- a/src/guile/skribilo/output.scm
+++ b/src/guile/skribilo/output.scm
@@ -1,33 +1,38 @@
-;;;; output.scm  --  Skribilo output stage.
-;;;;
-;;;; Copyright 2003-2004  Erick Gallesio - I3S-CNRS/ESSI <eg@unice.fr>
-;;;;
-;;;;
-;;;; This program 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 2 of the License, or
-;;;; (at your option) any later version.
-;;;;
-;;;; This program 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 this program; if not, write to the Free Software
-;;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-;;;; USA.
+;;; output.scm  --  Skribilo output stage.
+;;;
+;;; Copyright 2003-2004  Erick Gallesio - I3S-CNRS/ESSI <eg@unice.fr>
+;;; Copyright 2005  Ludovic Courtès <ludovic.courtes@laas.fr>
+;;;
+;;;
+;;; This program 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 2 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; This program 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 this program; if not, write to the Free Software
+;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+;;; USA.
 
 
 (define-module (skribilo output)
   :export (output)
-  :use-module (skribilo ast)
-  :use-module (skribilo writer)
+  :autoload   (skribilo engine) (engine-ident)
+  :autoload   (skribilo writer) (writer? writer-ident lookup-markup-writer)
   :use-module (skribilo lib)
+  :use-module (skribilo ast)
   :use-module (skribilo debug)
+  :use-module (skribilo utils syntax)
   :use-module (oop goops))
 
+(set-current-reader %skribilo-module-reader)
 
+
 (define-generic out)
 
 (define (%out/writer n e w)
diff --git a/src/guile/skribilo/package/slide.scm b/src/guile/skribilo/package/slide.scm
index 37ee054..f5f0011 100644
--- a/src/guile/skribilo/package/slide.scm
+++ b/src/guile/skribilo/package/slide.scm
@@ -119,33 +119,52 @@
 ;*---------------------------------------------------------------------*/
 (define %slide-old-ref ref)
 
-(define-markup (ref #!rest opt #!key (slide #f))
-   (if (not slide)
-       (apply %slide-old-ref opt)
-       (new unresolved
-	  (proc (lambda (n e env)
-		   (cond
-		      ((eq? slide 'next)
-		       (let ((c (assq n %slide-the-slides)))
-			  (if (pair? c)
-			      (handle (cadr c))
-			      #f)))
-		      ((eq? slide 'prev)
-		       (let ((c (assq n (reverse %slide-the-slides))))
-			  (if (pair? c)
-			      (handle (cadr c))
-			      #f)))
-		      ((number? slide)
-		       (let loop ((s %slide-the-slides))
-			  (cond
-			     ((null? s)
-			      #f)
-			     ((= slide (markup-option (car s) :number))
-			      (handle (car s)))
-			     (else
-			      (loop (cdr s))))))
-		      (else
-		       #f)))))))
+;; Extend the definition of `ref'.
+;; FIXME: This technique breaks `ref' for some reason.
+; (set! ref
+;       (lambda args
+; 	;; Filter out ARGS and look for a `:slide' keyword argument.
+; 	(let loop ((slide #f)
+; 		   (opt '())
+; 		   (args args))
+; 	  (if (null? args)
+; 	      (set! opt (reverse! opt))
+; 	      (let ((s? (eq? (car args) :slide)))
+; 		(loop (if s? (cadr args) #f)
+; 		      (if s? opt (cons (car args) opt))
+; 		      (if s? (cddr args) (cdr args)))))
+
+; 	  (format (current-error-port)
+; 		  "slide.scm:ref: slide=~a opt=~a~%" slide opt)
+
+; 	  (if (not slide)
+; 	      (apply %slide-old-ref opt)
+; 	      (new unresolved
+; 		   (proc (lambda (n e env)
+; 			   (cond
+; 			    ((eq? slide 'next)
+; 			     (let ((c (assq n %slide-the-slides)))
+; 			       (if (pair? c)
+; 				   (handle (cadr c))
+; 				   #f)))
+; 			    ((eq? slide 'prev)
+; 			     (let ((c (assq n (reverse %slide-the-slides))))
+; 			       (if (pair? c)
+; 				   (handle (cadr c))
+; 				   #f)))
+; 			    ((number? slide)
+; 			     (let loop ((s %slide-the-slides))
+; 			       (cond
+; 				((null? s)
+; 				 #f)
+; 				((= slide (markup-option
+; 					   (car s) :number))
+; 				 (handle (car s)))
+; 				(else
+; 				 (loop (cdr s))))))
+; 			    (else
+; 			     #f)))))))))
+
 
 ;*---------------------------------------------------------------------*/
 ;*    slide-pause ...                                                  */
@@ -368,6 +387,8 @@
 (define &latex-play #f)
 (define &latex-play* #f)
 
+;;; FIXME: We shouldn't load `latex.scm' from here.  Instead, we should
+;;; register a hook on its load.
 (let ((le (find-engine 'latex)))
    ;; slide-vspace
    (markup-writer 'slide-vspace le
diff --git a/src/guile/skribilo/parameters.scm b/src/guile/skribilo/parameters.scm
index d8b259f..baab5ba 100644
--- a/src/guile/skribilo/parameters.scm
+++ b/src/guile/skribilo/parameters.scm
@@ -35,18 +35,39 @@
 ;;; Switches.
 ;;;
 
-(define-public *verbose*       (make-parameter #f))
-(define-public *warning*       (make-parameter 5))
+(define (make-expect pred pred-name parameter)
+  (let ((msg (string-append parameter ": " pred-name " expected")))
+    (lambda (val)
+      (if (pred val)
+	  val
+	  (error msg val)))))
+
+(define-macro (define-number-parameter name)
+  `(define-public ,name
+     (make-parameter 0
+		     (make-expect number? "number" ,(symbol->string name)))))
+
+(define-number-parameter *verbose*)
+(define-number-parameter *warning*)
+
 (define-public *load-rc-file?* (make-parameter #f))
 
 ;;;
 ;;; Paths.
 ;;;
 
-(define-public *document-path* (make-parameter (list ".")))
-(define-public *bib-path*      (make-parameter (list ".")))
-(define-public *source-path*   (make-parameter (list ".")))
-(define-public *image-path*    (make-parameter (list ".")))
+
+(define-macro (define-path-parameter name)
+  `(define-public ,name
+     (make-parameter (list ".")
+		     (make-expect list? "list" ,(symbol->string name)))))
+
+
+(define-path-parameter *document-path*)
+(define-path-parameter *bib-path*)
+(define-path-parameter *source-path*)
+(define-path-parameter *image-path*)
+
 
 ;;;
 ;;; Files.
diff --git a/src/guile/skribilo/resolve.scm b/src/guile/skribilo/resolve.scm
index 7075f2d..cc1b14f 100644
--- a/src/guile/skribilo/resolve.scm
+++ b/src/guile/skribilo/resolve.scm
@@ -1,40 +1,37 @@
-;;;;
-;;;; resolve.stk	-- Skribe Resolve Stage
-;;;;
-;;;; Copyright © 2003-2004 Erick Gallesio - I3S-CNRS/ESSI <eg@unice.fr>
-;;;;
-;;;;
-;;;; This program 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 2 of the License, or
-;;;; (at your option) any later version.
-;;;;
-;;;; This program 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 this program; if not, write to the Free Software
-;;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-;;;; USA.
-;;;;
-;;;;           Author: Erick Gallesio [eg@essi.fr]
-;;;;    Creation date: 13-Aug-2003 18:39 (eg)
-;;;; Last file update: 17-Feb-2004 14:43 (eg)
-;;;;
+;;; resolve.scm  --  Skribilo reference resolution.
+;;;
+;;; Copyright 2003-2004  Erick Gallesio - I3S-CNRS/ESSI <eg@unice.fr>
+;;; Copyright 2005  Ludovic Courtès <ludovic.courtes@laas.fr>
+;;;
+;;;
+;;; This program 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 2 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; This program 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 this program; if not, write to the Free Software
+;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+;;; USA.
 
 (define-module (skribilo resolve)
   :use-module (skribilo debug)
   :use-module (skribilo runtime)
   :use-module (skribilo ast)
-  :use-module (skribilo lib)  ;; `unless' and `when'
+  :use-module (skribilo utils syntax)
 
   :use-module (oop goops)
 
   :export (resolve! resolve-search-parent resolve-children resolve-children*
 	   find1 resolve-counter resolve-parent resolve-ident))
 
+(set-current-reader %skribilo-module-reader)
+
 
 (define *unresolved* #f)
 (define-generic do-resolve!)
diff --git a/src/guile/skribilo/skribe/Makefile.am b/src/guile/skribilo/skribe/Makefile.am
index 2850c4d..e005313 100644
--- a/src/guile/skribilo/skribe/Makefile.am
+++ b/src/guile/skribilo/skribe/Makefile.am
@@ -1,2 +1,2 @@
-guilemoduledir = $(GUILE_SITE)/skribilo
+guilemoduledir = $(GUILE_SITE)/skribilo/skribe
 dist_guilemodule_DATA = api.scm bib.scm index.scm param.scm sui.scm utils.scm
diff --git a/src/guile/skribilo/skribe/bib.scm b/src/guile/skribilo/skribe/bib.scm
index 0a80ec9..2bc2238 100644
--- a/src/guile/skribilo/skribe/bib.scm
+++ b/src/guile/skribilo/skribe/bib.scm
@@ -19,7 +19,8 @@
 ;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
 ;;; USA.
 
-(define-skribe-module (skribilo skribe bib))
+(define-skribe-module (skribilo skribe bib)
+  :use-module (skribilo biblio))
 
 ;;; Author:  Manuel Serrano
 ;;; Commentary:
diff --git a/src/guile/skribilo/source.scm b/src/guile/skribilo/source.scm
index bd523f2..e4f9973 100644
--- a/src/guile/skribilo/source.scm
+++ b/src/guile/skribilo/source.scm
@@ -20,16 +20,17 @@
 ;;;; USA.
 ;;;;
 
-
 (define-module (skribilo source)
   :export (<language> language? language-extractor language-fontifier
 	   source-read-lines source-read-definition source-fontify)
+  :use-module (skribilo utils syntax)
   :use-module (skribilo parameters)
   :use-module (skribilo lib)
   :use-module (oop goops)
   :use-module (ice-9 rdelim))
 
-(read-set! keywords 'prefix)
+
+(set-current-reader %skribilo-module-reader)
 
 
 ;;;
diff --git a/src/guile/skribilo/utils/Makefile.am b/src/guile/skribilo/utils/Makefile.am
new file mode 100644
index 0000000..810ee48
--- /dev/null
+++ b/src/guile/skribilo/utils/Makefile.am
@@ -0,0 +1,4 @@
+guilemoduledir = $(GUILE_SITE)/skribilo/utils
+dist_guilemodule_DATA = syntax.scm
+
+## arch-tag: 3a18b64b-1da2-417b-8338-2c534bca277f
diff --git a/src/guile/skribilo/utils/syntax.scm b/src/guile/skribilo/utils/syntax.scm
new file mode 100644
index 0000000..24e8efa
--- /dev/null
+++ b/src/guile/skribilo/utils/syntax.scm
@@ -0,0 +1,68 @@
+;;; syntax.scm  --  Syntactic candy for Skribilo modules.
+;;;
+;;; Copyright 2005  Ludovic Courtès <ludovic.courtes@laas.fr>
+;;;
+;;;
+;;; This program 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 2 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; This program 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 this program; if not, write to the Free Software
+;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+;;; USA.
+
+(define-module (skribilo utils syntax)
+  #:use-module (skribilo reader)
+  #:use-module (system reader library)
+  #:use-module (system reader confinement)
+  #:export (%skribe-reader %skribilo-module-reader)
+  #:export-syntax (unwind-protect unless when))
+
+;;; Author:  Ludovic Courtès
+;;;
+;;; Commentary:
+;;;
+;;; A reader for the Skribe syntax, i.e. roughly R5RS Scheme plus DSSSL-style
+;;; keywords and sk-exps (expressions introduced using a square bracket).
+;;;
+;;; Code:
+
+(define %skribilo-module-reader
+  ;; The syntax used to read Skribilo modules.
+  (make-alternate-guile-reader '(colon-keywords
+				 no-scsh-block-comments
+				 srfi30-block-comments
+				 srfi62-sexp-comments)
+			       (lambda (chr port read)
+				 (error "unexpected character in Skribilo module"
+					chr))
+			       'reader/record-positions))
+
+(define %skribe-reader
+  ;; The Skribe syntax reader.
+  (make-reader 'skribe))
+
+
+(define-macro (unwind-protect expr1 expr2)
+  ;; This is no completely correct.
+  `(dynamic-wind
+       (lambda () #f)
+       (lambda () ,expr1)
+       (lambda () ,expr2)))
+
+(define-macro (unless condition . exprs)
+  `(if (not ,condition) (begin ,@exprs)))
+
+(define-macro (when condition . exprs)
+  `(if ,condition (begin ,@exprs)))
+
+;;; arch-tag: 9a0e0638-64f0-480a-ab19-49e8bfcbcd9b
+
+;;; syntax.scm ends here
diff --git a/src/guile/skribilo/verify.scm b/src/guile/skribilo/verify.scm
index aa2dd78..f407c87 100644
--- a/src/guile/skribilo/verify.scm
+++ b/src/guile/skribilo/verify.scm
@@ -1,42 +1,41 @@
-;;;;
-;;;; verify.stk				-- Skribe Verification Stage
-;;;;
-;;;; Copyright © 2003-2004 Erick Gallesio - I3S-CNRS/ESSI <eg@unice.fr>
-;;;;
-;;;;
-;;;; This program 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 2 of the License, or
-;;;; (at your option) any later version.
-;;;;
-;;;; This program 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 this program; if not, write to the Free Software
-;;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
-;;;; USA.
-;;;;
-;;;;           Author: Erick Gallesio [eg@essi.fr]
-;;;;    Creation date: 13-Aug-2003 11:57 (eg)
-;;;; Last file update: 27-Oct-2004 16:35 (eg)
-;;;;
+;;; verify.scm  --  Skribe AST verification.
+;;;
+;;; Copyright 2003-2004  Erick Gallesio - I3S-CNRS/ESSI <eg@unice.fr>
+;;; Copyright 2005  Ludovic Courtès <ludovic.courtes@laas.fr>
+;;;
+;;;
+;;; This program 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 2 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; This program 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 this program; if not, write to the Free Software
+;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+;;; USA.
 
 (define-module (skribilo verify)
-   :export (verify))
+  :autoload (skribilo engine) (engine-ident)
+  :autoload (skribilo writer) (writer? writer-options lookup-markup-writer)
+  :autoload (skribilo lib)    (skribe-warning/ast skribe-warning
+			       skribe-error)
+  :export (verify))
 
 (use-modules (skribilo debug)
-	     (skribilo engine)
-	     (skribilo writer)
 	     (skribilo runtime)
 	     (skribilo ast)
-	     (skribilo lib)     ;; `when', `unless'
+	     (skribilo utils syntax)
 	     (oop goops))
 
+(set-current-reader %skribilo-module-reader)
 
 
+
 (define-generic verify)
 
 ;;;
@@ -158,3 +157,5 @@
 	    (slot-ref e 'customs))
 
    node)
+
+;;; verify.scm ends here
\ No newline at end of file
diff --git a/src/guile/skribilo/writer.scm b/src/guile/skribilo/writer.scm
index b393c5c..db36509 100644
--- a/src/guile/skribilo/writer.scm
+++ b/src/guile/skribilo/writer.scm
@@ -32,6 +32,7 @@
 	   invoke markup-writer markup-writer-get markup-writer-get*
 	   lookup-markup-writer copy-markup-writer)
 
+  :use-module (skribilo utils syntax)
   :autoload (skribilo engine) (engine? engine-ident? default-engine))
 
 
@@ -44,6 +45,9 @@
 	     (ice-9 optargs))
 
 
+(set-current-reader %skribilo-module-reader)
+
+
 
 ;;;
 ;;; Class definition.
diff --git a/src/skribilo.in b/src/skribilo.in
new file mode 100644
index 0000000..5508e10
--- /dev/null
+++ b/src/skribilo.in
@@ -0,0 +1,7 @@
+#!/bin/sh
+# The `skribilo' executable.
+
+main='(module-ref (resolve-module '\''(skribilo)) '\'main')'
+exec ${GUILE-@GUILE@} --debug \
+                      -c "(apply $main (cdr (command-line)))" "$@"
+