From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jambunathan K Subject: Re: unnumbered subsections in latex export Date: Fri, 01 Apr 2011 13:09:21 +0530 Message-ID: <81mxka774m.fsf@gmail.com> References: <20110322051038.21655c80@kuru.homelinux.net> <80d3lj9wj6.fsf@somewhere.org> <20110322053134.669127e9@kuru.homelinux.net> <8999.1300804510@alphaville.dokosmarshall.org> <20110322160814.227fc53f@bhishma.homelinux.net> <27844.1300836065@alphaville.usa.hp.com> <8162r9hgxm.fsf@gmail.com> <87bp11dk4h.fsf@gnu.org> <87tyejymto.fsf@gmail.com> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from [140.186.70.92] (port=46427 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Q5YxL-0002fX-J3 for emacs-orgmode@gnu.org; Fri, 01 Apr 2011 03:39:45 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Q5YxI-00084y-Dc for emacs-orgmode@gnu.org; Fri, 01 Apr 2011 03:39:42 -0400 Received: from mail-iw0-f169.google.com ([209.85.214.169]:57568) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Q5YxI-00084W-8r for emacs-orgmode@gnu.org; Fri, 01 Apr 2011 03:39:40 -0400 Received: by iwg8 with SMTP id 8so4218522iwg.0 for ; Fri, 01 Apr 2011 00:39:39 -0700 (PDT) In-Reply-To: <87tyejymto.fsf@gmail.com> (Nicolas's message of "Thu, 31 Mar 2011 23:58:11 +0200") List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Nicolas Cc: Bastien , nicholas.dokos@hp.com, emacs-orgmode@gnu.org > I'll show two examples to illustrate my point: lists and tables. Taken > from a docstring, > > 1. first item > + sub-item one > + [X] sub-item two > more text in first item > 2. [@3] last item > > will be parsed as: > > (ordered (nil \"first item\" > (unordered (nil "sub-item one") > (nil "[CBON] sub-item two")) > "more text in first item"") > (3 "last item")) > > This allows to easily (see org-list-to-latex, org-list-to-html, > org-list-to-texinfo, and so on) transform an Org list in many different > formats. Alas, it cannot be used in org-html.el and org-docbook.el, as > those, again, parse buffer line-wise. > > The same could be said about tables: > > | Row 1 | 1 | 2 | > |-------+---+---| > | Row 2 | 3 | 4 | > > can be parsed as: > > (("Row 1" "1" "2") > 'hline > ("Row 2" "3" "4")) > > and from that, such functions as orgtbl-to-html, or orgtbl-to-latex were > easy to create. > > So, basically, what I suggest here is: > > 1. list all possible environments and objects offered by the Org format > (table, lists, inlinetasks, center, verbatim, paragraph, headlines, > time-stamps, LaTeX snippets, footnotes, links, source); > 2. define an explicit export format for each of them; > 3. determine options that should be know by org-exp, by the backend; > 4. create a parser, in org-exp, that will output Org buffer in the > chosen format; > 5. create (many are readily available) functions for each backend to > interpret them. > > > Now about that explicit format. Taking this buffer, > > #+title: Example buffer > > Some text before first headline. > > * First section > > First paragraph $\alpha = 1$. > > Second paragraph. > > - item 1 > - item 2 > #+begin_center > Text > #+end_center > > | Row 1 | 1 | 2 | > | Row 2 | 3 | 4 | > > * Second section > > Text with footnote[fn:1]. > *************** Inline task > Some text and > a [[http://www.gnu.org/software/emacs/][link]] > :DRAWER: > - I like > - lists. > :END: > *************** END > > * Footnotes > [fn:1] Footnote definition. > > It could be parsed as the following: > > '((:title "Example buffer") > (paragraph "Some text before first headline.") > (headline "First section" > (paragraph "First paragraph " > (latex "$\alpha = 1") > ".") > (paragraph "Second paragraph") > (list unordered (nil "item 1") > (nil "item 2") > (center (paragraph "Text"))) > (table ("Row 1" "1" "2") > hline > ("Row 2" "3" "4"))) > (headline "Second section" > (paragraph "Text with footnote" > (footnote "Footnote definition") > ".") > (inlinetask "Inline task" > (paragraph "Some text and\na " > (link "link" "http://www.gnu.org/")) > (drawer (list unordered (nil "I like") > (nil "lists.")))))) > > Note that such a parsing will need a decent forward-paragraph function. > It's also a very simplified example: headlines would need more than the > title string (todo keyword, priority, tags) before starting the body. > > I have no code to offer at the moment, and, as we all know, Devil is in > the details. But if the output from org-exp.el is clear, exporters will > be more coherent. It is even provide tools to help exporters doing their > task (a function to extract footnotes from the output, for example). > > Again, it may be a big task to undertake, but I think it will be > necessary at some point. Such an exporter (or similar in spirit to what you say) exists already. For the sake of record, I am copying Bastien's notes on his ./EXPERIMENTAL/org-export.el (with some non-relevant content stripped) Jambunathan K. Attachment: From: Bastien Subject: Re: OpenDocumentText/OpenOffice exporter To: Lennart Borgman Cc: Jambunathan K , Carsten Dominik Date: Sun, 13 Feb 2011 11:00:34 +0100 (6 weeks, 4 days, 21 hours ago) Message-ID: <87tyg8ntj1.fsf@gnu.org> Hi Lennart, Lennart Borgman writes: > Perhaps we have done something very similar then, I do not know. My bad. I should have advertize EXPERIMENTAL/org-export.el sooner. > So maybe your approach of parsing the org buffer to a list makes > things more easy to handle. On what level is the list? (From your > description I guess it is a "parse tree" or whatever it is called. Not > a list of tokens.) It's a parse tree. See attached example of a test.org file and the result of the function (org-export-parse) : this list will go through the exporter, which takes care of every subtree recursively. Of course, having such a parse tree does not solve everything, and the content of :content remains to be handled... but at least it makes things quite clear. [2. text/x-org; test.org] #+TITLE: Test parse file #+AUTHOR: Bastien * A first heading Some text here. * WAITING A heading with metadata :Write: The parse tree contains information about the current subtree. ** A subtree Hello. [3. text/plain; test_parsed.txt] ((:level 1 :heading #("A first heading" 0 15 (fontified t font-lock-fontified t face org-level-1)) :properties (("FILE" . "/home/guerry/test.org") ("BLOCKED" . "") ("CATEGORY" . "test")) :content #("\nSome text here.\n\n" 0 1 (fontified t font-lock-fontified t org-category "test") 1 17 (fontified t font-lock-fontified t org-category "test") 17 18 (fontified t font-lock-fontified t org-category "test")) :subtree nil) (:level 1 :heading #("A heading with metadata" 0 23 (fontified t font-lock-fontified t org-todo-head "NEXT" face org-level-1 org-category "test")) :properties (("TODO" . "WAITING") ("FILE" . "/home/guerry/test.org") ("TAGS" . ":Write:") ("ALLTAGS" . ":Write:") ("BLOCKED" . "") ("CATEGORY" . "test")) :content #("\nThe parse tree contains information about the current subtree.\n\n" 0 1 (org-todo-head "NEXT" fontified t org-category "test") 1 64 (org-todo-head "NEXT" fontified t org-category "test") 64 65 (org-todo-head "NEXT" fontified t org-category "test")) :subtree ((:level 2 :heading #("A subtree" 0 9 (org-todo-head "NEXT" fontified t face org-level-2 org-category "test")) :properties (("FILE" . "/home/guerry/test.org") ("ALLTAGS" . #(":Write:" 1 6 (inherited t))) ("BLOCKED" . "") ("CATEGORY" . "test")) :content #("\nHello.\n" 0 1 (org-todo-head "NEXT" fontified t org-category "test") 1 7 (org-todo-head "NEXT" fontified t org-category "test") 7 8 (fontified t font-lock-fontified t org-category "test")) :subtree nil))))