org-odt.el: Support for anchoring an image to a page
* etc/styles/OrgOdtStyles.xml(OrgPageImage) (OrgPageImageCaptionFrame): New styles for anchoring an image centrally on a page. * lisp/org-odt.el (org-odt-entity-frame-styles): Accommodate new frame styles: \"OrgPageImage\" and \"OrgPageImageCaptionFrame\". (org-export-odt-format-image): Handle frame-related :anchor, :style and :attributes options attached to images as shown below: [[./image.png]] (org-odt-merge-frame-params): New. Auxiliary routine to merge the default frame params and user-specified frame params. (org-odt-format-entity): Use the above `org-odt-merge-frame-params'. Jérémy Compostella <jeremy.compostella@gmail.com> writes: I need to add pictures that are anchored to the \"page\" and not to the \"paragraph\". This is very useful to get a \"floating picture\" on an entire page without text breaks. He also adds: Sometimes, you want to add a picture but you don't want a page break. For example, you want to add a big illustration. To render correctly, the picture needs its own page but you don't want to break the page. In this case you need to anchor the picture to the \"page\". http://lists.gnu.org/archive/html/emacs-orgmode/2011-11/msg00869.html
This commit is contained in:
parent
5136d2ee41
commit
2512637fce
|
@ -391,6 +391,12 @@
|
|||
<style:graphic-properties text:anchor-type="paragraph" style:wrap="none" style:vertical-pos="top" style:vertical-rel="paragraph" style:horizontal-pos="center" style:horizontal-rel="paragraph"/>
|
||||
</style:style>
|
||||
|
||||
<style:style style:name="OrgPageImage" style:family="graphic" style:parent-style-name="Graphics">
|
||||
<style:graphic-properties text:anchor-type="page" fo:margin-top="0.21cm" fo:margin-bottom="0.21cm" style:vertical-pos="middle" style:vertical-rel="page" style:horizontal-pos="center" style:horizontal-rel="page" fo:background-color="transparent" style:background-transparency="100%" style:shadow="none" style:mirror="none" fo:clip="rect(0cm, 0cm, 0cm, 0cm)" draw:luminance="0%" draw:contrast="0%" draw:red="0%" draw:green="0%" draw:blue="0%" draw:gamma="100%" draw:color-inversion="false" draw:image-opacity="100%" draw:color-mode="standard">
|
||||
<style:background-image/>
|
||||
</style:graphic-properties>
|
||||
</style:style>
|
||||
|
||||
<!-- Captioned Images -->
|
||||
<style:style style:name="OrgCaptionedImage" style:family="graphic" style:parent-style-name="Graphics">
|
||||
<style:graphic-properties style:rel-width="100%" text:anchor-type="paragraph" fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" style:run-through="foreground" style:wrap="none" style:vertical-pos="from-top" style:vertical-rel="paragraph-content" style:horizontal-pos="from-left" style:horizontal-rel="paragraph-content" fo:padding="0cm" fo:border="none" style:shadow="none"/>
|
||||
|
@ -400,6 +406,12 @@
|
|||
<style:graphic-properties text:anchor-type="paragraph" fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0cm" fo:margin-bottom="0cm" style:wrap="none" style:vertical-pos="top" style:vertical-rel="paragraph" style:horizontal-pos="center" style:horizontal-rel="paragraph" fo:padding="0cm" fo:border="none"/>
|
||||
</style:style>
|
||||
|
||||
<style:style style:name="OrgPageImageCaptionFrame" style:family="graphic" style:parent-style-name="Frame">
|
||||
<style:graphic-properties text:anchor-type="paragraph" fo:margin-left="0cm" fo:margin-right="0cm" fo:margin-top="0.21cm" fo:margin-bottom="0.21cm" style:wrap="none" style:vertical-pos="middle" style:vertical-rel="page" style:horizontal-pos="center" style:horizontal-rel="page" fo:background-color="transparent" style:background-transparency="100%" fo:padding="0cm" fo:border="none" style:shadow="none">
|
||||
<style:background-image/>
|
||||
</style:graphic-properties>
|
||||
</style:style>
|
||||
|
||||
<!-- Inlined Images -->
|
||||
<style:style style:name="OrgInlineImage" style:family="graphic" style:parent-style-name="Graphics">
|
||||
<style:graphic-properties text:anchor-type="as-char" style:vertical-pos="top" style:vertical-rel="baseline" style:horizontal-pos="center" style:horizontal-rel="paragraph"/>
|
||||
|
|
|
@ -1383,7 +1383,7 @@ value of `org-export-odt-fontify-srcblocks."
|
|||
(org-lparse-insert-list-table
|
||||
`((,(org-odt-format-entity
|
||||
(if caption "CaptionedDisplayFormula" "DisplayFormula")
|
||||
href width height caption nil)
|
||||
href width height :caption caption :label nil)
|
||||
,(if (not label) ""
|
||||
(org-odt-format-entity-caption label nil "__MathFormula__"))))
|
||||
nil nil nil "OrgEquation" nil '((1 "c" 8) (2 "c" 1)))
|
||||
|
@ -1585,7 +1585,7 @@ ATTR is a string of other attributes of the a element."
|
|||
(expand-file-name
|
||||
(concat (sha1 file-name) "." (file-name-extension file-name)) "Pictures")))
|
||||
|
||||
(defun org-export-odt-format-image (src href &optional embed-as)
|
||||
(defun org-export-odt-format-image (src href)
|
||||
"Create image tag with source and attributes."
|
||||
(save-match-data
|
||||
(let* ((caption (org-find-text-property-in-string 'org-caption src))
|
||||
|
@ -1593,14 +1593,27 @@ ATTR is a string of other attributes of the a element."
|
|||
(attr (org-find-text-property-in-string 'org-attributes src))
|
||||
(label (org-find-text-property-in-string 'org-label src))
|
||||
(latex-frag (org-find-text-property-in-string
|
||||
'org-latex-src src))
|
||||
'org-latex-src src))
|
||||
(category (and latex-frag "__DvipngImage__"))
|
||||
(embed-as (or embed-as
|
||||
(if latex-frag
|
||||
(or (org-find-text-property-in-string
|
||||
'org-latex-src-embed-type src) 'character)
|
||||
'paragraph)))
|
||||
(attr-plist (org-lparse-get-block-params attr))
|
||||
(user-frame-anchor
|
||||
(car (assoc-string (plist-get attr-plist :anchor)
|
||||
(if (or caption label)
|
||||
'(("paragraph") ("page"))
|
||||
'(("character") ("paragraph") ("page"))) t)))
|
||||
(user-frame-style
|
||||
(and user-frame-anchor (plist-get attr-plist :style)))
|
||||
(user-frame-attrs
|
||||
(and user-frame-anchor (plist-get attr-plist :attributes)))
|
||||
(user-frame-params
|
||||
(list user-frame-style user-frame-attrs user-frame-anchor))
|
||||
(embed-as (cond
|
||||
(latex-frag
|
||||
(symbol-name
|
||||
(or (org-find-text-property-in-string
|
||||
'org-latex-src-embed-type src) 'character)))
|
||||
(user-frame-anchor)
|
||||
(t "paragraph")))
|
||||
(size (org-odt-image-size-from-file
|
||||
src (plist-get attr-plist :width)
|
||||
(plist-get attr-plist :height)
|
||||
|
@ -1609,15 +1622,12 @@ ATTR is a string of other attributes of the a element."
|
|||
(when latex-frag
|
||||
(setq href (org-propertize href :title "LaTeX Fragment"
|
||||
:description latex-frag)))
|
||||
(cond
|
||||
((not (or caption label))
|
||||
(case embed-as
|
||||
(paragraph (org-odt-format-entity "DisplayImage" href width height))
|
||||
(character (org-odt-format-entity "InlineImage" href width height))
|
||||
(t (error "Unknown value for embed-as %S" embed-as))))
|
||||
(t
|
||||
(let ((frame-style-handle (concat (and (or caption label) "Captioned")
|
||||
embed-as "Image")))
|
||||
(org-odt-format-entity
|
||||
"CaptionedDisplayImage" href width height caption label category))))))
|
||||
frame-style-handle href width height
|
||||
:caption caption :label label :category category
|
||||
:user-frame-params user-frame-params)))))
|
||||
|
||||
(defun org-odt-format-object-description (title description)
|
||||
(concat (and title (org-odt-format-tags
|
||||
|
@ -1663,31 +1673,55 @@ ATTR is a string of other attributes of the a element."
|
|||
content) nil nil "OrgInlineTaskFrame" " style:rel-width=\"100%\"")))
|
||||
|
||||
(defvar org-odt-entity-frame-styles
|
||||
'(("InlineImage" "__Figure__" ("OrgInlineImage" nil "as-char"))
|
||||
("DisplayImage" "__Figure__" ("OrgDisplayImage" nil "paragraph"))
|
||||
("CaptionedDisplayImage" "__Figure__"
|
||||
'(("CharacterImage" "__Figure__" ("OrgInlineImage" nil "as-char"))
|
||||
("ParagraphImage" "__Figure__" ("OrgDisplayImage" nil "paragraph"))
|
||||
("PageImage" "__Figure__" ("OrgPageImage" nil "page"))
|
||||
("CaptionedParagraphImage" "__Figure__"
|
||||
("OrgCaptionedImage"
|
||||
" style:rel-width=\"100%\" style:rel-height=\"scale\"" "paragraph")
|
||||
("OrgImageCaptionFrame"))
|
||||
("OrgImageCaptionFrame" nil "paragraph"))
|
||||
("CaptionedPageImage" "__Figure__"
|
||||
("OrgCaptionedImage"
|
||||
" style:rel-width=\"100%\" style:rel-height=\"scale\"" "paragraph")
|
||||
("OrgPageImageCaptionFrame" nil "page"))
|
||||
("InlineFormula" "__MathFormula__" ("OrgInlineFormula" nil "as-char"))
|
||||
("DisplayFormula" "__MathFormula__" ("OrgDisplayFormula" nil "as-char"))
|
||||
("CaptionedDisplayFormula" "__MathFormula__"
|
||||
("OrgCaptionedFormula" nil "paragraph")
|
||||
("OrgFormulaCaptionFrame" nil "as-char"))))
|
||||
|
||||
(defun org-odt-format-entity (entity href width height
|
||||
&optional caption label category)
|
||||
(let* ((entity-style (assoc entity org-odt-entity-frame-styles))
|
||||
(entity-frame (apply 'org-odt-format-frame
|
||||
href width height (nth 2 entity-style))))
|
||||
(if (not (or caption label)) entity-frame
|
||||
(defun org-odt-merge-frame-params(default-frame-params user-frame-params)
|
||||
(if (not user-frame-params) default-frame-params
|
||||
(assert (= (length default-frame-params) 3))
|
||||
(assert (= (length user-frame-params) 3))
|
||||
(loop for user-frame-param in user-frame-params
|
||||
for default-frame-param in default-frame-params
|
||||
collect (or user-frame-param default-frame-param))))
|
||||
|
||||
(defun* org-odt-format-entity (entity href width height
|
||||
&key caption label category
|
||||
user-frame-params)
|
||||
(let* ((entity-style (assoc-string entity org-odt-entity-frame-styles t))
|
||||
default-frame-params frame-params)
|
||||
(cond
|
||||
((not (or caption label))
|
||||
(setq default-frame-params (nth 2 entity-style))
|
||||
(setq frame-params (org-odt-merge-frame-params
|
||||
default-frame-params user-frame-params))
|
||||
(apply 'org-odt-format-frame href width height frame-params))
|
||||
(t
|
||||
(setq default-frame-params (nth 3 entity-style))
|
||||
(setq frame-params (org-odt-merge-frame-params
|
||||
default-frame-params user-frame-params))
|
||||
(apply 'org-odt-format-textbox
|
||||
(org-odt-format-stylized-paragraph
|
||||
'illustration
|
||||
(concat entity-frame
|
||||
(org-odt-format-entity-caption
|
||||
label caption (or category (nth 1 entity-style)))))
|
||||
width height (nth 3 entity-style)))))
|
||||
(concat
|
||||
(apply 'org-odt-format-frame href width height
|
||||
(nth 2 entity-style))
|
||||
(org-odt-format-entity-caption
|
||||
label caption (or category (nth 1 entity-style)))))
|
||||
width height frame-params)))))
|
||||
|
||||
(defvar org-odt-embedded-images-count 0)
|
||||
(defun org-odt-copy-image-file (path)
|
||||
|
|
Loading…
Reference in New Issue