From e6be1123a2b26ceb77b87f011089f2fda9568f59 Mon Sep 17 00:00:00 2001 From: Gerard Vermeulen Date: Sun, 26 Dec 2021 11:53:40 +0100 Subject: [PATCH] Handle the latex preamble * Add a fake language mode called latex-preamble. --- README.org | 293 ++++++++++++++++++++++-------------------- org-babel-tangle-file | 7 +- 2 files changed, 157 insertions(+), 143 deletions(-) diff --git a/README.org b/README.org index d99703c..9983597 100644 --- a/README.org +++ b/README.org @@ -2,61 +2,102 @@ #+title: Emacs setup for use with LaTeX, Org, and Python #+author: Gerard Vermeulen #+babel: :cache no + #+property: header-args :tangle init.el :comments link #+property: header-args:emacs-lisp :exports code :results silent +#+property: header-args:latex-preamble :tangle no # #+latex_class: article -#+latex_class_options: [11pt,a4paper,svgnames] -#+latex_header: \usepackage[AUTO]{babel} -#+latex_header: \usepackage{fvextra} -#+latex_header: \usepackage{csquotes} -# -#+latex_header: \usepackage{caption} -#+latex_header: \usepackage[newfloat]{minted} -#+latex_header: \captionsetup[listing]{position=below,skip=0em} -#+latex_header: \usemintedstyle{xcode} -# -#+latex_header: \hypersetup{ -#+latex_header: citecolor=blue, -#+latex_header: colorlinks=true, -#+latex_header: filecolor=blue, -#+latex_header: hyperfootnotes=false, -#+latex_header: linkcolor=blue, -#+latex_header: unicode=true, -#+latex_header: urlcolor=blue -#+latex_header: } -# -#+latex_header: \usepackage{fancyhdr} -#+latex_header: \usepackage{lastpage} -# -#+latex_header: \usepackage[ -#+latex_header: headheight=20mm, -#+latex_header: top=40mm, -#+latex_header: bottom=20mm, -#+latex_header: left=60pt, -#+latex_header: right=60pt, -#+latex_header: heightrounded, -#+latex_header: verbose, -#+latex_header: ]{geometry} -# -#+latex_header: % Make section an implicit float barrier: -#+latex_header: \usepackage[section]{placeins} -#+latex_header: % Make subsection an implicit float barrier: -#+latex_header: \makeatletter -#+latex_header: \AtBeginDocument{% -#+latex_header: \expandafter\renewcommand\expandafter\subsection\expandafter{% -#+latex_header: \expandafter\@fb@secFB\subsection -#+latex_header: }% -#+latex_header: } -#+latex_header: \makeatother -#+latex_header: % Make subsubsection an implicit float barrier: -#+latex_header: \makeatletter -#+latex_header: \AtBeginDocument{% -#+latex_header: \expandafter\renewcommand\expandafter\subsubsection\expandafter{% -#+latex_header: \expandafter\@fb@secFB\subsubsection -#+latex_header: }% -#+latex_header: } -#+latex_header: \makeatother +#+latex_class_options: [11pt,a4paper,english,svgnames] + +* LaTeX preamble :noexport: + +#+begin_src latex-preamble + % Use babel for biblatex. + \usepackage{babel} + \usepackage{fvextra} + \usepackage{csquotes} + % Section 2.6 of caption-eng.pdf (texdoc caption) explains that the sign + % of "skip" depends on the assumption "position=above" or "position=below". + % The assumption should match the real caption position in the LaTeX code. + \usepackage{caption} + \usepackage[newfloat]{minted} + \captionsetup[listing]{position=below,skip=0em} + \usemintedstyle{xcode} + % Use lastpage in fancy header. + \usepackage{fancyhdr} + \usepackage{lastpage} + % Use geometry without warnings. + \usepackage[ + headheight=20mm, + top=40mm, + bottom=20mm, + left=60pt, + right=60pt, + heightrounded, + verbose, + ]{geometry} +#+end_src + +#+begin_src latex-preamble + % Make section, subsection and subsubsection implicit float barriers. + % https://tex.stackexchange.com/questions/118662/use-placeins-for-subsections + % Make section an implicit float barrier: + \usepackage[section]{placeins} + % Make subsection an implicit float barrier: + \makeatletter + \AtBeginDocument{% + \expandafter\renewcommand\expandafter\subsection\expandafter{% + \expandafter\@fb@secFB\subsection + }% + } + \makeatother + % Make subsubsection an implicit float barrier: + \makeatletter + \AtBeginDocument{% + \expandafter\renewcommand\expandafter\subsubsection\expandafter{% + \expandafter\@fb@secFB\subsubsection + }% + } + \makeatother +#+end_src + +#+begin_src latex-preamble + % Add fancy headers and footers to normal pages. + \pagestyle{fancy} + \fancyhf{} + \renewcommand{\footrulewidth}{0.4pt} + \fancyfoot[C]{\emph{ + Emacs setup for use with \LaTeX{}, Org, and Python -- Gerard Vermeulen}} + \renewcommand{\headrulewidth}{0.4pt} + \fancyhead[L]{\includegraphics[height=1.8cm]{Org-mode-unicorn.png}} + \fancyhead[C]{ + Page: \thepage/\pageref{LastPage} \\ + \text{ } \\ + \text{ } \\ + DRAFT + } + \fancyhead[R]{\includegraphics[height=1.8cm]{Emacs-logo.png}} + + % Add fancy header and footer to custom titlepage. + % https://tex.stackexchange.com/questions/506102/ + % adding-header-and-footer-to-custom-titlepage + \fancypagestyle{titlepage}{% + \fancyhf{} + \renewcommand{\footrulewidth}{0.4pt} + \fancyfoot[C]{\emph{ + Emacs setup for use with \LaTeX{}, Org, and Python -- Gerard Vermeulen}} + \renewcommand{\headrulewidth}{0.4pt} + \fancyhead[L]{\includegraphics[height=1.8cm]{Org-mode-unicorn.png}} + \fancyhead[C]{ + \pageref{LastPage} pages \\ + \text{ } \\ + \text{ } \\ + DRAFT + } + \fancyhead[R]{\includegraphics[height=1.8cm]{Emacs-logo.png}} + } +#+end_src * Quick start :PROPERTIES: @@ -738,31 +779,38 @@ rebuild the =epdfinfo= executable that serves the [[https://en.wikipedia.org/wik :END: Loading =tex.el= immediately instead of lazily ensures proper initialization of -the [[https://en.wikipedia.org/wiki/AUCTeX][AUCTeX]]. For instance, the ~TeX-master~ safe local variable in the =tex.el= +[[https://en.wikipedia.org/wiki/AUCTeX][AUCTeX]]. For instance, the ~TeX-master~ safe local variable in the =tex.el= elisp library file has no autoload cookie. Without prior loading of =tex.el=, -Emacs will complain that ~TeX-master~ is no safe local variable in case it -reads a LaTeX file that sets ~TeX-master~. +Emacs will complain that ~TeX-master~ is no safe local variable in case it reads +a LaTeX file that sets ~TeX-master~. Listing [[lst:require-auctex]] initializes +[[https://en.wikipedia.org/wiki/AUCTeX][AUCTeX]] properly. #+caption[Require =AUCTeX=]: #+caption: Require =AUCTeX=. #+label: lst:require-auctex #+begin_src emacs-lisp - ;; Try to get the `safe-local-variable' predicate for `TeX-master' + ;; Use `require' to make `TeX-master' a safe local variable. (when (require 'tex nil 'noerror) (custom-set-variables '(TeX-auto-save t) + '(TeX-install-font-lock #'font-latex-setup) '(TeX-parse-self t))) #+end_src +Although, the LaTeX =biblatex= is in use, listing [[lst:configure-bibtex]] +configures the Emacs =bibtex= library for the LaTeX =BiBTeX= package to maintain +backwards compatibility. + #+caption[Configure =bibtex=]: #+caption: Configure =bibtex=. #+label: lst:configure-bibtex #+begin_src emacs-lisp (with-eval-after-load 'bibtex - (custom-set-variables - '(bibtex-dialect 'BibTeX))) + (custom-set-variables '(bibtex-dialect 'BibTeX))) #+end_src +Listing [[lst:configure-font-latex]] disables font scaling of section titles. + #+caption[Configure =font-latex=]: #+caption: Configure =font-latex=. #+label: lst:configure-font-latex @@ -772,6 +820,9 @@ reads a LaTeX file that sets ~TeX-master~. '(font-latex-fontify-sectioning 1.0))) #+end_src +Listing [[lst:configure-latex]] configures =latex= for a full featured +=LaTeX-section-command=. + #+caption[Configure =latex=]: #+caption: Configure =latex=. #+label: lst:configure-latex @@ -922,7 +973,21 @@ The code in listing [[lst:customize-org-babel]], [[lst:customize-org]], and (with-eval-after-load 'ox-latex (custom-set-variables '(org-latex-compiler "lualatex") - '(org-latex-hyperref-template nil) + '(org-latex-hyperref-template "\\hypersetup{ + pdfauthor={%a}, + pdftitle={%t}, + pdfkeywords={%k}, + pdfsubject={%d}, + pdfcreator={%c}, + pdflang={%L}, + citecolor=blue, + colorlinks=true, + filecolor=blue, + hyperfootnotes=false, + linkcolor=blue, + unicode=true, + urlcolor=blue, + }\n") '(org-latex-listings 'minted) '(org-latex-minted-options '(("bgcolor" "LightGoldenrodYellow"))) '(org-latex-logfiles-extensions '("blg" "lof" "log" "lot" "out" "toc")) @@ -1053,11 +1118,14 @@ this document to =html= and LaTeX correctly. (format "@ref{%s,%s,,%s,}" node title manual))) (_ nil)))) + (make-variable-buffer-local 'org-info-emacs-documents) + (setq org-info-emacs-documents (delete "org" org-info-emacs-documents)) (make-variable-buffer-local 'org-info-other-documents) (setq org-info-other-documents (cl-union '(("consult" . "https://github.com/minad/consult") ("embark" . "https://github.com/oantolin/embark") ("marginalia" . "https://github.com/minad/marginalia") + ("org" . "https://orgmode.org/org.html") ("orderless" . "https://github.com/oantolin/orderless") ("vertico" . "https://github.com/minad/vertico")) org-info-other-documents @@ -1104,9 +1172,10 @@ this document to =html= and LaTeX correctly. (org-element-map (org-element-parse-buffer 'greater-element nil) 'src-block (lambda (block) - (message "%s" (org-element-property :name block)) - (when (string-match-p infix (org-element-property :name block)) - block))))) + (let ((name (org-element-property :name block))) + (message "%s" name) + (when (and name (string-match-p infix name)) + block)))))) (dolist (block blocks) (goto-char (org-element-property :begin block)) (org-babel-execute-src-block))))) @@ -1125,6 +1194,28 @@ this document to =html= and LaTeX correctly. Stolen from [[https://git.sr.ht/~bzg/org-contrib/tree/master/item/lisp/ox-extra.el][ox-extra.el]] +#+name: lst:emacs-lisp-setup-latex-preamble +#+begin_src emacs-lisp + (with-eval-after-load 'org-src + (add-to-list 'org-src-lang-modes '("latex-preamble" . latex)) + + (defvar org-babel-default-header-args:latex-preamble + '((:results . "raw") + (:exports . "results"))) + + (defun prefix-all-lines (prefix body) + (with-temp-buffer + (insert body) + (string-insert-rectangle (point-min) (point-max) prefix) + (buffer-string))) + + (defun org-babel-execute:latex-preamble (body _params) + (prefix-all-lines "#+latex_header: " body))) +#+end_src +[[https://www.reddit.com/r/orgmode/comments/7u2n0h/tip_for_defining_latex_macros_for_use_in_both/]] + +[[https://www.reddit.com/r/orgmode/comments/5bi6ku/tip_for_exporting_javascript_source_block_to/]] + #+caption[Convert marked LaTeX export blocks to LaTeX header lines]: #+caption: Convert marked LaTeX export blocks to LaTeX header lines. #+label: lst:org-latex-header-blocks-filter @@ -1173,46 +1264,6 @@ Stolen from [[https://git.sr.ht/~bzg/org-contrib/tree/master/item/lisp/ox-extra. [[https://emacs.stackexchange.com/questions/47347/customizing-org-latex-title-command-to-edit-title-page][How to customize =org-latex-title-command= only in this buffer]] -#+caption[Hack LaTeX export buffer local variables]: -#+caption: Hack LaTeX export buffer local variables. -#+header: :var title-page=title-page -#+name: lst:emacs-lisp-setup-hack -#+begin_src emacs-lisp :exports code :results silent :tangle no - (with-eval-after-load 'ox - (make-variable-buffer-local 'org-export-before-parsing-hook) - (cl-pushnew #'org-latex-header-blocks-filter - org-export-before-parsing-hook)) - (when (require 'ox-latex nil 'noerror) - (make-variable-buffer-local 'org-latex-classes) - (cl-pushnew '("article-local" - "\\documentclass[11pt]{article} - [NO-DEFAULT-PACKAGES] - [PACKAGES] - [EXTRA]" - ("\\section{%s}" . "\\section*{%s}") - ("\\subsection{%s}" . "\\subsection*{%s}") - ("\\subsubsection{%s}" . "\\subsubsection*{%s}") - ("\\paragraph{%s}" . "\\paragraph*{%s}") - ("\\subparagraph{%s}" . "\\subparagraph*{%s}")) - org-latex-classes :key #'car :test #'equal) - - (make-variable-buffer-local 'org-latex-title-command) - (setq org-latex-title-command (concat title-page)) - - (make-variable-buffer-local 'org-latex-toc-command) - (setq org-latex-toc-command - (mapconcat 'identity '("" - "\\tableofcontents\\label{toc}" - "\\listoffigures" - "\\listoflistings" - "\\listoftables" - "\\newpage" - "") "\n")) - - (make-variable-buffer-local 'org-latex-subtitle-format) - (setq org-latex-subtitle-format "")) -#+end_src - #+caption[Define =my-ox-latex-export-buffer-local-variables=]: #+caption: Define =my-ox-latex-export-buffer-local-variables=. #+name: lst:emacs-lisp-setup-defun @@ -1250,47 +1301,9 @@ Stolen from [[https://git.sr.ht/~bzg/org-contrib/tree/master/item/lisp/ox-extra. "") "\n")) (make-variable-buffer-local 'org-latex-subtitle-format) - (setq org-latex-subtitle-format "") - org-latex-title-command)) + (setq org-latex-subtitle-format ""))) #+end_src -#+header: :header yes -#+begin_export latex -% Add fancy headers and footers to normal pages -\pagestyle{fancy} -\fancyhf{} -\renewcommand{\footrulewidth}{0.4pt} -\fancyfoot[C]{\emph{ - Emacs setup for use with \LaTeX{}, Org, and Python -- Gerard Vermeulen}} -\renewcommand{\headrulewidth}{0.4pt} -\fancyhead[L]{\includegraphics[height=1.8cm]{Org-mode-unicorn.png}} -\fancyhead[C]{ - Page: \thepage/\pageref{LastPage} \\ - \text{ } \\ - \text{ } \\ - DRAFT -} -\fancyhead[R]{\includegraphics[height=1.8cm]{Emacs-logo.png}} - -% https://tex.stackexchange.com/questions/506102/ -% adding-header-and-footer-to-custom-titlepage -\fancypagestyle{titlepage}{% - \fancyhf{} - \renewcommand{\footrulewidth}{0.4pt} - \fancyfoot[C]{\emph{ - Emacs setup for use with \LaTeX{}, Org, and Python -- Gerard Vermeulen}} - \renewcommand{\headrulewidth}{0.4pt} - \fancyhead[L]{\includegraphics[height=1.8cm]{Org-mode-unicorn.png}} - \fancyhead[C]{ - \pageref{LastPage} pages \\ - \text{ } \\ - \text{ } \\ - DRAFT - } - \fancyhead[R]{\includegraphics[height=1.8cm]{Emacs-logo.png}} -} -#+end_export - [[lst:emacs-lisp-setup-call]] #+caption[Call =my-ox-latex-export-local-variables=]: diff --git a/org-babel-tangle-file b/org-babel-tangle-file index 794177e..acd2b35 100755 --- a/org-babel-tangle-file +++ b/org-babel-tangle-file @@ -4,14 +4,15 @@ emacs -Q --batch --eval " (progn (require 'org) (require 'ob-latex) - (defun my-org-eval-blocks-named (name) + (defun my-org-eval-blocks-named (infix) (when (eq major-mode 'org-mode) (let ((blocks (org-element-map (org-element-parse-buffer 'greater-element nil) 'src-block (lambda (block) - (when (string= name (org-element-property :name block)) - block))))) + (let ((name (org-element-property :name block))) + (when (and name (string-match-p infix name)) + block)))))) (dolist (block blocks) (goto-char (org-element-property :begin block)) (org-babel-execute-src-block)))))