From 2631c05256dfb2e5ad3bfb94869f27bc6edb2fa6 Mon Sep 17 00:00:00 2001 From: Daneel Date: Fri, 20 Feb 2026 09:07:22 +0100 Subject: [PATCH] Add document.org template + auto-tabularx Elisp hook --- templates/document-latex-setup.el | 64 +++++++++++++++++++++ templates/document.org | 96 +++++++++++++++++++++++++++++++ 2 files changed, 160 insertions(+) create mode 100644 templates/document-latex-setup.el create mode 100644 templates/document.org diff --git a/templates/document-latex-setup.el b/templates/document-latex-setup.el new file mode 100644 index 0000000..3435c03 --- /dev/null +++ b/templates/document-latex-setup.el @@ -0,0 +1,64 @@ +;; document-latex-setup.el +;; Přidej obsah tohoto souboru do svého ~/.config/doom/config.el +;; +;; Co to dělá: +;; Před každým LaTeX exportem projde buffer, najde Org tabulky +;; které NEMAJÍ #+ATTR_LATEX, spočítá jejich sloupce a vloží: +;; #+ATTR_LATEX: :environment tabularx :width \textwidth :align lXX... +;; (první sloupec levý, zbytek roztažitelný) +;; Pracuje na kopii bufferu — originální soubor se NEMĚNÍ. + +(defun my/org-count-table-columns (line) + "Spočítej počet datových sloupců v Org table LINE." + (length (cl-remove-if + (lambda (s) (string-match-p "^-*$" (string-trim s))) + (cdr (butlast (split-string line "|")))))) + +(defun my/org-table-attr-latex-spec (ncols) + "Vygeneruj column spec pro tabularx: první sloupec l, zbytek Y (centered X)." + (concat "l" (make-string (max 0 (1- ncols)) ?Y))) + +(defun my/org-auto-tabularx (backend) + "Automaticky přidej #+ATTR_LATEX tabularx před každou tabulku při LaTeX exportu." + (when (org-export-derived-backend-p backend 'latex) + (save-excursion + (goto-char (point-min)) + (while (not (eobp)) + (cond + ;; Řádek začíná | — může být začátek tabulky + ((looking-at "^|") + (let ((prev-line (save-excursion + (forward-line -1) + (buffer-substring-no-properties + (line-beginning-position) (line-end-position))))) + ;; Je to PRVNÍ řádek tabulky? (předchozí řádek NEzačíná |) + (when (not (string-match-p "^|" prev-line)) + ;; Chybí #+ATTR_LATEX? + (when (not (string-match-p "^#\\+ATTR_LATEX" prev-line)) + (let* ((table-line (buffer-substring-no-properties + (line-beginning-position) (line-end-position))) + (ncols (my/org-count-table-columns table-line)) + (spec (my/org-table-attr-latex-spec ncols)) + (attr (format "#+ATTR_LATEX: :environment tabularx :width \\textwidth :align %s\n" + spec))) + (when (> ncols 0) + (insert attr)))))) + (forward-line)) + (t + (forward-line))))))) + +;; Zaregistruj hook — spustí se před každým exportem +(add-hook 'org-export-before-processing-hook #'my/org-auto-tabularx) + +;; Volitelně: zapni booktabs styl (horizontal rules v tabulkách) +;; (setq org-latex-tables-booktabs t) + +;; +;; Jak použít: +;; 1. Zkopíruj tento obsah do ~/.config/doom/config.el +;; 2. Spusť: doom sync (nebo M-x doom/reload) +;; 3. Exportuj dokument: SPC m e l p +;; Tabulky se automaticky obalí do tabularx — nic nemusíš přidávat ručně. +;; +;; Chceš jiný výchozí column spec? Uprav my/org-table-attr-latex-spec. +;; Například pro "všechny sloupce rovnoměrně": (make-string ncols ?Y) diff --git a/templates/document.org b/templates/document.org new file mode 100644 index 0000000..82ea9e5 --- /dev/null +++ b/templates/document.org @@ -0,0 +1,96 @@ +#+TITLE: Document Title +#+AUTHOR: Martin Sukany +#+DATE: \today +#+OPTIONS: toc:2 num:t H:4 ^:nil + +# ── LaTeX class ─────────────────────────────────────────────────────────────── +#+LATEX_CLASS: report +#+LATEX_CLASS_OPTIONS: [a4paper,10pt] + +# ── Encoding & fonts ────────────────────────────────────────────────────────── +#+LATEX_HEADER: \usepackage[utf8]{inputenc} +#+LATEX_HEADER: \usepackage[T1]{fontenc} +#+LATEX_HEADER: \usepackage{lmodern} +#+LATEX_HEADER: \usepackage{microtype} +#+LATEX_HEADER: \usepackage{helvet} +#+LATEX_HEADER: \renewcommand{\familydefault}{\sfdefault} + +# ── Page geometry ───────────────────────────────────────────────────────────── +#+LATEX_HEADER: \usepackage[a4paper,margin=1in]{geometry} + +# ── Colors ──────────────────────────────────────────────────────────────────── +#+LATEX_HEADER: \usepackage[table,x11names]{xcolor} +#+LATEX_HEADER: \definecolor{linkcolor}{RGB}{0,0,180} +#+LATEX_HEADER: \definecolor{tableShade}{RGB}{245,245,245} +#+LATEX_HEADER: \definecolor{lightGreen}{RGB}{240,255,240} +#+LATEX_HEADER: \definecolor{mediumGreen}{RGB}{220,255,220} + +# ── Hyperlinks ──────────────────────────────────────────────────────────────── +#+LATEX_HEADER: \usepackage{hyperref} +#+LATEX_HEADER: \hypersetup{colorlinks=true,linkcolor=linkcolor,urlcolor=linkcolor,citecolor=linkcolor} + +# ── Tables ──────────────────────────────────────────────────────────────────── +#+LATEX_HEADER: \usepackage{tabularx} +#+LATEX_HEADER: \usepackage{booktabs} +#+LATEX_HEADER: \usepackage{longtable} +#+LATEX_HEADER: \usepackage{colortbl} +#+LATEX_HEADER: \usepackage{array} +#+LATEX_HEADER: \usepackage{adjustbox} +#+LATEX_HEADER: \usepackage{etoolbox} +#+LATEX_HEADER: \newcolumntype{Y}{>{\centering\arraybackslash}X} +#+LATEX_HEADER: \newcolumntype{L}{>{\raggedright\arraybackslash}X} +#+LATEX_HEADER: \newcolumntype{R}{>{\raggedleft\arraybackslash}X} +#+LATEX_HEADER: \AtBeginEnvironment{longtable}{\rowcolors{1}{mediumGreen}{lightGreen}} + +# ── Header & footer ─────────────────────────────────────────────────────────── +#+LATEX_HEADER: \usepackage{fancyhdr} +#+LATEX_HEADER: \usepackage{titleps} +#+LATEX_HEADER: \pagestyle{fancy} +#+LATEX_HEADER: \fancyhf{} +#+LATEX_HEADER: \lhead{\small\nouppercase{\leftmark}} +#+LATEX_HEADER: \rhead{\small\thepage} +#+LATEX_HEADER: \renewcommand{\headrulewidth}{0.4pt} + +# ── Graphics ───────────────────────────────────────────────────────────────── +#+LATEX_HEADER: \usepackage{graphicx} + +# ── Code blocks ────────────────────────────────────────────────────────────── +#+LATEX_HEADER: \usepackage{listings} +#+LATEX_HEADER: \lstset{backgroundcolor=\color{yellow!20},basicstyle=\ttfamily\small,breaklines=true,frame=single} + +# ── Title page (matching mdbook template style) ─────────────────────────────── +#+LATEX_HEADER: \usepackage{titling} +#+LATEX_HEADER: \renewcommand{\maketitle}{% +#+LATEX_HEADER: \begin{titlepage}\centering\vspace*{\fill}% +#+LATEX_HEADER: {\LARGE\bfseries\thetitle\par}\vspace{1em}% +#+LATEX_HEADER: {\large\theauthor\par}\vspace{2em}% +#+LATEX_HEADER: {\normalsize\itshape\thedate\par}\vspace{2em}% +#+LATEX_HEADER: % Logo (odkomentuj a uprav cestu pokud ho chceš): +#+LATEX_HEADER: % \includegraphics[width=0.35\textwidth]{/abs/path/to/logo.png}\par +#+LATEX_HEADER: \vspace*{\fill}\end{titlepage}} + +# ───────────────────────────────────────────────────────────────────────────── +# Sem piš obsah dokumentu +# ───────────────────────────────────────────────────────────────────────────── + +* Introduction + +Toto je šablona. Exportuj do PDF přes =SPC m e l p= (Doom) nebo =C-c C-e l p=. + +Tabulky fungují automaticky — nepotřebuješ přidávat =#+ATTR_LATEX= ručně, +pokud máš v =config.el= Elisp hook (viz níže). + +* Example table + +| Název | Popis | Stav | +|--------------+--------------------------+-----------| +| Položka A | Krátký popis | Hotovo | +| Položka B | Delší popis věci | Probíhá | +| Položka C | Další položka v tabulce | Čeká | + +* Example code block + +#+BEGIN_SRC python +def hello(): + return "Hello, World!" +#+END_SRC