emacs-orgmode
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Orgmode] a better way with babel


From: Eric Schulte
Subject: Re: [Orgmode] a better way with babel
Date: Thu, 01 Jul 2010 08:19:14 -0700
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/23.2 (gnu/linux)

Of course, an updated patch is attached.

Best -- Eric

>From 5cbb38e25a2d2eae7c3c688d347f80619ecb8463 Mon Sep 17 00:00:00 2001
From: Eric Schulte <address@hidden>
Date: Thu, 1 Jul 2010 08:07:17 -0700
Subject: [PATCH] add short-names to #+captions with support for latex export

  captions specified with the following syntax
    #+CAPTION: [shortname]{longname}
  will have their short and longnames handled appropriately.

  Thanks to Robert Cunningham for suggesting this feature.

* lisp/org-exp.el (org-export-attach-captions-and-attributes): adding
  a shortname attribute to caption strings under the symbol name
  org-caption-shortn.

* lisp/org-latex.el (org-export-latex-tables): handling caption short
  names on table export

  (org-export-latex-convert-table.el-table): handling caption short
  names on table.el type table export

  (org-export-latex-links): handling caption short names on link/image
  export

  (org-export-latex-format-image): now takes an optional argument
  specifying a caption short name
---
 lisp/org-exp.el   |    6 +++++-
 lisp/org-latex.el |   20 +++++++++++++-------
 2 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/lisp/org-exp.el b/lisp/org-exp.el
index cf09799..80f6e11 100644
--- a/lisp/org-exp.el
+++ b/lisp/org-exp.el
@@ -1607,12 +1607,15 @@ table line.  If it is a link, add it to the line 
containing the link."
                    "^[ \t]*\\(|[^-]\\)"
                    "\\|"
                    "^[ \t]*\\[\\[.*\\]\\][ \t]*$"))
-       cap attr label end)
+       cap shortn attr label end)
     (while (re-search-forward re nil t)
       (cond
        ((match-end 1)
        (progn
          (setq cap (concat cap (if cap " " "") (org-trim (match-string 1))))
+         (when (string-match "\\[\\(.*\\)\\]{\\(.*\\)}" cap)
+           (setq shortn (match-string 1 cap)
+                 cap (match-string 2 cap)))
          (delete-region (point-at-bol) (min (1+ (point-at-eol)) (point-max)))))
        ((match-end 2)
        (progn
@@ -1629,6 +1632,7 @@ table line.  If it is a link, add it to the line 
containing the link."
                    (point-at-eol)))
        (add-text-properties (point-at-bol) end
                             (list 'org-caption cap
+                                  'org-caption-shortn shortn
                                   'org-attributes attr
                                   'org-label label))
        (if label (push (cons label label) target-alist))
diff --git a/lisp/org-latex.el b/lisp/org-latex.el
index e800bc1..d725fc8 100644
--- a/lisp/org-latex.el
+++ b/lisp/org-latex.el
@@ -1576,7 +1576,7 @@ The conversion is made depending of STRING-BEFORE and 
STRING-AFTER."
              (org-table-last-column-widths (copy-sequence
                                             org-table-last-column-widths))
              fnum fields line lines olines gr colgropen line-fmt align
-             caption label attr floatp longtblp)
+             caption shortn label attr floatp longtblp)
         (if org-export-latex-tables-verbatim
             (let* ((tbl (concat "\\begin{verbatim}\n" raw-table
                                 "\\end{verbatim}\n")))
@@ -1585,6 +1585,8 @@ The conversion is made depending of STRING-BEFORE and 
STRING-AFTER."
           (progn
             (setq caption (org-find-text-property-in-string
                            'org-caption raw-table)
+                 shortn (org-find-text-property-in-string
+                         'org-caption-shortn raw-table)
                   attr (org-find-text-property-in-string
                         'org-attributes raw-table)
                   label (org-find-text-property-in-string
@@ -1652,8 +1654,8 @@ The conversion is made depending of STRING-BEFORE and 
STRING-AFTER."
                           (if floatp "\\begin{table}[htb]\n"))
                         (if floatp
                             (format
-                             "\\caption{%s%s}"
-                             (if label (concat "\\\label{" label "}") "")
+                             "\\caption%s{%s%s}"
+                             (if shortn (concat "[" shortn "]") "")
                              (or caption "")))
                         (if (and longtblp caption) "\\\\\n" "\n")
                         (if (and org-export-latex-tables-centered (not 
longtblp))
@@ -1680,10 +1682,11 @@ The conversion is made depending of STRING-BEFORE and 
STRING-AFTER."
 
 (defun org-export-latex-convert-table.el-table ()
   "Replace table.el table at point with LaTeX code."
-  (let (tbl caption label line floatp attr align rmlines)
+  (let (tbl caption shortn label line floatp attr align rmlines)
     (setq line (buffer-substring (point-at-bol) (point-at-eol))
          label (org-get-text-property-any 0 'org-label line)
          caption (org-get-text-property-any 0 'org-caption line)
+         shortn (org-get-text-property-any 0 'org-caption-shortn line)
          attr (org-get-text-property-any 0 'org-attributes line)
          align (and attr (stringp attr)
                     (string-match "\\<align=\\([^ \t\n\r,]+\\)" attr)
@@ -1721,7 +1724,8 @@ The conversion is made depending of STRING-BEFORE and 
STRING-AFTER."
       (setq tbl (concat "\\begin{center}\n" tbl "\\end{center}")))
     (when floatp
       (setq tbl (concat "\\begin{table}\n"
-                       (format "\\caption{%s%s}\n"
+                       (format "\\caption%s{%s%s}\n"
+                               (if shortn (format "[%s]" shortn) "")
                                (if label (format "\\label{%s}" label) "")
                                (or caption ""))
                        tbl
@@ -1822,6 +1826,7 @@ The conversion is made depending of STRING-BEFORE and 
STRING-AFTER."
                          "file")))
            (coderefp (equal type "coderef"))
            (caption (org-find-text-property-in-string 'org-caption raw-path))
+           (shortn (org-find-text-property-in-string 'org-caption-shortn 
raw-path))
            (attr (or (org-find-text-property-in-string 'org-attributes 
raw-path)
                      (plist-get org-export-latex-options-plist 
:latex-image-options)))
            (label (org-find-text-property-in-string 'org-label raw-path))
@@ -1859,7 +1864,7 @@ The conversion is made depending of STRING-BEFORE and 
STRING-AFTER."
                   (plist-get org-export-latex-options-plist :inline-images))
              ;; OK, we need to inline an image
              (insert
-              (org-export-latex-format-image raw-path caption label attr)))
+              (org-export-latex-format-image raw-path caption label attr 
shortn)))
             (coderefp
              (insert (format
                       (org-export-get-coderef-format path desc)
@@ -1922,7 +1927,7 @@ The conversion is made depending of STRING-BEFORE and 
STRING-AFTER."
           (wrapp "\\begin{wrapfigure}%placement
 \\centering
 \\includegraphics[%attr]{%path}
-\\caption{%labelcmd%caption}
+\\caption%shortn{%labelcmd%caption}
 \\end{wrapfigure}")
           (multicolumnp "\\begin{figure*}%placement
 \\centering
@@ -1953,6 +1958,7 @@ The conversion is made depending of STRING-BEFORE and 
STRING-AFTER."
                         (expand-file-name path)
                       path))
               (cons "attr" attr)
+              (cons "shortn" (if shortn (format "[%s]" shortn) ""))
               (cons "labelcmd" (if label (format "\\label{%s}"
                                                  label)""))
               (cons "caption" (or caption ""))
-- 
1.7.0.4


Carsten Dominik <address@hidden> writes:

> Hi Eric,
>
> I tried to apply the patch, but it does not apply cleanly, maybe due
> to other changes.  Can I ask you to update and resubmit?
>
> Thanks!
>
> - Carsten
>
> On Jun 21, 2010, at 6:37 PM, Eric Schulte wrote:
>
>> Hi Robert,
>>
>> Thanks for the thoughtful message.
>>
>> I present a couple of solutions below.
>>
>> Robert Cunningham <address@hidden> writes:
>>
>>> G'day All,
>>>
>>> I wonder if I've missed something and there is a better way.
>>>
>>> Essentially I'm trying to use org babel with R and LaTeX to create
>>> figures
>>> with both long and short captions (for contents)
>>>
>>> I'd started with:
>>>
>>> #+CAPTION: Nice data (filled points indicate less nice data)
>>> #+LABEL:   fig:nicedata
>>> #+ATTR_LaTeX: width=0.98\textwidth
>>> #+begin_src R :file ndata.pdf :width 1000 :height 617 :exports
>>> results
>>>  dotchart(data$ndata)
>>> #+end_src
>>>
>>> which pointed to the need for long/short captions...
>>>
>>> feeling hopeful I tried:
>>>
>>> #+CAPTION: Nice data [Nice data (filled points indicate less nice
>>> data)]
>>> #+LABEL:   fig:nicedata
>>> #+ATTR_LaTeX: width=0.98\textwidth
>>> #+begin_src R :file ndata.pdf :width 1000 :height 617 :exports
>>> results
>>>  dotchart(data$ndata)
>>> #+end_src
>>>
>>
>> I'm attaching a patch [1] which adds shortname support for captions.
>> Once
>> applied, the following syntax will result in a caption with a
>> shortname
>> and a longname.
>>
>> --8<---------------cut here---------------start------------->8---
>> some pre-table text
>>
>> #+source: g-nicedata
>> #+begin_src gnuplot :file graph.png :exports results
>>  plot sin(x)
>> #+end_src
>>
>> #+Caption: [nice data]{a longer description of the niceness of the
>> data}
>> #+results: g-nicedata
>> [[file:graph.png]]
>>
>> some post-table text
>> --8<---------------cut here---------------end--------------->8---
>>
>> however, while this patch is still pending there is an Org-babel
>> solution below which should work immediately.
>>
>>>
>>>
>>> but no luck there.
>>>
>>> Next effort was to try to use R and LaTex more directly with
>>> noweb. I tried
>>> this:
>>>
>>>
>>>
>>> #+srcname: r-nicedata
>>> #+begin_src R :session :file ndata.pdf :results output :exports
>>> results
>>>  dotchart(data$ndata)       
>>> #+end_src
>>>
>>>
>>> #+begin_src latex :noweb yes
>>>  \begin{figure}[htb!]
>>>    \centering
>>>    \includegraphics[width=0.98\textwidth]{<<r-nicedata()>>}
>>>    \caption[Nice data]{Nice data (filled points indicate less nice
>>> data)}
>>>    \label{fig:nicedata}
>>>  \end{figure}
>>> #+end_src
>>>
>>>
>>>
>>> This does produce the figure and long/short contents BUT ALSO
>>> produces this:
>>>
>>> #+results: r-nicedata
>>> [[file:ndata.pdf]]
>>>
>>> which upon export results in a link and consequently the plot
>>> appearing both
>>> in the figure and elsewhere. This second plot is unwelcome.
>>>
>>> I've tried assorted :results and :output options but have not found
>>> how to
>>> suppress the #+results: but still obtain the figure. I've always used
>>> the :session option.
>>>
>>> I've also tried twigging an org-export option to suppress pdf
>>> export but the
>>> link is still exported so that is not a solution.
>>>
>>> The current "working" solution is to use the noweb approach and
>>> then use sed
>>> to clean out the links to the second image-ugly to say the least!
>>>
>>
>> You were very close with the noweb approach.  The following
>> combination
>> should work -- notice the ":results silent" header argument to the
>> source block.
>>
>> --8<---------------cut here---------------start------------->8---
>> some pre-table text
>>
>> #+source: g-nicedata
>> #+begin_src gnuplot :file graph.png :results silent :exports none
>>  plot sin(x)
>> #+end_src
>>
>> #+begin_src latex :noweb yes
>>  \begin{figure}[htb!]
>>    \centering
>>    \includegraphics[width=0.98\textwidth]{<<g-nicedata()>>}
>>    \caption[Nice data]{some nice data -- filled points indicate less
>> nice data}
>>    \label{fig:nicedata}
>>  \end{figure}
>> #+end_src
>>
>> some post-table text
>> --8<---------------cut here---------------end--------------->8---
>>
>> is exported to the following latex,
>>
>> --8<---------------cut here---------------start------------->8---
>> some pre-table text
>>
>>
>>
>> \begin{figure}[htb!]
>>  \centering
>>  \includegraphics[width=0.98\textwidth]{graph.png}
>>  \caption[Nice data]{some nice data -- filled points indicate less
>> nice data}
>>  \label{fig:nicedata}
>> \end{figure}
>>
>> some post-table text
>> --8<---------------cut here---------------end--------------->8---
>>
>> Hope this helps,
>>
>> Best -- Eric
>>
>>>
>>>
>>>
>>> All this with org version 6.36c
>>>
>>>
>>> What have I missed? What is the best way to do this?
>>>
>>>
>>> Cheers,
>>>
>>> Robert Cunningham
>>>
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> Emacs-orgmode mailing list
>>> Please use `Reply All' to send replies to the list.
>>> address@hidden
>>> http://lists.gnu.org/mailman/listinfo/emacs-orgmode
>>
>> Footnotes:
>> [1]  From 6a55dcab99bbd7840117b8390ab5db347d2573ef Mon Sep 17
>> 00:00:00 2001
>> From: Eric Schulte <address@hidden>
>> Date: Mon, 21 Jun 2010 09:02:37 -0700
>> Subject: [PATCH] add short-names to #+captions with support for
>> latex export
>>
>>  captions specified with the following syntax
>>    #+CAPTION: [shortname]{longname}
>>  will have their short and longnames handled appropriately.
>>
>>  Thanks to Robert Cunningham for suggesting this feature.
>>
>> * lisp/org-exp.el (org-export-attach-captions-and-attributes): adding
>>  a shortname attribute to caption strings under the symbol name
>>  org-caption-shortn.
>>
>> * lisp/org-latex.el (org-export-latex-tables): handling caption short
>>  names on table export
>>
>>  (org-export-latex-convert-table.el-table): handling caption short
>>  names on table.el type table export
>>
>>  (org-export-latex-links): handling caption short names on link/image
>>  export
>>
>>  (org-export-latex-format-image): now takes an optional argument
>>  specifying a caption short name
>> ---
>> lisp/org-exp.el   |   14 +++++++++-----
>> lisp/org-latex.el |   21 ++++++++++++++-------
>> 2 files changed, 23 insertions(+), 12 deletions(-)
>>
>> diff --git a/lisp/org-exp.el b/lisp/org-exp.el
>> index 029e4d7..466d7da 100644
>> --- a/lisp/org-exp.el
>> +++ b/lisp/org-exp.el
>> @@ -1256,7 +1256,7 @@ the current file."
>>   (goto-char (point-min))
>>   (while (re-search-forward org-bracket-link-regexp nil t)
>>     (org-if-unprotected-at (1+ (match-beginning 0))
>> -     (let* ((md (match-data))
>> +      (let* ((md (match-data))
>>          (desc (match-end 2))
>>          (link (org-link-unescape (match-string 1)))
>>          (slink (org-solidify-link-text link))
>> @@ -1381,8 +1381,8 @@ removed as well."
>>                                         select-tags "\\|")
>>                       "\\):"))
>>       (re-excl (concat ":\\(" (mapconcat 'regexp-quote
>> -                                       exclude-tags "\\|")
>> -                    "\\):"))
>> +                                        exclude-tags "\\|")
>> +                      "\\):"))
>>       beg end cont)
>>     (goto-char (point-min))
>>     (when (and select-tags
>> @@ -1593,11 +1593,14 @@ table line.  If it is a link, add it to the
>> line containing the link."
>>                  "^[ \t]*\\(|[^-]\\)"
>>                  "\\|"
>>                  "^[ \t]*\\[\\[.*\\]\\][ \t]*$"))
>> -    cap attr label end)
>> +    cap shortn attr label end)
>>     (while (re-search-forward re nil t)
>>       (cond
>>        ((match-end 1)
>> -    (setq cap (concat cap (if cap " " "") (org-trim (match-string 1)))))
>> +    (setq cap (concat cap (if cap " " "") (org-trim (match-string 1))))
>> +    (when (string-match "\\[\\(.*\\)\\]{\\(.*\\)}" cap)
>> +      (setq shortn (match-string 1 cap)
>> +            cap (match-string 2 cap))))
>>        ((match-end 2)
>>      (setq attr (concat attr (if attr " " "") (org-trim
>> (match-string 2)))))
>>        ((match-end 3)
>> @@ -1609,6 +1612,7 @@ table line.  If it is a link, add it to the
>> line containing the link."
>>                  (point-at-eol)))
>>      (add-text-properties (point-at-bol) end
>>                           (list 'org-caption cap
>> +                               'org-caption-shortn shortn
>>                                 'org-attributes attr
>>                                 'org-label label))
>>      (if label (push (cons label label) target-alist))
>> diff --git a/lisp/org-latex.el b/lisp/org-latex.el
>> index 01a4b05..6c2aab2 100644
>> --- a/lisp/org-latex.el
>> +++ b/lisp/org-latex.el
>> @@ -1576,7 +1576,7 @@ The conversion is made depending of STRING-
>> BEFORE and STRING-AFTER."
>>              (org-table-last-column-widths (copy-sequence
>>                                             org-table-last-column-
>> widths))
>>              fnum fields line lines olines gr colgropen line-fmt align
>> -             caption label attr floatp longtblp)
>> +             caption shortn label attr floatp longtblp)
>>         (if org-export-latex-tables-verbatim
>>             (let* ((tbl (concat "\\begin{verbatim}\n" raw-table
>>                                 "\\end{verbatim}\n")))
>> @@ -1585,6 +1585,8 @@ The conversion is made depending of STRING-
>> BEFORE and STRING-AFTER."
>>           (progn
>>             (setq caption (org-find-text-property-in-string
>>                            'org-caption raw-table)
>> +              shortn (org-find-text-property-in-string
>> +                      'org-caption-shortn raw-table)
>>                   attr (org-find-text-property-in-string
>>                         'org-attributes raw-table)
>>                   label (org-find-text-property-in-string
>> @@ -1652,7 +1654,8 @@ The conversion is made depending of STRING-
>> BEFORE and STRING-AFTER."
>>                           (if floatp "\\begin{table}[htb]\n"))
>>                         (if floatp
>>                             (format
>> -                             "\\caption{%s%s}"
>> +                             "\\caption%s{%s%s}"
>> +                         (if shortn (concat "[" shortn "]") "")
>>                              (if label (concat "\\\label{" label
>> "}") "")
>>                              (or caption "")))
>>                         (if (and longtblp caption) "\\\\\n" "\n")
>> @@ -1680,10 +1683,11 @@ The conversion is made depending of STRING-
>> BEFORE and STRING-AFTER."
>>
>> (defun org-export-latex-convert-table.el-table ()
>>   "Replace table.el table at point with LaTeX code."
>> -  (let (tbl caption label line floatp attr align rmlines)
>> +  (let (tbl caption shortn label line floatp attr align rmlines)
>>     (setq line (buffer-substring (point-at-bol) (point-at-eol))
>>        label (org-get-text-property-any 0 'org-label line)
>>        caption (org-get-text-property-any 0 'org-caption line)
>> +      shortn (org-get-text-property-any 0 'org-caption-shortn line)
>>        attr (org-get-text-property-any 0 'org-attributes line)
>>        align (and attr (stringp attr)
>>                   (string-match "\\<align=\\([^ \t\n\r,]+\\)" attr)
>> @@ -1721,7 +1725,8 @@ The conversion is made depending of STRING-
>> BEFORE and STRING-AFTER."
>>       (setq tbl (concat "\\begin{center}\n" tbl "\\end{center}")))
>>     (when floatp
>>       (setq tbl (concat "\\begin{table}\n"
>> -                    (format "\\caption{%s%s}\n"
>> +                    (format "\\caption%s{%s%s}\n"
>> +                            (if shortn (format "[%s]" shortn) "")
>>                              (if label (format "\\label{%s}" label) "")
>>                              (or caption ""))
>>                      tbl
>> @@ -1822,6 +1827,7 @@ The conversion is made depending of STRING-
>> BEFORE and STRING-AFTER."
>>                        "file")))
>>          (coderefp (equal type "coderef"))
>>          (caption (org-find-text-property-in-string 'org-caption
>> raw-
>> path))
>> +        (shortn (org-find-text-property-in-string
>> org-caption-shortn raw-path))
>>          (attr (or (org-find-text-property-in-string
>> org-attributes raw-
>> path)
>>                    (plist-get org-export-latex-options-plist
>> :latex-image-
>> options)))
>>          (label (org-find-text-property-in-string 'org-label raw-path))
>> @@ -1859,7 +1865,7 @@ The conversion is made depending of STRING-
>> BEFORE and STRING-AFTER."
>>                 (plist-get org-export-latex-options-plist :inline-images))
>>            ;; OK, we need to inline an image
>>            (insert
>> -           (org-export-latex-format-image raw-path caption label attr)))
>> +           (org-export-latex-format-image raw-path caption label
>> attr shortn)))
>>           (coderefp
>>            (insert (format
>>                     (org-export-get-coderef-format path desc)
>> @@ -1889,7 +1895,7 @@ The conversion is made depending of STRING-
>> BEFORE and STRING-AFTER."
>>           (t (insert "\\texttt{" desc "}")))))))
>>
>>
>> -(defun org-export-latex-format-image (path caption label attr)
>> +(defun org-export-latex-format-image (path caption label attr
>> &optional shortn)
>>   "Format the image element, depending on user settings."
>>   (let (ind floatp wrapp multicolumnp placement figenv)
>>     (setq floatp (or caption label))
>> @@ -1932,7 +1938,7 @@ The conversion is made depending of STRING-
>> BEFORE and STRING-AFTER."
>>         (floatp "\\begin{figure}%placement
>> \\centering
>> \\includegraphics[%attr]{%path}
>> -\\caption{%labelcmd%caption}
>> +\\caption%shortn{%labelcmd%caption}
>> \\end{figure}")
>>         (t "\\includegraphics[%attr]{%path}")))
>>
>> @@ -1953,6 +1959,7 @@ The conversion is made depending of STRING-
>> BEFORE and STRING-AFTER."
>>                       (expand-file-name path)
>>                     path))
>>             (cons "attr" attr)
>> +           (cons "shortn" (if shortn (format "[%s]" shortn) ""))
>>             (cons "labelcmd" (if label (format "\\label{%s}"
>>                                                label)""))
>>             (cons "caption" (or caption ""))
>> --
>> 1.7.0.4
>>
>> _______________________________________________
>> Emacs-orgmode mailing list
>> Please use `Reply All' to send replies to the list.
>> address@hidden
>> http://lists.gnu.org/mailman/listinfo/emacs-orgmode
>
> - Carsten

reply via email to

[Prev in Thread] Current Thread [Next in Thread]