When writing a literate program in Org mode, exporting is analogous to weaving in earlier literate programming tools such as cweb or noweb. Those tools would add a code block name to the woven (exported) output. In Org mode, it would look something like this:
Org file:
#+NAME: mycodeblock
#+BEGIN_SRC language
[Source code here]
#+END_SRC
Exported output:
<mycodeblock>=
[Source code here]
I am wondering if there is any support in Org mode for exporting names of code blocks in this style. If not, is there any way to at least output the name of the code block as a label of some kind?
I have seen hints that names of code blocks can be exported, but I have failed to find the exact syntax.
You could experiment with:
;; template used to export the body of code blocks
(setq org-babel-exp-code-template
;; (concat "\n=%name=:\n"
org-babel-exp-code-template)
;; )
)
Though, that's not as nice as the results of NuWeb / NoWeb; see http://lists.gnu.org/archive/html/emacs-orgmode/2009-12/msg00170.html for a comparison of them vs Org (though the PDF links aren't accessible anymore).
Related
With just the few lines in a file file.adoc
////
-*-iimage-mode-*-
////
.A PNG smiley
image::smiley.png[]
I can generate HTML using asciidoctor and MS-word .doc using pandoc.
This toolchain doesn't handle SVG, and so it's not perfect, but it works well, and
it's free.
file.html
There is a snag though:
I'd like iimage-mode to be enabled when I load file.adoc. My attempt (the first three lines in the source above) doesn't work. Can you think of a way that will?
.emacs
(set-foreground-color "white")
(set-background-color "black")
(require 'adoc-mode)
(setq auto-mode-alist (cons '("\\.adoc\\'" . adoc-mode) auto-mode-alist))
Comments
I am writing these comments here to be able to typeset.
Asciidoctor
(I'm using to the superior implementation of the asciidoc syntax written in Ruby) does have (now?) line comments in addition to block comments.
Using
// -- mode: iimage --
on the first line works (thanks, Nick). But it replaces the adoc major mode (thanks, phils).
Adding at the bottom of the file:
//// Local Variables:
eval: (iimage-mode 1)
End:
////
switches to minor mode iimage while the major mode remains adoc.
phils's suggestion to use my-adoc-mode-hook works well.
I'm forking the second part to a separate question. This discussion is already long enough for one question.
Update
Using asciidoctor + pandoc may produce a .doc file that is handled correctly with a recent version of MS-Word. Comments welcome. MS-Word 2011 on OS X opens the resulting .doc file fine, but shows an error message in the place of SVG images.
If this works, it will (finally) be a way to send a .doc file to all those people who insist on them, while editing in an environment as flexible as Emacs.
I tried with a JPG that I had lying around and I don't get any artifacts at all.
The spec is -*- mode: iimage -*- and it's got to be on the first line of the file (it can be on the second if the first line specifies an interpreter, e.g. #! /bin bash).
If that does not work for you, you can use a file variable at the end of the file:
//// Local Variables:
//// mode: iimage
//// End:
See File Variables.
EDIT: See #phils's answer for a more correct description of how to handle minor modes.
Nick's answer is mostly correct, but iimage-mode is a minor mode, and using mode:... in local variables is (nowadays) intended for major modes only. Using it to enable minor modes is deprecated (even if it still works in some situations1).
Instead use eval:... to call the minor mode function like so2:
//// -*- eval: (iimage-mode 1); -*-
or
//// Local Variables:
//// eval: (iimage-mode 1)
//// End:
Note also that -*- iimage -*- is equivalent to -*- mode: iimage -*-, and that for both forms Emacs appends a -mode suffix to get the actual mode name.
Hence -*-iimage-mode-*- is asking to use iimage-mode-mode -- and in fact Emacs should have produced a message "Ignoring unknown mode `iimage-mode-mode'".
Finally, if you want iimage-mode enabled for all adoc-mode files, then you can use a mode hook in your init file instead of using file-local variables:
(add-hook 'adoc-mode-hook 'my-adoc-mode-hook)
(defun my-adoc-mode-hook ()
"Custom `adoc-mode' behaviours."
(iimage-mode 1))
1 In this case, if you had used -*-iimage-*- or -*-mode: iimage-*- as the only local variable mode spec, Emacs would treat it as a major mode, and your intended adoc-mode major mode would not be used.
2 I'm following Nick's answer in assuming that //// is the correct line-comment prefix, but the question makes it look more like a block comment syntax, so I don't know if it's correct.
I have recently switched all my doc writing to org-mode. The outlining framework works for my flow and the markdown syntax allows me to write in rich text.
The default export options are, however, horrible. The default Latex template especially. The first paragraph is not indented but the rest are, the preform text blocks are cutoff at the right margin, the font is ugly, etc.
I did find a free template that I liked, but it was an elisp file. It has no instructions to install. How do I use it for exporting my documents?
This is more a matter of LaTeX customization than org-mode. The basics of e.g., using the koma classes rather than the default LaTeX classes are described in Tom Dye's document: http://orgmode.org/worg/org-tutorials/org-latex-export.html#orgheadline4 (note that the document describes the old exporter - pre-8.0 - but this particular section applies to the new exporter as well).
Alternatively, you can keep the default classes but change all the things you don't like by introducing explicit LaTeX customization in your org document. E.g., changing the font is just a matter of adding something like this to your document:
#+LATEX_HEADER: \usepackage{times}
Changing the default paragraph style can be done with
#+LATEX_HEADER: \usepackage{indentfirst}
and so on. Note that you have to know something about what LaTeX packages are available, what they do and how to install them, but that is definitely not an org-mode question.
You can define some global LaTeX class settings like this:
(setq org-export-latex-classes
(quote
(("article" "\\documentclass[11pt]{scrartcl}
\\usepackage[utf8]{inputenc}
\\usepackage[T1]{fontenc}
\\usepackage{graphicx}
\\usepackage{longtable}
\\usepackage{listings}
\\usepackage[ngerman]{babel}
\\usepackage{float}
\\usepackage{soul}
\\usepackage{amssymb}
\\usepackage{hyperref}"
("\\section{%s}" . "\\section{%s}")
("\\subsection{%s}" . "\\subsection{%s}")
("\\subsubsection{%s}" . "\\subsubsection{%s}")
("\\paragraph{%s}" . "\\paragraph{%s}")
("\\subparagraph{%s}" . "\\subparagraph{%s}")))
))
See also: The Org-article LaTeX class
I am specifically interested in Literate Programming in which the documentation and source code are in one file. Org-Mode has support for Babel's ability to embed source code blocks. One shortcoming is that syntactical highlighting doesn't work, and you can't take advantage of the full Language-mode features when the block is in Org-Mode.
Babel supports 'tangling' source code, which copies the source code into a named file, such as test.py. I am looking for a solution which will let me develop the source code in a fully featured Language-Mode, while being able to document that code, explaining the 'Why', in org mode.
Within the <body> of a source code block
#+NAME: <name>
#+BEGIN_SRC <language> <switches> <header arguments>
<body>
#+END_SRC
C-c ' will open a buffer in the appropriate major mode for <language>. The Babel documentation is here.
I have some XML inside an org mode file, and when export it to HTML, it's urgent display, so I an thinking of code block, such as
#+BEGIN_SRC java
#+END_SRC
But there is no XML support. What's the normal way to include XML in org mode?
I wonder if you've gotten confused by this list of supported languages, which does not include XML.
This list is the languages supported by Babel, which lets code snippets be executed from Org. Since XML is a markup language and not a programming language, it is not surprising that it is not included.
As far as I know, source code blocks can be in any language that you wish. The following works just fine for me:
#+BEGIN_SRC nxml
<test>
</test>
#+END_SRC
When point is in this block, C-c ' opens up the code block in a dedicated nxml-mode buffer, where the content can be edited at will. C-c ' closes this temporary buffer and updates my Org file.
Exported HTML includes this code block.
When I do C-c C-e l to export an Org file to LaTeX it produces a document with a particular preamble. Instead of this particular preamble I would like it to use a preamble of my choice. Say that I want it to use the following preamble:
% Don't forget to qpdf --linearize the final copy
\RequirePackage[l2tabu,orthodox]{nag}% Old habits die hard. All the same, there are commands, classes and packages which are outdated and superseded. nag provides routines to warn the user about the use of those.
\immediate\write18{sh ./vc}
\input{vc}% Version control macros (for \VCDateISO in \date) http://www.ctan.org/pkg/vc
\documentclass[a4paper,12pt]{article}% pt? doublepage?
%\usepackage{geometry}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}% Latin Modern (derivate of Knuth's CM)
\usepackage{fixltx2e}% \textsubscript and bugfixes for LaTeX
\usepackage{microtype}
\usepackage[strict=true]{csquotes}% Context-sensistive quotes. \enquote "" \enquote* ''. Use the integrated commands \textcquote and \blockcquote rather than biblatex internal commands to get contex sensistive quotes for them too. s/babel/autostyle in new version.
\usepackage[bookmarks,pdfborder={0 0 0}]{hyperref}% links and pdfinfo. MUST BE LOADED LAST!
\hypersetup{% Setup for hyperref
pdftitle = {[Title from #+TITLE]},
pdfauthor = {[Author from #+AUTHOR]}
}
I know that you can manipulate which packages are used on a per file basis as described in the manual but I want this preamble to be used for all files unless ) specify otherwise. The preamble I want to use includes the following:
deactivated packages (such as geometry above)
packages loaded by RequirePackage
input macros
\immediate\write18 macros
comments after usepackage macros
a hypersetup macro that recognizes #+TITLE and #+AUTHOR from Org-mode files
Deactivated packages (such as geometry above)
Org-mode recognizes LaTeX syntax inside LaTeX code-blocks, as well as when including LaTeX files in the content. (See Quoting LaTeX code.)
Packages loaded by RequirePackage
As above.
Input macros
As above.
\immediate\write18 macros
I believe this should also be as above, however there is an alternate method of dealing with this. If you create a source code block of type sh with the command within it, Org will evaluate it on export and produce the desired behaviour. You have to enable sh as a babel language type for it to work however.
(require 'ob-shell)
You can also include sh as one of the languages loaded by babel by adding it to org-babel-load-languages
(acons 'sh 't org-babel-load-languages)
Then use a code block similar to the following to run your ./vc
#+name: Test
#+begin_src sh :results output silent :exports results
./vc
#+end_src
As long as this comes before your \input{vc} line it should run the code and then include it. Simply follow the code-block with
#+LATEX: \input{vc}
And your content should be included.
Comments after usepackage macros
If the code is within a LaTeX block it should recognize it as LaTeX.
A hypersetup macro that recognizes #+TITLE and #+AUTHOR from Org-mode files.
This will have to be included within each document rather than separate. The following will provide what you desire for your macros. It will not be within the preamble, however it will end up at the top of the document and the export does behave as expected (however it will not behave as expected if added through #+INCLUDE: from org.
#+begin_latex
\hypersetup{% Setup for hyperref
pdftitle = {{{{TITLE}}}}, %Org macro to take from #+TITLE
pdfauthor = {{{{AUTHOR}}}} %Org macro to take from #+AUTHOR
}
#+end_latex
Creating your own Latex export class
If you follow the instructions in the worg tutorials (See Org Latex Export) you can create your own export-class. If you want to have full control over the packages in the preamble you would simply need to:
(add-to-list 'org-export-latex-classes
'("<CLASS NAME>"
"\\documentclass{article}
[NO-DEFAULT-PACKAGES]
[NO-PACKAGES]"
<insert desired sectioning configuration>))
You can also add in your desired packages between the \\documentclass and [NO-DEFAULT-PACKAGES] lines. The alternative would be to add them to the file itself using:
#+LATEX_CLASS: <CLASS NAME>
#+LATEX_HEADER: \usepackage{package}
...
As a third option, you can simply create a custom .sty file with the desired packages etc and include it as a single #+LATEX_HEADER:.
This doesn't answer your question, but it does allow you to do what you want.
(defun headless-latex ()
"exports to a .tex file without any preamble"
(interactive)
(org-export-as-latex 3 nil nil nil t nil)
)
This function exports the content of your ORG-mode file without any preamble. You can then \input it into a file with your desired preamble. Further reading.
I use a different method to get things done :
Define a class (I call it per-file-class for some strange reason. You can call it something else). Put this code in your .emacs :
;; per-file-class with minimal packages
(unless (find "per-file-class" org-export-latex-classes :key 'car
:test 'equal)
(add-to-list 'org-export-latex-classes
'("per-file-class"
"\\documentclass{article}
[NO-DEFAULT-PACKAGES]
[EXTRA]"
("\\section{%s}" . "\\section*{%s}")
("\\subsection{%s}" . "\\subsection*{%s}")
("\\subsubsection{%s}" . "\\subsubsection*{%s}")
("\\paragraph{%s}" . "\\paragraph*{%s}")
("\\subparagraph{%s}" . "\\subparagraph*{%s}"))))
Use this class in your org file :
#+LaTeX_CLASS: per-file-class
#+LaTeX_CLASS_OPTIONS: [10pt, a4paper]
I'm not allowed to comment (bad reputation or something ;-)) so I will post an answer. A previous answer had a very nice snippet of code for a headless export function. That code needs updating for later versions of org:
(defun headless-latex ()
"exports to a .tex file without any preamble"
(interactive)
(org-latex-export-as-latex nil nil nil t nil)
)