<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
<HTML>
<HEAD>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
  <META NAME="GENERATOR" CONTENT="GtkHTML/3.18.3">
</HEAD>
<BODY>
I've been playing around with a way to partially automate writing outline-based pages and run into something I don't know how to do. I'm hoping someone can perhaps offer a solution or point me in the right direction. I've reduced the scope to a fairly simple situation which might seem unmotivated in this form. But if I can find a way to do this, the rest of what I'm doing will fall into place. <BR>
<BR>
I'd like to be able to write code that looks like this (example):<BR>
<BR>
<PRE>
<FONT COLOR="#003300">(let ((hform "A Title"))</FONT>
<FONT COLOR="#003300">  (with-html-output (*standard-output* nil :indent 0)</FONT>
<FONT COLOR="#003300">    (section (hform)</FONT>
<FONT COLOR="#003300">          (:p "A paragraph can go here. ")</FONT>
<FONT COLOR="#003300">          (section ("A Subtitle")</FONT>
<FONT COLOR="#003300">            "Subsection text goes here."))</FONT>
<FONT COLOR="#003300">    (section ("Second Title")</FONT>
<FONT COLOR="#003300">      "Any cl-who syntax input here:"</FONT>
<FONT COLOR="#003300">      (:ol (:li "Item 1")</FONT>
<FONT COLOR="#003300">           (:li "Item 2")))))</FONT>

</PRE>
where SECTION would be a macro so that it can take CL-WHO syntax arguments. The idea is that the SECTION macro would expand so that I ended up effectively with this:<BR>
<BR>
<PRE>
<FONT COLOR="#003300">(let ((form "A Title"))</FONT>
<FONT COLOR="#003300">  (with-html-output (*standard-output* nil :indent 0)</FONT>
<FONT COLOR="#003300">    (:h1 (str form))</FONT>
<FONT COLOR="#003300">    (:p "A paragraph can go here. ")</FONT>
<FONT COLOR="#003300">    (:h2 "A Subtitle")</FONT>
<FONT COLOR="#003300">    "Subsection text goes here."</FONT>
<FONT COLOR="#003300">    (:h1 "Second Title")</FONT>
<FONT COLOR="#003300">    "Any cl-who syntax input here:"</FONT>
<FONT COLOR="#003300">    (:ol (:li "Item 1")</FONT>
<FONT COLOR="#003300">         (:li "Item 2"))))</FONT>

</PRE>
I came up with a helper macro like this to handle the levels as a variable:<BR>
<BR>
<PRE>
<FONT COLOR="#000000">(defmacro hn (level &body body)</FONT>
<FONT COLOR="#000000">  ``(,(intern (format nil "H~d" ,level) :keyword)</FONT>
<FONT COLOR="#000000">       ,,@body))</FONT>

<FONT COLOR="#000000">(let ((lvl 2)</FONT>
<FONT COLOR="#000000">      (title "A Title"))</FONT>
<FONT COLOR="#000000">  (with-html-output (*standard-output*)</FONT>
<FONT COLOR="#000000">    (str (hn lvl (:b (str title))))))</FONT>

;; => <h2><b>A Title</b></h2>

</PRE>
This enables me to write code that looks like this:<BR>
<BR>
<PRE>
<FONT COLOR="#003300">(defmacro section ((n &rest heading) &body body)</FONT>
<FONT COLOR="#003300">  `(str (with-html-output-to-string (s nil :indent 0)</FONT>
<FONT COLOR="#003300">          (str (hn ,n ,@heading))</FONT>
<FONT COLOR="#003300">          (str (with-html ,@body)))))</FONT>

<FONT COLOR="#003300">(let ((lvl 1)</FONT>
<FONT COLOR="#003300">      (form "A Title"))</FONT>
<FONT COLOR="#003300">  (with-html-output (*standard-output* nil :indent 0)</FONT>
<FONT COLOR="#003300">    (section (lvl form)</FONT>
<FONT COLOR="#003300">          (:p "A paragraph can go here. ")</FONT>
<FONT COLOR="#003300">          (section ((1+ lvl) "A Subtitle")</FONT>
<FONT COLOR="#003300">            "Subsection text goes here."))</FONT>
<FONT COLOR="#003300">    (section (lvl "Second Title")</FONT>
<FONT COLOR="#003300">      "Any cl-who syntax input here:"</FONT>
<FONT COLOR="#003300">      (:ol (:li "Item 1")</FONT>
<FONT COLOR="#003300">           (:li "Item 2")))))</FONT>
</PRE>
<BR>
<FONT COLOR="#000000">But this leaves me with having to manage the levels manually. What I can't figure out how to do is write the SECTION macro so it doesn't require the LVL arguments, incrementing them recursively. </FONT><BR>
<BR>
<FONT COLOR="#000000">If it could be written as a function, I could use a closure that started at LVL = 1 and incremented at each level, but I'm not good enough with macros to see how to do this. </FONT>
<PRE>

I'm probably looking at this the wrong way. Does anyone have any ideas how to go about this?

Regards,
Jeff Cunningham

</PRE>
<BR>
<BR>
<BR>
</BODY>
</HTML>