From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lawrence Mitchell Subject: Re: [Feature Request] Cross headings in tables Date: Wed, 02 Feb 2011 12:30:12 +0000 Message-ID: References: <87ocb96ebn.fsf@Rainer.invalid> <87eic4le49.fsf@Rainer.invalid> <87d3nwzo22.fsf@Rainer.invalid> Mime-Version: 1.0 Content-Type: text/plain Return-path: Received: from [140.186.70.92] (port=54203 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PkdhQ-0003Kc-Tg for emacs-orgmode@gnu.org; Wed, 02 Feb 2011 09:28:55 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PkbrE-0004qE-ML for emacs-orgmode@gnu.org; Wed, 02 Feb 2011 07:30:50 -0500 Received: from lo.gmane.org ([80.91.229.12]:39843) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PkbrE-00044c-9b for emacs-orgmode@gnu.org; Wed, 02 Feb 2011 07:30:48 -0500 Received: from list by lo.gmane.org with local (Exim 4.69) (envelope-from ) id 1Pkbqr-0005eT-Pe for emacs-orgmode@gnu.org; Wed, 02 Feb 2011 13:30:25 +0100 Received: from e4300lm.epcc.ed.ac.uk ([129.215.63.156]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 02 Feb 2011 13:30:25 +0100 Received: from wence by e4300lm.epcc.ed.ac.uk with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Wed, 02 Feb 2011 13:30:25 +0100 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: emacs-orgmode@gnu.org Cc: Achim Gratz Achim Gratz wrote: [...] > The first header is still determined like it always was. Headers inside > table need to get a special "hline", the choice of "~" for this was > dictated by most of the other characters already being used for various > markup inside or outside tables. When I say "halfway there", I mean > that the export is working and the lines are recognized as hlines > everywhere I could find (there may still be some regexpressions floating > around that don't). However, aligning tables will replace the wigglies > with plain dashes since I have not yet found a way to inject the correct > character for the currently hardcoded "-". The HTML export for the > above table looks like this: [...] > If somebody has an idea how to make the table alignment work, please > lend me a hand. Experimental patch is attached, comments are > welcome. How about the following two patches on top. The first fixes table alignment, the second fixes LaTeX export of these tables. >From c555b7e15b617538490210a041bd4af45e51d752 Mon Sep 17 00:00:00 2001 From: Lawrence Mitchell Date: Wed, 2 Feb 2011 12:20:12 +0000 Subject: [PATCH 1/2] Correctly realign tables with internal headers To: emacs-orgmode@gnu.org * lisp/org-table.el (org-table-align): Deal with internal headers (specified by ?~) when realigning. --- lisp/org-table.el | 38 ++++++++++++++++++++++++-------------- 1 files changed, 24 insertions(+), 14 deletions(-) diff --git a/lisp/org-table.el b/lisp/org-table.el index 9437ae1..498a6fc 100644 --- a/lisp/org-table.el +++ b/lisp/org-table.el @@ -632,7 +632,7 @@ When nil, simply write \"#ERROR\" in corrupted fields.") lines (new "") lengths l typenums ty fields maxfields i column (indent "") cnt frac - rfmt hfmt + rfmt hfmt tfmt (spaces '(1 . 1)) (sp1 (car spaces)) (sp2 (cdr spaces)) @@ -640,6 +640,8 @@ When nil, simply write \"#ERROR\" in corrupted fields.") (make-string sp2 ?\ ) "%%%s%ds" (make-string sp1 ?\ ) "|")) (hfmt1 (concat (make-string sp2 ?-) "%s" (make-string sp1 ?-) "+")) + (tfmt1 (concat + (make-string sp2 ?~) "%s" (make-string sp1 ?~) "+")) emptystrings links dates emph raise narrow falign falign1 fmax f1 len c e space) (untabify beg end) @@ -680,17 +682,19 @@ When nil, simply write \"#ERROR\" in corrupted fields.") ;; Mark the hlines by setting the corresponding element to nil ;; At the same time, we remove trailing space. (setq lines (mapcar (lambda (l) - (if (string-match "^ *|[-~]" l) - nil - (if (string-match "[ \t]+$" l) - (substring l 0 (match-beginning 0)) - l))) + (cond ((string-match "^ *|[-]" l) + 'dash) + ((string-match "^ *|[~]" l) + 'tilde) + ((string-match "[ \t]+$" l) + (substring l 0 (match-beginning 0))) + (t l))) lines)) ;; Get the data fields by splitting the lines. (setq fields (mapcar (lambda (l) (org-split-string l " *| *")) - (delq nil (copy-sequence lines)))) + (delq 'dash (delq 'tilde (copy-sequence lines))))) ;; How many fields in the longest line? (condition-case nil (setq maxfields (apply 'max (mapcar 'length fields))) @@ -770,19 +774,25 @@ When nil, simply write \"#ERROR\" in corrupted fields.") (concat (car c) space)))))))) ;; Compute the formats needed for output of the table - (setq rfmt (concat indent "|") hfmt (concat indent "|")) + (setq rfmt (concat indent "|") hfmt (concat indent "|") + tfmt (concat indent "|")) (while (setq l (pop lengths)) (setq ty (if (pop typenums) "" "-")) ; number types flushright (setq rfmt (concat rfmt (format rfmt1 ty l)) - hfmt (concat hfmt (format hfmt1 (make-string l ?-))))) + hfmt (concat hfmt (format hfmt1 (make-string l ?-))) + tfmt (concat tfmt (format tfmt1 (make-string l ?~))))) (setq rfmt (concat rfmt "\n") - hfmt (concat (substring hfmt 0 -1) "|\n")) - + hfmt (concat (substring hfmt 0 -1) "|\n") + tfmt (concat (substring tfmt 0 -1) "|\n")) (setq new (mapconcat (lambda (l) - (if l (apply 'format rfmt - (append (pop fields) emptystrings)) - hfmt)) + (cond ((eq l 'dash) + hfmt) + ((eq l 'tilde) + tfmt) + (t + (apply 'format rfmt + (append (pop fields) emptystrings))))) lines "")) (if (equal (char-before) ?\n) ;; This hack is for org-indent, to force redisplay of the >From 306605c2f49710a80d47553cb9bdf318dadf4db7 Mon Sep 17 00:00:00 2001 From: Lawrence Mitchell Date: Wed, 2 Feb 2011 12:21:13 +0000 Subject: [PATCH 2/2] Correctly export internal table headers during LaTeX export To: emacs-orgmode@gnu.org * lisp/org-latex.el (org-export-latex-tables): Allow for tildes in table format (indicating internal headers). (org-export-latex-content): Export tables before special characters to deal with new tilde header style. --- lisp/org-latex.el | 10 +++++----- 1 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lisp/org-latex.el b/lisp/org-latex.el index 9290c35..61dced4 100644 --- a/lisp/org-latex.el +++ b/lisp/org-latex.el @@ -1389,6 +1389,9 @@ links, keywords, lists, tables, fixed-width" (unless (memq 'emphasis exclude-list) (when (plist-get org-export-latex-options-plist :emphasize) (org-export-latex-fontify))) + (unless (memq 'tables exclude-list) + (org-export-latex-tables + (plist-get org-export-latex-options-plist :tables))) (unless (memq 'sub-superscript exclude-list) (org-export-latex-special-chars (plist-get org-export-latex-options-plist :sub-superscript))) @@ -1398,9 +1401,6 @@ links, keywords, lists, tables, fixed-width" (org-export-latex-keywords)) (unless (memq 'lists exclude-list) (org-export-latex-lists)) - (unless (memq 'tables exclude-list) - (org-export-latex-tables - (plist-get org-export-latex-options-plist :tables))) (unless (memq 'fixed-width exclude-list) (org-export-latex-fixed-width (plist-get org-export-latex-options-plist :fixed-width))) @@ -1804,7 +1804,7 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER." ;; make a formatting string to reflect alignment (setq olines lines) (while (and (not line-fmt) (setq line (pop olines))) - (unless (string-match "^[ \t]*|-" line) + (unless (string-match "^[ \t]*|[-~]" line) (setq fields (org-split-string line "[ \t]*|[ \t]*")) (setq fnum (make-vector (length fields) 0)) (setq line-fmt @@ -1839,7 +1839,7 @@ The conversion is made depending of STRING-BEFORE and STRING-AFTER." (setq lines (mapcar (lambda(elem) - (or (and (string-match "[ \t]*|-+" elem) 'hline) + (or (and (string-match "[ \t]*|[-~]+" elem) 'hline) (org-split-string (org-trim elem) "|"))) lines)) (when insert -- 1.7.4.rc2.18.gb20e9