;; -*- lexical-binding: t -*- (require 'org) (require 'subr-x) (require 'cl-lib) ;; General settings (setq doc-view-continuous t) (setq lpr-switches (list "-o sides=two-sided-long-edge" "-o fit-to-page")) (setq export-properties (list :section-numbers nil :with-toc nil)) ;; Printing (defun print-report () (interactive) (shell-command (format "lpr -o sides=two-sided-long-edge -o fit-to-page %s" (buffer-file-name)))) (defalias 'print-buffer 'print-report) ;; Utilities (defun set-values (record values) "Set record RECORD to values in alist VALUES" (seq-do (pcase-lambda (`(,field . ,value)) (aset record field value)) values)) ;; Entry creation functions for form display (defun form-entry (label-field) (pcase label-field (`(,label . ,field) (list (format "%s\n" label) field"\n\n")))) (defun new-record-filter (record) (set-values record default-field-values) record) (setq forms-new-record-filter 'new-record-filter) ;; Entry creation functions for org export (defun ksh-forms-org-entry-function (format-string label-field) (pcase label-field (`(,label . ,field-no) (let ((value (get-field field-no))) (if value (princ (format format-string label (replace-regexp-in-string "\n" "\n\n" value))) (user-error "Field \"%s\" should not be blank" label)))))) (defun get-field (field) "Parse form and return field FIELD from form" (cond ((integerp field) (nth (1- field) (forms--parse-form))) ((stringp field) field))) (defun single-line-org-entry (label-field) (ksh-forms-org-entry-function "*%s:* %s\n\n" label-field)) (defun multi-line-org-entry (label-field) (ksh-forms-org-entry-function "\n* %s\n%s\n\n" label-field)) (defun text-if-non-blank (text) (if (and text (not (string-blank-p text))) (princ (format "%s\n\n" text)))) (defun ksh-forms-org-keyword (keyword-value) (pcase keyword-value (`(,keyword . ,value) (princ (format "#+%s: %s\n" keyword value))))) (defun ksh-forms-org-latex-header (header) (ksh-forms-org-keyword (cons "LATEX_HEADER" header))) (defun forms-print () (interactive) (org-open-file (org-to-pdf (funcall form-to-org)))) (setq org-latex-compiler "xelatex") (defun org-to-pdf (org-source) (let ((tex-file-path (format "%s.tex" (make-temp-file "report")))) (with-temp-buffer (insert org-source) (org-export-to-file 'latex tex-file-path nil nil nil nil export-properties 'org-latex-compile)))) (make-variable-buffer-local 'form-to-org) (provide 'ksh-forms)