Re: (dsssl) Smallcap fonts for <acronym> in docbook

Subject: Re: (dsssl) Smallcap fonts for <acronym> in docbook
From: Eric Brunel <eric_brunel@xxxxxxxx>
Date: Thu, 20 Sep 2001 01:19:35 -0700 (PDT)
Hi Krish,

--- "V.Krishna Kumar" <lvimala@xxxxxxx> wrote:
> I need to 
> use smallcaps for <acronym>. How do I do that ?

I don't know DocBook stylesheets, so maybe there's a
much better solution than the one I give below. I had
the same problem with a DTD and stylesheet I wrote and
I couldn't find a simple way to do that. I finally
wrote a set of procedures converting a string to the
corresponding sosofo for its small caps. Here is the
code (it's a bit ugly, and very "lispian"...):

; ====================
; PROCEDURE SMALL.CAPS
; ====================
; Return a sosofo containing the string as small caps

; PROCEDURE SPLIT-CASE:
; Splits a string as a list of chars according to the
chars' cases
; Returns the splitted string with the case of the
first char as first element

(define (split-case l)
  (cond
    ((null? l) (list 'undefined '()))
    (#t
      (let*
        ((c (car l))
         (uc (char-upcase c))
         (is-lower (not (char=? c uc)))
         (first-case (if is-lower 'lower 'upper))
         (res (split-case (cdr l)))
         (last-case (car res))
         (splitted-cdr (car (cdr res)))
        )
        (cond
          ((equal? last-case 'undefined) (list
first-case (list (list uc))))
          ((equal? first-case last-case) (list
first-case (cons (cons uc (car splitted-cdr)) (cdr
splitted-cdr))))
          (#t                            (list
first-case (cons (list uc) splitted-cdr)))
        )
      )
    )
  )
)


; PROCEDURE MAKE-SMALL-CAPS:
; Builds the sosofos for a splitted string

(define (make-small-caps l size first-is-lower)
  (cond
    ((null? l) (empty-sosofo))
    (#t
      (make sequence
        (make sequence
          use: (style font-size: (if first-is-lower (*
size 0.75) size))
          (literal (list->string (car l)))
        )
        (make-small-caps (cdr l) size (not
first-is-lower))
      )
    )
  )
)


; PROCEDURE SMALL-CAPS:
; Builds the sosofos for the small caps of a string

(define (small-caps str size)
  (let ((l (split-case (string->list str))))
    (make-small-caps (car (cdr l)) size (equal? (car
l) 'lower))
  )
)

To use it, you'll have to include the procedures in
your stylesheet, then put in the processing section
for the "acronym" element a code looking like:
(small-caps (data current-node) *font-size*)

Be sure also to declare a default language in your
stylesheet via the (declare-default-language ...)
instruction, or else OpenJade won't know how to
convert characters to upper case...

Hope this will be helpful. But there's probably a much
better way to do that than mine...
 - eric -


__________________________________________________
Terrorist Attacks on U.S. - How can you help?
Donate cash, emergency relief information
http://dailynews.yahoo.com/fc/US/Emergency_Information/

 DSSSList info and archive:  http://www.mulberrytech.com/dsssl/dssslist

Current Thread