;; Load org and Babel tangle explicitly (require 'ob-tangle) (require 'ob-org) (org-babel-do-load-languages 'org-babel-load-languages '((org . t))) ;; <-- enable tangling of #+BEGIN_SRC org blocks ;; Batch export & site publish (setq org-confirm-babel-evaluate nil) (setq org-latex-pdf-process '("latexmk -pdf -interaction=nonstopmode -shell-escape %f")) ;; --- Babel / Python setup for batch exports --- (setq org-confirm-babel-evaluate nil) (setq org-babel-python-command "python3") (setenv "MPLBACKEND" "Agg") ;; headless matplotlib ;; Load languages you use in code blocks (org-babel-do-load-languages 'org-babel-load-languages '((python . t))) (defun wes--inject-setupfile (venue) "Insert a per-venue #+SETUPFILE line at the top of the current buffer." (save-excursion (goto-char (point-min)) ;; remove any previously injected line from a prior run (when (looking-at "^#\\+SETUPFILE: setup/venue-.*\\.org") (delete-region (line-beginning-position) (1+ (line-end-position)))) (insert (format "#+SETUPFILE: setup/venue-%s.org\n" venue)))) (defun wes/export-pdf (&optional venue) (let* ((v (or venue (or (getenv "VENUE") "arxiv"))) (outfile (format "paper-%s.pdf" v))) (with-current-buffer (find-file-noselect "paper.org") (setenv "VENUE" v) (wes--inject-setupfile v) (org-latex-export-to-pdf nil nil nil t) (when (file-exists-p "paper.pdf") (rename-file "paper.pdf" outfile t)) (message "Wrote %s" outfile)))) (defun wes/export-pdf-cli () (wes/export-pdf)) (require 'ox) (require 'ox-publish) (defun wes/publish-site (&optional venue) (let* ((v (or venue (or (getenv "VENUE") "arxiv")))) (setenv "VENUE" v) (wes--inject-setupfile v) (setq org-publish-project-alist `(("site-html" :base-directory "." :publishing-directory "public" :publishing-function org-html-publish-to-html :with-author t :with-toc t :section-numbers t :html-head "" :recursive nil :exclude "setup/\\|code/\\|figs/\\|public/\\|data/" :include ("paper.org") :select-tags ("export") :exclude-tags ,(if (member v '("ieee" "acm")) '("noexport" "appendix" "notes") '("noexport"))))) (org-publish "site-html" t) (message "Published HTML site for %s" v))) (defun wes/publish-site-cli () (wes/publish-site)) (defun wes--cam-tight-latex () (mapconcat #'identity '("\\usepackage{microtype}" "\\flushbottom" "\\setlength{\\textfloatsep}{10pt}" "\\setlength{\\floatsep}{8pt}" "\\setlength{\\intextsep}{8pt}" "\\usepackage{enumitem}" "\\setlist{nosep}" "\\usepackage{balance}") "\n")) (defun wes/export-camera-ready-pdf (&optional venue) (let* ((v (or venue (or (getenv "VENUE") "arxiv"))) (base-setup (expand-file-name (format "setup/venue-%s.org" v))) (tmp-name (format ".tmp-venue-%s-camera" v)) (tmp-setup (expand-file-name (format "setup/%s.org" tmp-name))) (outfile (format "paper-camera-ready-%s.pdf" v))) (unless (file-exists-p base-setup) (error "Base setup file not found for venue %s" v)) (with-temp-buffer (insert-file-contents base-setup) (goto-char (point-max)) (insert "\n# Camera-ready overrides\n#+BIND: paper-anon nil\n") (insert (format "#+latex_header: %s\n" (wes--cam-tight-latex))) (write-region (point-min) (point-max) tmp-setup)) (unwind-protect (progn (with-current-buffer (find-file-noselect "paper.org") (setenv "VENUE" tmp-name) (wes--inject-setupfile v) (org-latex-export-to-pdf nil nil nil t) (when (file-exists-p "paper.pdf") (rename-file "paper.pdf" outfile t)) (message "Wrote %s" outfile))) (ignore-errors (delete-file tmp-setup))))) (defun wes/export-camera-ready-pdf-cli () (wes/export-camera-ready-pdf)) (defun wes/export-supplement-pdf (&optional venue) (let* ((v (or venue (or (getenv "VENUE") "arxiv"))) (outfile (format "paper-supplement-%s.pdf" v)) (paper-short nil) (paper-anon nil) (paper-limit-figs nil) (org-export-select-tags '("export")) (org-export-exclude-tags '("noexport"))) (with-current-buffer (find-file-noselect "paper.org") (setenv "VENUE" v) (wes--inject-setupfile v) (org-latex-export-to-pdf nil nil nil t) (when (file-exists-p "paper.pdf") (rename-file "paper.pdf" outfile t)) (message "Wrote %s" outfile)))) (defun wes/export-supplement-pdf-cli () (wes/export-supplement-pdf))