Merge branch 'master' of orgmode.org:org-mode

This commit is contained in:
Bastien Guerry 2014-08-26 07:02:31 +02:00
commit c9fdd7f8b1
5 changed files with 231 additions and 275 deletions

View File

@ -50,12 +50,13 @@ defining export blocks.
Note that If BACKEND is a derived back-end and doesn't implement Note that If BACKEND is a derived back-end and doesn't implement
its own special block translator already, there is nothing to its own special block translator already, there is nothing to
change. The parent back-end will take care of such blocks. change. The parent back-end will take care of such blocks.
*** ~org-html-format-headline-function~ requires an additional argument *** Signature changes
The function provided is required to accept export options, as The following functions require an additional argument. See their
a plist, as its final (sixth) argument. docstring for more information.
*** ~org-html-format-inlinetask-function~ requires an additional argument - ~org-html-format-headline-function~
The function provided is required to accept export options, as - ~org-html-format-inlinetask-function~
a plist, as its final (seventh) argument. - ~org-latex-format-headline-function~
- ~org-latex-format-inlinetask-function~
** Removed functions ** Removed functions
*** Removed function ~org-beamer-insert-options-template~ *** Removed function ~org-beamer-insert-options-template~
This function inserted a Beamer specific template at point or in This function inserted a Beamer specific template at point or in

View File

@ -3312,19 +3312,20 @@ This ensures the export commands can easily use it."
(defvar org-agenda-write-buffer-name "Agenda View") (defvar org-agenda-write-buffer-name "Agenda View")
(defun org-agenda-write (file &optional open nosettings agenda-bufname) (defun org-agenda-write (file &optional open nosettings agenda-bufname)
"Write the current buffer (an agenda view) as a file. "Write the current buffer (an agenda view) as a file.
Depending on the extension of the file name, plain text (.txt), Depending on the extension of the file name, plain text (.txt),
HTML (.html or .htm), PDF (.pdf) or Postscript (.ps) is produced. HTML (.html or .htm), PDF (.pdf) or Postscript (.ps) is produced.
If the extension is .ics, run icalendar export over all files used If the extension is .ics, translate visible agenda into iCalendar
to construct the agenda and limit the export to entries listed in the format. If the extension is .org, collect all subtrees
agenda now. corresponding to the agenda entries and add them in an .org file.
If the extension is .org, collect all subtrees corresponding to the
agenda entries and add them in an .org file. With prefix argument OPEN, open the new file immediately. If
With prefix argument OPEN, open the new file immediately. NOSETTINGS is given, do not scope the settings of
If NOSETTINGS is given, do not scope the settings of `org-agenda-exporter-settings' into the export commands. This is
`org-agenda-exporter-settings' into the export commands. This is used when used when the settings have already been scoped and we do not
the settings have already been scoped and we do not wish to overrule other, wish to overrule other, higher priority settings. If
higher priority settings. AGENDA-BUFFER-NAME is provided, use this as the buffer name for
If AGENDA-BUFFER-NAME, use this as the buffer name for the agenda to write." the agenda to write."
(interactive "FWrite agenda to file: \nP") (interactive "FWrite agenda to file: \nP")
(if (or (not (file-writable-p file)) (if (or (not (file-writable-p file))
(and (file-exists-p file) (and (file-exists-p file)
@ -3359,7 +3360,7 @@ If AGENDA-BUFFER-NAME, use this as the buffer name for the agenda to write."
content))) content)))
(find-file file) (find-file file)
(erase-buffer) (erase-buffer)
(mapcar (lambda (s) (org-paste-subtree 1 s)) (reverse content)) (dolist (s content) (org-paste-subtree 1 s))
(write-file file) (write-file file)
(kill-buffer (current-buffer)) (kill-buffer (current-buffer))
(message "Org file written to %s" file))) (message "Org file written to %s" file)))

View File

@ -6820,7 +6820,8 @@ in special contexts.
(setq org-cycle-global-status 'overview) (setq org-cycle-global-status 'overview)
(run-hook-with-args 'org-cycle-hook 'overview))))) (run-hook-with-args 'org-cycle-hook 'overview)))))
(defvar org-called-with-limited-levels);Dyn-bound in ̀org-with-limited-levels'. (defvar org-called-with-limited-levels nil
"Non-nil when `org-with-limited-levels' is currently active.")
(defun org-cycle-internal-local () (defun org-cycle-internal-local ()
"Do the local cycling action." "Do the local cycling action."

View File

@ -269,11 +269,7 @@ re-read the iCalendar file.")
(:icalendar-store-UID nil nil org-icalendar-store-UID) (:icalendar-store-UID nil nil org-icalendar-store-UID)
(:icalendar-timezone nil nil org-icalendar-timezone) (:icalendar-timezone nil nil org-icalendar-timezone)
(:icalendar-use-deadline nil nil org-icalendar-use-deadline) (:icalendar-use-deadline nil nil org-icalendar-use-deadline)
(:icalendar-use-scheduled nil nil org-icalendar-use-scheduled) (:icalendar-use-scheduled nil nil org-icalendar-use-scheduled))
;; The following property will be non-nil when export has been
;; started from org-agenda-mode. In this case, any entry without
;; a non-nil "ICALENDAR_MARK" property will be ignored.
(:icalendar-agenda-view nil nil nil))
:filters-alist :filters-alist
'((:filter-headline . org-icalendar-clear-blank-lines)) '((:filter-headline . org-icalendar-clear-blank-lines))
:menu-entry :menu-entry
@ -288,22 +284,18 @@ re-read the iCalendar file.")
;;; Internal Functions ;;; Internal Functions
(defun org-icalendar-create-uid (file &optional bell h-markers) (defun org-icalendar-create-uid (file &optional bell)
"Set ID property on headlines missing it in FILE. "Set ID property on headlines missing it in FILE.
When optional argument BELL is non-nil, inform the user with When optional argument BELL is non-nil, inform the user with
a message if the file was modified. With optional argument a message if the file was modified."
H-MARKERS non-nil, it is a list of markers for the headlines (let (modified-flag)
which will be updated."
(let ((pt (if h-markers (goto-char (car h-markers)) (point-min)))
modified-flag)
(org-map-entries (org-map-entries
(lambda () (lambda ()
(let ((entry (org-element-at-point))) (let ((entry (org-element-at-point)))
(unless (or (< (point) pt) (org-element-property :ID entry)) (unless (org-element-property :ID entry)
(org-id-get-create) (org-id-get-create)
(setq modified-flag t) (setq modified-flag t)
(forward-line)) (forward-line))))
(when h-markers (setq org-map-continue-from (pop h-markers)))))
nil nil 'comment) nil nil 'comment)
(when (and bell modified-flag) (when (and bell modified-flag)
(message "ID properties created in file \"%s\"" file) (message "ID properties created in file \"%s\"" file)
@ -534,99 +526,97 @@ inlinetask within the section."
(cons 'org-data (cons 'org-data
(cons nil (org-element-contents first)))))))) (cons nil (org-element-contents first))))))))
(concat (concat
(unless (and (plist-get info :icalendar-agenda-view) (let ((todo-type (org-element-property :todo-type entry))
(not (org-element-property :ICALENDAR-MARK entry))) (uid (or (org-element-property :ID entry) (org-id-new)))
(let ((todo-type (org-element-property :todo-type entry)) (summary (org-icalendar-cleanup-string
(uid (or (org-element-property :ID entry) (org-id-new))) (or (org-element-property :SUMMARY entry)
(summary (org-icalendar-cleanup-string (org-export-data
(or (org-element-property :SUMMARY entry) (org-element-property :title entry) info))))
(org-export-data (loc (org-icalendar-cleanup-string
(org-element-property :title entry) info)))) (org-element-property :LOCATION entry)))
(loc (org-icalendar-cleanup-string ;; Build description of the entry from associated section
(org-element-property :LOCATION entry))) ;; (headline) or contents (inlinetask).
;; Build description of the entry from associated (desc
;; section (headline) or contents (inlinetask). (org-icalendar-cleanup-string
(desc (or (org-element-property :DESCRIPTION entry)
(org-icalendar-cleanup-string (let ((contents (org-export-data inside info)))
(or (org-element-property :DESCRIPTION entry) (cond
(let ((contents (org-export-data inside info))) ((not (org-string-nw-p contents)) nil)
(cond ((wholenump org-icalendar-include-body)
((not (org-string-nw-p contents)) nil) (let ((contents (org-trim contents)))
((wholenump org-icalendar-include-body) (substring
(let ((contents (org-trim contents))) contents 0 (min (length contents)
(substring org-icalendar-include-body))))
contents 0 (min (length contents) (org-icalendar-include-body (org-trim contents)))))))
org-icalendar-include-body)))) (cat (org-icalendar-get-categories entry info)))
(org-icalendar-include-body (org-trim contents))))))) (concat
(cat (org-icalendar-get-categories entry info))) ;; Events: Delegate to `org-icalendar--vevent' to generate
(concat ;; "VEVENT" component from scheduled, deadline, or any
;; Events: Delegate to `org-icalendar--vevent' to ;; timestamp in the entry.
;; generate "VEVENT" component from scheduled, deadline, (let ((deadline (org-element-property :deadline entry)))
;; or any timestamp in the entry. (and deadline
(let ((deadline (org-element-property :deadline entry))) (memq (if todo-type 'event-if-todo 'event-if-not-todo)
(and deadline org-icalendar-use-deadline)
(memq (if todo-type 'event-if-todo 'event-if-not-todo) (org-icalendar--vevent
org-icalendar-use-deadline) entry deadline (concat "DL-" uid)
(org-icalendar--vevent (concat "DL: " summary) loc desc cat)))
entry deadline (concat "DL-" uid) (let ((scheduled (org-element-property :scheduled entry)))
(concat "DL: " summary) loc desc cat))) (and scheduled
(let ((scheduled (org-element-property :scheduled entry))) (memq (if todo-type 'event-if-todo 'event-if-not-todo)
(and scheduled org-icalendar-use-scheduled)
(memq (if todo-type 'event-if-todo 'event-if-not-todo) (org-icalendar--vevent
org-icalendar-use-scheduled) entry scheduled (concat "SC-" uid)
(org-icalendar--vevent (concat "S: " summary) loc desc cat)))
entry scheduled (concat "SC-" uid) ;; When collecting plain timestamps from a headline and its
(concat "S: " summary) loc desc cat))) ;; title, skip inlinetasks since collection will happen once
;; When collecting plain timestamps from a headline and ;; ENTRY is one of them.
;; its title, skip inlinetasks since collection will (let ((counter 0))
;; happen once ENTRY is one of them. (mapconcat
#'identity
(org-element-map (cons (org-element-property :title entry)
(org-element-contents inside))
'timestamp
(lambda (ts)
(when (let ((type (org-element-property :type ts)))
(case (plist-get info :with-timestamps)
(active (memq type '(active active-range)))
(inactive (memq type '(inactive inactive-range)))
((t) t)))
(let ((uid (format "TS%d-%s" (incf counter) uid)))
(org-icalendar--vevent
entry ts uid summary loc desc cat))))
info nil (and (eq type 'headline) 'inlinetask))
""))
;; Task: First check if it is appropriate to export it. If
;; so, call `org-icalendar--vtodo' to transcode it into
;; a "VTODO" component.
(when (and todo-type
(case (plist-get info :icalendar-include-todo)
(all t)
(unblocked
(and (eq type 'headline)
(not (org-icalendar-blocked-headline-p
entry info))))
((t) (eq todo-type 'todo))))
(org-icalendar--vtodo entry uid summary loc desc cat))
;; Diary-sexp: Collect every diary-sexp element within ENTRY
;; and its title, and transcode them. If ENTRY is
;; a headline, skip inlinetasks: they will be handled
;; separately.
(when org-icalendar-include-sexps
(let ((counter 0)) (let ((counter 0))
(mapconcat (mapconcat #'identity
#'identity (org-element-map
(org-element-map (cons (org-element-property :title entry) (cons (org-element-property :title entry)
(org-element-contents inside)) (org-element-contents inside))
'timestamp 'diary-sexp
(lambda (ts) (lambda (sexp)
(when (let ((type (org-element-property :type ts))) (org-icalendar-transcode-diary-sexp
(case (plist-get info :with-timestamps) (org-element-property :value sexp)
(active (memq type '(active active-range))) (format "DS%d-%s" (incf counter) uid)
(inactive (memq type '(inactive inactive-range))) summary))
((t) t))) info nil (and (eq type 'headline) 'inlinetask))
(let ((uid (format "TS%d-%s" (incf counter) uid))) "")))))
(org-icalendar--vevent
entry ts uid summary loc desc cat))))
info nil (and (eq type 'headline) 'inlinetask))
""))
;; Task: First check if it is appropriate to export it.
;; If so, call `org-icalendar--vtodo' to transcode it
;; into a "VTODO" component.
(when (and todo-type
(case (plist-get info :icalendar-include-todo)
(all t)
(unblocked
(and (eq type 'headline)
(not (org-icalendar-blocked-headline-p
entry info))))
((t) (eq todo-type 'todo))))
(org-icalendar--vtodo entry uid summary loc desc cat))
;; Diary-sexp: Collect every diary-sexp element within
;; ENTRY and its title, and transcode them. If ENTRY is
;; a headline, skip inlinetasks: they will be handled
;; separately.
(when org-icalendar-include-sexps
(let ((counter 0))
(mapconcat #'identity
(org-element-map
(cons (org-element-property :title entry)
(org-element-contents inside))
'diary-sexp
(lambda (sexp)
(org-icalendar-transcode-diary-sexp
(org-element-property :value sexp)
(format "DS%d-%s" (incf counter) uid)
summary))
info nil (and (eq type 'headline) 'inlinetask))
""))))))
;; If ENTRY is a headline, call current function on every ;; If ENTRY is a headline, call current function on every
;; inlinetask within it. In agenda export, this is independent ;; inlinetask within it. In agenda export, this is independent
;; from the mark (or lack thereof) on the entry. ;; from the mark (or lack thereof) on the entry.
@ -833,7 +823,8 @@ Return ICS file name."
;; links will not be collected at the end of sections. ;; links will not be collected at the end of sections.
(let ((outfile (org-export-output-file-name ".ics" subtreep))) (let ((outfile (org-export-output-file-name ".ics" subtreep)))
(org-export-to-file 'icalendar outfile (org-export-to-file 'icalendar outfile
async subtreep visible-only body-only '(:ascii-charset utf-8) async subtreep visible-only body-only
'(:ascii-charset utf-8 :ascii-links-to-notes nil)
(lambda (file) (lambda (file)
(run-hook-with-args 'org-icalendar-after-save-hook file) nil)))) (run-hook-with-args 'org-icalendar-after-save-hook file) nil))))
@ -888,50 +879,44 @@ The file is stored under the name chosen in
(org-export-add-to-stack (org-export-add-to-stack
(expand-file-name org-icalendar-combined-agenda-file) (expand-file-name org-icalendar-combined-agenda-file)
'icalendar)) 'icalendar))
`(apply 'org-icalendar--combine-files nil ',files))) `(apply 'org-icalendar--combine-files ',files)))
(apply 'org-icalendar--combine-files nil (org-agenda-files t)))) (apply 'org-icalendar--combine-files (org-agenda-files t))))
(defun org-icalendar-export-current-agenda (file) (defun org-icalendar-export-current-agenda (file)
"Export current agenda view to an iCalendar FILE. "Export current agenda view to an iCalendar FILE.
This function assumes major mode for current buffer is This function assumes major mode for current buffer is
`org-agenda-mode'." `org-agenda-mode'."
(let (org-export-babel-evaluate ; Don't evaluate Babel block (let* ((org-export-babel-evaluate) ; Don't evaluate Babel block.
(org-icalendar-combined-agenda-file file) (contents
(marker-list (org-export-string-as
;; Collect the markers pointing to entries in the current (with-output-to-string
;; agenda buffer. (save-excursion
(let (markers) (let ((p (point-min)))
(save-excursion (while (setq p (next-single-property-change p 'org-hd-marker))
(goto-char (point-min)) (let ((m (get-text-property p 'org-hd-marker)))
(while (not (eobp)) (when m
(let ((m (or (org-get-at-bol 'org-hd-marker) (with-current-buffer (marker-buffer m)
(org-get-at-bol 'org-marker)))) (org-with-wide-buffer
(and m (push m markers))) (goto-char (marker-position m))
(beginning-of-line 2))) (princ
(nreverse markers)))) (org-element-normalize-string
(apply 'org-icalendar--combine-files (buffer-substring
;; Build restriction alist. (point) (progn (outline-next-heading) (point)))))))))
(let (restriction) (forward-line)))))
;; Sort markers in each association within RESTRICTION. 'icalendar file)))
(mapcar (lambda (x) (setcdr x (sort (copy-sequence (cdr x)) '<)) x) (with-temp-file file
(dolist (m marker-list restriction) (insert
(let* ((pos (marker-position m)) (org-icalendar--vcalendar
(file (buffer-file-name org-icalendar-combined-name
(org-base-buffer (marker-buffer m)))) user-full-name
(file-markers (assoc file restriction))) org-icalendar-combined-description
;; Add POS in FILE association if one exists (or (org-string-nw-p org-icalendar-timezone) (cadr (current-time-zone)))
;; or create a new association for FILE. contents)))
(if file-markers (push pos (cdr file-markers)) (run-hook-with-args 'org-icalendar-after-save-hook file)))
(push (list file pos) restriction))))))
(org-agenda-files nil 'ifmode))))
(defun org-icalendar--combine-files (restriction &rest files) (defun org-icalendar--combine-files (&rest files)
"Combine entries from multiple files into an iCalendar file. "Combine entries from multiple files into an iCalendar file.
RESTRICTION, when non-nil, is an alist where key is a file name FILES is a list of files to build the calendar from."
and value a list of buffer positions pointing to entries that
should appear in the calendar. It only makes sense if the
function was called from an agenda buffer. FILES is a list of
files to build the calendar from."
(org-agenda-prepare-buffers files) (org-agenda-prepare-buffers files)
(unwind-protect (unwind-protect
(progn (progn
@ -955,29 +940,12 @@ files to build the calendar from."
(catch 'nextfile (catch 'nextfile
(org-check-agenda-file file) (org-check-agenda-file file)
(with-current-buffer (org-get-agenda-file-buffer file) (with-current-buffer (org-get-agenda-file-buffer file)
(let ((marks (cdr (assoc (expand-file-name file) ;; Create ID if necessary.
restriction)))) (when org-icalendar-store-UID
;; Create ID if necessary. (org-icalendar-create-uid file t))
(when org-icalendar-store-UID (org-export-as
(org-icalendar-create-uid file t marks)) 'icalendar nil nil t
(unless (and restriction (not marks)) '(:ascii-charset utf-8 :ascii-links-to-notes nil)))))
;; Add a hook adding :ICALENDAR_MARK: property
;; to each entry appearing in agenda view.
;; Use `apply-partially' because the function
;; still has to accept one argument.
(let ((org-export-before-processing-hook
(cons (apply-partially
(lambda (m-list dummy)
(mapc (lambda (m)
(org-entry-put
m "ICALENDAR-MARK" "t"))
m-list))
(sort marks '>))
org-export-before-processing-hook)))
(org-export-as
'icalendar nil nil t
(list :ascii-charset 'utf-8
:icalendar-agenda-view restriction))))))))
files "") files "")
;; BBDB anniversaries. ;; BBDB anniversaries.
(when (and org-icalendar-include-bbdb-anniversaries (when (and org-icalendar-include-bbdb-anniversaries

View File

@ -400,17 +400,15 @@ Set it to the empty string to ignore the command completely."
'org-latex-format-headline-default-function 'org-latex-format-headline-default-function
"Function for formatting the headline's text. "Function for formatting the headline's text.
This function will be called with 5 arguments: This function will be called with six arguments:
TODO the todo keyword (string or nil). TODO the todo keyword (string or nil)
TODO-TYPE the type of todo (symbol: `todo', `done', nil) TODO-TYPE the type of todo (symbol: `todo', `done', nil)
PRIORITY the priority of the headline (integer or nil) PRIORITY the priority of the headline (integer or nil)
TEXT the main headline text (string). TEXT the main headline text (string)
TAGS the tags as a list of strings (list of strings or nil). TAGS the tags (list of strings or nil)
INFO the export options (plist)
The function result will be used in the section format string. The function result will be used in the section format string."
Use `org-latex-format-headline-default-function' by default,
which format headlines like for Org version prior to 8.0."
:group 'org-export-latex :group 'org-export-latex
:version "24.4" :version "24.4"
:package-version '(Org . "8.0") :package-version '(Org . "8.0")
@ -683,17 +681,16 @@ The default function simply returns the value of CONTENTS."
'org-latex-format-inlinetask-default-function 'org-latex-format-inlinetask-default-function
"Function called to format an inlinetask in LaTeX code. "Function called to format an inlinetask in LaTeX code.
The function must accept six parameters: The function must accept seven parameters:
TODO the todo keyword, as a string TODO the todo keyword (string or nil)
TODO-TYPE the todo type, a symbol among `todo', `done' and nil. TODO-TYPE the todo type (symbol: `todo', `done', nil)
PRIORITY the inlinetask priority, as a string PRIORITY the inlinetask priority (integer or nil)
NAME the inlinetask name, as a string. NAME the inlinetask name (string)
TAGS the inlinetask tags, as a list of strings. TAGS the inlinetask tags (list of strings or nil)
CONTENTS the contents of the inlinetask, as a string. CONTENTS the contents of the inlinetask (string or nil)
INFO the export options (plist)
The function should return the string to be exported. The function should return the string to be exported."
Use `org-latex-format-headline-default-function' by default."
:group 'org-export-latex :group 'org-export-latex
:type 'function :type 'function
:version "24.5" :version "24.5"
@ -1466,7 +1463,7 @@ holding contextual information."
;; Create the headline text along with a no-tag version. ;; Create the headline text along with a no-tag version.
;; The latter is required to remove tags from toc. ;; The latter is required to remove tags from toc.
(full-text (funcall (plist-get info :latex-format-headline-function) (full-text (funcall (plist-get info :latex-format-headline-function)
todo todo-type priority text tags)) todo todo-type priority text tags info))
;; Associate \label to the headline for internal links. ;; Associate \label to the headline for internal links.
(headline-label (headline-label
(let ((custom-label (let ((custom-label
@ -1514,7 +1511,8 @@ holding contextual information."
(org-export-data-with-backend (org-export-data-with-backend
(org-export-get-alt-title headline info) (org-export-get-alt-title headline info)
section-back-end info) section-back-end info)
(and (eq (plist-get info :with-tags) t) tags)))) (and (eq (plist-get info :with-tags) t) tags)
info)))
(if (and numberedp opt-title (if (and numberedp opt-title
(not (equal opt-title full-text)) (not (equal opt-title full-text))
(string-match "\\`\\\\\\(.*?[^*]\\){" section-fmt)) (string-match "\\`\\\\\\(.*?[^*]\\){" section-fmt))
@ -1532,7 +1530,7 @@ holding contextual information."
(concat headline-label pre-blanks contents)))))))) (concat headline-label pre-blanks contents))))))))
(defun org-latex-format-headline-default-function (defun org-latex-format-headline-default-function
(todo todo-type priority text tags) (todo todo-type priority text tags info)
"Default format function for a headline. "Default format function for a headline.
See `org-latex-format-headline-function' for details." See `org-latex-format-headline-function' for details."
(concat (concat
@ -1540,7 +1538,9 @@ See `org-latex-format-headline-function' for details."
(and priority (format "\\framebox{\\#%c} " priority)) (and priority (format "\\framebox{\\#%c} " priority))
text text
(and tags (and tags
(format "\\hfill{}\\textsc{%s}" (mapconcat 'identity tags ":"))))) (format "\\hfill{}\\textsc{%s}"
(mapconcat (lambda (tag) (org-latex-plain-text tag info))
tags ":")))))
;;;; Horizontal Rule ;;;; Horizontal Rule
@ -1621,18 +1621,21 @@ holding contextual information."
(and label (format "\\label{%s}\n" label))) (and label (format "\\label{%s}\n" label)))
contents))) contents)))
(funcall (plist-get info :latex-format-inlinetask-function) (funcall (plist-get info :latex-format-inlinetask-function)
todo todo-type priority title tags contents))) todo todo-type priority title tags contents info)))
(defun org-latex-format-inlinetask-default-function (defun org-latex-format-inlinetask-default-function
(todo todo-type priority title tags contents) (todo todo-type priority title tags contents info)
"Default format function for a inlinetasks. "Default format function for a inlinetasks.
See `org-latex-format-inlinetask-function' for details." See `org-latex-format-inlinetask-function' for details."
(let ((full-title (let ((full-title
(concat (when todo (format "\\textbf{\\textsf{\\textsc{%s}}} " todo)) (concat (when todo (format "\\textbf{\\textsf{\\textsc{%s}}} " todo))
(when priority (format "\\framebox{\\#%c} " priority)) (when priority (format "\\framebox{\\#%c} " priority))
title title
(when tags (format "\\hfill{}\\textsc{:%s:}" (when tags
(mapconcat #'identity tags ":")))))) (format "\\hfill{}\\textsc{:%s:}"
(mapconcat
(lambda (tag) (org-latex-plain-text tag info))
tags ":"))))))
(concat "\\begin{center}\n" (concat "\\begin{center}\n"
"\\fbox{\n" "\\fbox{\n"
"\\begin{minipage}[c]{.6\\textwidth}\n" "\\begin{minipage}[c]{.6\\textwidth}\n"
@ -2045,47 +2048,35 @@ contextual information."
"Transcode a TEXT string from Org to LaTeX. "Transcode a TEXT string from Org to LaTeX.
TEXT is the string to transcode. INFO is a plist holding TEXT is the string to transcode. INFO is a plist holding
contextual information." contextual information."
(let ((specialp (plist-get info :with-special-strings)) (let* ((specialp (plist-get info :with-special-strings))
(output text)) (output
;; Protect %, #, &, $, _, { and }. ;; Turn LaTeX into \LaTeX{} and TeX into \TeX{}.
(while (string-match "\\([^\\]\\|^\\)\\([%$#&{}_]\\)" output) (let ((case-fold-search nil))
(setq output
(replace-match
(format "\\%s" (match-string 2 output)) nil t output 2)))
;; Protect ^.
(setq output
(replace-regexp-in-string
"\\([^\\]\\|^\\)\\(\\^\\)" "\\\\^{}" output nil nil 2))
;; Protect \. If special strings are used, be careful not to
;; protect "\" in "\-" constructs.
(let ((symbols (if specialp "-%$#&{}^_\\" "%$#&{}^_\\")))
(setq output
(replace-regexp-in-string (replace-regexp-in-string
(format "\\(?:[^\\]\\|^\\)\\(\\\\\\)\\(?:[^%s]\\|$\\)" symbols) "\\<\\(?:La\\)?TeX\\>" "\\\\\\&{}"
"$\\backslash$" output nil t 1))) ;; Protect ^, ~, %, #, &, $, _, { and }. Also protect \.
;; Protect ~. ;; However, if special strings are used, be careful not
(setq output ;; to protect "\" in "\-" constructs.
(replace-regexp-in-string (replace-regexp-in-string
"\\([^\\]\\|^\\)\\(~\\)" "\\textasciitilde{}" output nil t 2)) (concat "[%$#&{}_~^]\\|\\\\" (and specialp "\\(?:[^-]\\|$\\)"))
(lambda (m)
(case (aref m 0)
(?\\ "$\\\\backslash$")
(?~ "\\\\textasciitilde{}")
(?^ "\\\\^{}")
(t "\\\\\\&")))
text)))))
;; Activate smart quotes. Be sure to provide original TEXT string ;; Activate smart quotes. Be sure to provide original TEXT string
;; since OUTPUT may have been modified. ;; since OUTPUT may have been modified.
(when (plist-get info :with-smart-quotes) (when (plist-get info :with-smart-quotes)
(setq output (org-export-activate-smart-quotes output :latex info text))) (setq output (org-export-activate-smart-quotes output :latex info text)))
;; LaTeX into \LaTeX{} and TeX into \TeX{}.
(let ((case-fold-search nil)
(start 0))
(while (string-match "\\<\\(\\(?:La\\)?TeX\\)\\>" output start)
(setq output (replace-match
(format "\\%s{}" (match-string 1 output)) nil t output)
start (match-end 0))))
;; Convert special strings. ;; Convert special strings.
(when specialp (when specialp
(setq output (setq output (replace-regexp-in-string "\\.\\.\\." "\\\\ldots{}" output)))
(replace-regexp-in-string "\\.\\.\\." "\\ldots{}" output nil t)))
;; Handle break preservation if required. ;; Handle break preservation if required.
(when (plist-get info :preserve-breaks) (when (plist-get info :preserve-breaks)
(setq output (replace-regexp-in-string (setq output (replace-regexp-in-string
"\\(\\\\\\\\\\)?[ \t]*\n" " \\\\\\\\\n" output))) "\\(?:[ \t]*\\\\\\\\\\)?[ \t]*\n" "\\\\\n" output nil t)))
;; Return value. ;; Return value.
output)) output))
@ -2874,15 +2865,14 @@ information."
"Transcode a TIMESTAMP object from Org to LaTeX. "Transcode a TIMESTAMP object from Org to LaTeX.
CONTENTS is nil. INFO is a plist holding contextual CONTENTS is nil. INFO is a plist holding contextual
information." information."
(let ((value (org-latex-plain-text (let ((value (org-latex-plain-text (org-timestamp-translate timestamp) info)))
(org-timestamp-translate timestamp) info))) (format
(case (org-element-property :type timestamp) (plist-get info
((active active-range) (case (org-element-property :type timestamp)
(format (plist-get info :latex-active-timestamp-format) value)) ((active active-range) :latex-active-timestamp-format)
((inactive inactive-range) ((inactive inactive-range) :latex-inactive-timestamp-format)
(format (plist-get info :latex-inactive-timestamp-format) value)) (otherwise :latex-diary-timestamp-format)))
(otherwise value)))
(format (plist-get info :latex-diary-timestamp-format) value)))))
;;;; Underline ;;;; Underline
@ -2916,16 +2906,14 @@ contextual information."
;; character and change each white space at beginning of a line ;; character and change each white space at beginning of a line
;; into a space of 1 em. Also change each blank line with ;; into a space of 1 em. Also change each blank line with
;; a vertical space of 1 em. ;; a vertical space of 1 em.
(progn (format "\\begin{verse}\n%s\\end{verse}"
(setq contents (replace-regexp-in-string (replace-regexp-in-string
"^ *\\\\\\\\$" "\\\\vspace*{1em}" "^[ \t]+" (lambda (m) (format "\\hspace*{%dem}" (length m)))
(replace-regexp-in-string (replace-regexp-in-string
"\\(\\\\\\\\\\)?[ \t]*\n" " \\\\\\\\\n" contents))) "^[ \t]*\\\\\\\\$" "\\vspace*{1em}"
(while (string-match "^[ \t]+" contents) (replace-regexp-in-string
(let ((new-str (format "\\hspace*{%dem}" "\\([ \t]*\\\\\\\\\\)?[ \t]*\n" "\\\\\n"
(length (match-string 0 contents))))) contents nil t) nil t) nil t))))
(setq contents (replace-match new-str nil t contents))))
(format "\\begin{verse}\n%s\\end{verse}" contents))))
@ -3074,17 +3062,15 @@ Return PDF file name or an error if it couldn't be produced."
((consp org-latex-pdf-process) ((consp org-latex-pdf-process)
(let ((outbuf (and (not snippet) (let ((outbuf (and (not snippet)
(get-buffer-create "*Org PDF LaTeX Output*")))) (get-buffer-create "*Org PDF LaTeX Output*"))))
(mapc (dolist (command org-latex-pdf-process)
(lambda (command) (shell-command
(shell-command (replace-regexp-in-string
"%b" (shell-quote-argument base-name)
(replace-regexp-in-string (replace-regexp-in-string
"%b" (shell-quote-argument base-name) "%f" (shell-quote-argument full-name)
(replace-regexp-in-string (replace-regexp-in-string
"%f" (shell-quote-argument full-name) "%o" (shell-quote-argument out-dir) command t t) t t) t t)
(replace-regexp-in-string outbuf))
"%o" (shell-quote-argument out-dir) command t t) t t) t t)
outbuf))
org-latex-pdf-process)
;; Collect standard errors from output buffer. ;; Collect standard errors from output buffer.
(setq warnings (and (not snippet) (setq warnings (and (not snippet)
(org-latex--collect-warnings outbuf))))) (org-latex--collect-warnings outbuf)))))
@ -3126,10 +3112,9 @@ encountered or nil if there was none."
(let ((case-fold-search t) (let ((case-fold-search t)
(warnings "")) (warnings ""))
(dolist (warning org-latex-known-warnings) (dolist (warning org-latex-known-warnings)
(save-excursion (when (save-excursion (re-search-forward (car warning) nil t))
(when (save-excursion (re-search-forward (car warning) nil t)) (setq warnings (concat warnings " " (cdr warning)))))
(setq warnings (concat warnings " " (cdr warning)))))) (org-string-nw-p (org-trim warnings))))))))
(and (org-string-nw-p warnings) (org-trim warnings))))))))
;;;###autoload ;;;###autoload
(defun org-latex-publish-to-latex (plist filename pub-dir) (defun org-latex-publish-to-latex (plist filename pub-dir)