|
@@ -55,9 +55,12 @@
|
|
|
;; adding more).
|
|
|
;;
|
|
|
;; - As a special case, if the "BEAMER_env" property is set to either
|
|
|
-;; "appendix", "note" or "noteNH", the headline will become,
|
|
|
-;; respectively, an appendix, a note (within frame or between frame,
|
|
|
-;; depending on its level) and a note with its title ignored.
|
|
|
+;; "appendix", "note", "noteNH" or "againframe", the headline will
|
|
|
+;; become, respectively, an appendix, a note (within frame or
|
|
|
+;; between frame, depending on its level), a note with its title
|
|
|
+;; ignored or an againframe command. In the latter case,
|
|
|
+;; a "BEAMER_ref" property is mandatory in order to refer to the
|
|
|
+;; frame being resumed, and contents are ignored.
|
|
|
;;
|
|
|
;; Also, an headline with an "ignoreheading" value will have its
|
|
|
;; contents only inserted in the output. This special value is
|
|
@@ -181,7 +184,8 @@ You might want to put e.g. \"allowframebreaks=0.9\" here."
|
|
|
"The column widths that should be installed as allowed property values.")
|
|
|
|
|
|
(defconst org-e-beamer-environments-special
|
|
|
- '(("appendix" "x")
|
|
|
+ '(("againframe" "F")
|
|
|
+ ("appendix" "x")
|
|
|
("column" "c")
|
|
|
("frame" "f")
|
|
|
("ignoreheading" "i")
|
|
@@ -331,7 +335,8 @@ channel."
|
|
|
;; (`org-e-beamer--format-block').
|
|
|
;;
|
|
|
;; `org-e-beamer-headline' also takes care of special environments
|
|
|
-;; like "ignoreheading", "note", "noteNH" and "appendix".
|
|
|
+;; like "ignoreheading", "note", "noteNH", "appendix" and
|
|
|
+;; "againframe".
|
|
|
|
|
|
(defun org-e-beamer--frame-level (headline info)
|
|
|
"Return frame level in subtree containing HEADLINE.
|
|
@@ -542,17 +547,61 @@ as a communication channel."
|
|
|
(environment (let ((env (org-element-property :beamer-env headline)))
|
|
|
(if (stringp env) (downcase env) "block"))))
|
|
|
(cond
|
|
|
- ;; Creation of an appendix is requested.
|
|
|
+ ;; Case 1: Resume frame specified by "BEAMER_ref" property.
|
|
|
+ ((equal environment "againframe")
|
|
|
+ (concat "\\againframe"
|
|
|
+ ;; Overlay specification.
|
|
|
+ (let ((overlay (org-element-property :beamer-act headline)))
|
|
|
+ (when overlay
|
|
|
+ (org-e-beamer--normalize-argument
|
|
|
+ overlay
|
|
|
+ (if (string-match "^\\[.*\\]$" overlay) 'defaction
|
|
|
+ 'action))))
|
|
|
+ ;; Options.
|
|
|
+ (let ((options (org-element-property :beamer-opt headline)))
|
|
|
+ (when options
|
|
|
+ (org-e-beamer--normalize-argument options 'option)))
|
|
|
+ ;; Resolve reference provided by "BEAMER_ref"
|
|
|
+ ;; property. This is done by building a minimal fake
|
|
|
+ ;; link and calling the appropriate resolve function,
|
|
|
+ ;; depending on the reference syntax.
|
|
|
+ (let* ((ref (org-element-property :beamer-ref headline))
|
|
|
+ (type (progn
|
|
|
+ (string-match "^\\(id:\\|#\\|\\*\\)?\\(.*\\)" ref)
|
|
|
+ (cond
|
|
|
+ ((or (not (match-string 1 ref))
|
|
|
+ (equal (match-string 1 ref) "*")) 'fuzzy)
|
|
|
+ ((equal (match-string 1 ref) "id:") 'id)
|
|
|
+ (t 'custom-id))))
|
|
|
+ (link (list 'link (list :path (match-string 2 ref))))
|
|
|
+ (target (if (eq type 'fuzzy)
|
|
|
+ (org-export-resolve-fuzzy-link link info)
|
|
|
+ (org-export-resolve-id-link link info))))
|
|
|
+ ;; Now use user-defined label provided in TARGET
|
|
|
+ ;; headline, or fallback to standard one.
|
|
|
+ (let ((target-opt (org-element-property :beamer-opt target)))
|
|
|
+ (if (and (org-string-nw-p target-opt)
|
|
|
+ (string-match
|
|
|
+ "\\(?:^\\|,\\)label=\\(.*?\\)\\(?:$\\|,\\)"
|
|
|
+ target-opt))
|
|
|
+ (format "{%s}" (match-string 1 target-opt))
|
|
|
+ (format "{sec-%s}"
|
|
|
+ (mapconcat
|
|
|
+ 'number-to-string
|
|
|
+ (org-export-get-headline-number target info)
|
|
|
+ "-")))))))
|
|
|
+ ;; Case 2: Creation of an appendix is requested.
|
|
|
((equal environment "appendix")
|
|
|
(concat "\\appendix"
|
|
|
(org-element-property :beamer-act headline)
|
|
|
"\n"
|
|
|
(make-string (org-element-property :pre-blank headline) ?\n)
|
|
|
contents))
|
|
|
+ ;; Case 3: Ignore heading.
|
|
|
((equal environment "ignoreheading")
|
|
|
(concat (make-string (org-element-property :pre-blank headline) ?\n)
|
|
|
contents))
|
|
|
- ;; HEADLINE is a note.
|
|
|
+ ;; Case 4: HEADLINE is a note.
|
|
|
((member environment '("note" "noteNH"))
|
|
|
(format "\\note{%s}"
|
|
|
(concat (and (equal environment "note")
|
|
@@ -561,13 +610,14 @@ as a communication channel."
|
|
|
(org-element-property :title headline) info)
|
|
|
"\n"))
|
|
|
(org-trim contents))))
|
|
|
- ;; HEADLINE is a frame.
|
|
|
+ ;; Case 5: HEADLINE is a frame.
|
|
|
((or (equal environment "frame") (= level frame-level))
|
|
|
(org-e-beamer--format-frame headline contents info))
|
|
|
- ;; Regular section, extracted from `org-e-latex-classes'.
|
|
|
+ ;; Case 6: Regular section, extracted from
|
|
|
+ ;; `org-e-latex-classes'.
|
|
|
((< level frame-level)
|
|
|
(org-e-beamer--format-section headline contents info))
|
|
|
- ;; Otherwise, HEADLINE is a block.
|
|
|
+ ;; Case 7: Otherwise, HEADLINE is a block.
|
|
|
(t (org-e-beamer--format-block headline contents info))))))
|
|
|
|
|
|
|
|
@@ -1032,14 +1082,25 @@ aid, but the tag does not have any semantic meaning."
|
|
|
(org-set-tags)
|
|
|
(let ((tags (or (ignore-errors (org-get-tags-string)) "")))
|
|
|
(cond
|
|
|
+ ;; For a column, automatically ask for its width.
|
|
|
((eq org-last-tag-selection-key ?|)
|
|
|
(if (string-match ":BMCOL:" tags)
|
|
|
(org-set-property "BEAMER_col" (read-string "Column width: "))
|
|
|
(org-delete-property "BEAMER_col")))
|
|
|
- ((string-match (concat ":B_\\("
|
|
|
- (mapconcat 'car envs "\\|")
|
|
|
- "\\):")
|
|
|
- tags)
|
|
|
+ ;; For an "againframe" section, automatically ask for reference
|
|
|
+ ;; to resumed frame and overlay specifications.
|
|
|
+ ((eq org-last-tag-selection-key ?F)
|
|
|
+ (if (equal (org-entry-get nil "BEAMER_env") "againframe")
|
|
|
+ (progn (org-entry-delete nil "BEAMER_env")
|
|
|
+ (org-entry-delete nil "BEAMER_ref")
|
|
|
+ (org-entry-delete nil "BEAMER_act"))
|
|
|
+ (org-entry-put nil "BEAMER_env" "againframe")
|
|
|
+ (org-set-property
|
|
|
+ "BEAMER_ref"
|
|
|
+ (read-string "Frame reference (*Title, #custom-id, id:...): "))
|
|
|
+ (org-set-property "BEAMER_act"
|
|
|
+ (read-string "Overlay specification: "))))
|
|
|
+ ((string-match (concat ":B_\\(" (mapconcat 'car envs "\\|") "\\):") tags)
|
|
|
(org-entry-put nil "BEAMER_env" (match-string 1 tags)))
|
|
|
(t (org-entry-delete nil "BEAMER_env"))))))
|
|
|
|