Hi Xianwen, I think the easiest way to conditionally include text in the preamble of the document would be by including a file which can be empty sometimes, and contain the appropriate text when needed. For example, you could have something like this in your Org file: #+include: ./printanswers.org #+TITLE: Test ... Then the following function will automatically export the file twice, one with the \printanswers command inserted then rename the resulting file, and export again without: (defun org-latex-export-exams () (interactive) (write-region "#+latex_header: \\printanswers" nil "printanswers.org") (org-latex-export-to-pdf) (rename-file (org-export-output-file-name ".pdf") (org-export-output-file-name "-with_answers.pdf")) (write-region "" nil "printanswers.org") (org-latex-export-to-pdf)) You can then run M-x org-latex-export-exams to generate both files. Hope this helps, --Diego On Wed, Mar 24, 2021 at 11:21 AM Xianwen Chen (陈贤文) wrote: > Dear Christine (and CC list), > > Thank you! > > > > On 2021-03-19 10:13, Christine Köhn wrote: > > Here is one way to do the latex part. You could pass a jobname to latex. > > I have this > > \IfEndWith*{\jobname}{withsolution}{% > \usepackage{todonotes} > \printanswers > }{\usepackage[disable]{todonotes}} > > in a myexam.sty file to switch between modes (with or without solutions > and todo notes) and use it in the latex file with > > \usepackage{myexam} > > You could add your own latex class to org-latex-classes and add this > line there. > > The jobname has to be passed to latex with something like -jobname > withsolution if you want it to be with solutions. I use a Makefile for > this purpose which calls latexmk > > latexmk -pdf -pdflatex="pdflatex --interaction=errorstopmode" -use-make > > and adds -jobname=$(basename $@) if asked to create a pdf ending with > withsolution.pdf. I can send you the Makefile if you're interested. > > > That's very interesting way to solve the problem using LaTeX. Thank you > for sharing this. At the moment I'm leaning more towards solving it using > emacs lisp. > > > To use the jobname from within orgmode, you'll have to change > org-latex-pdf-process to use the jobname if needed. I think one way to > achieve this is to add a new export backend which is derived from latex > (see org-export-define-derived-backend) and which sets > org-latex-pdf-process accordingly (and resets it afterwards). > > > Thank you again. I'm thinking of a function like following. I'm using > comments to express the programming detail that I don't know how to do yet. > > (deffun org-latex-export-to-pdf-exam () > (interactive) > # do some emacs lisp to add \printanswers to the end of org document > header, i.e., adding a line of #+LATEX_HEADER: \printanswers > (org-latex-export-to-pdf) > # do some emacs lips to move the foo.pdf to foo-with_solutions.pdf > # do some emacs lisp to add \noprintanswers to the end of org document > header, i.e., removing the line of #+LATEX_HEADER: \printanswers and adding > a line of #+LATEX_HEADER: \noprintanswers > (org-latex-export-to-pdf) > # remove the line of #+LATEX_HEADER: \noprintanswers > ) > > I don't know enough emacs lisp to fill in the details here for now. > However, I think this would be a way to do it within emacs. So each time I > call org-latex-export-to-pdf-exam, it would export two PDF files, one with > solutions and one without. > > What do you think? > > Yours sincerely, > Xianwen >