From f411cf6dea8d04e09c4148d21ba6176652875852 Mon Sep 17 00:00:00 2001 From: Valentin Brandl Date: Wed, 3 Feb 2021 10:44:28 +0100 Subject: [PATCH] Initial commit --- .drone.yml | 15 +++++ .envrc | 1 + .gitignore | 15 +++++ Makefile | 32 ++++++++++ acronyms.tex | 4 ++ default.nix | 51 +++++++++++++++ diazessay.cls | 114 ++++++++++++++++++++++++++++++++++ latexmkrc | 15 +++++ main.tex | 58 +++++++++++++++++ nix/fetch-nixpkgs.nix | 6 ++ nix/nixpkgs-src.json | 9 +++ scripts/detex-languagetool.py | 12 ++++ scripts/detex.py | 81 ++++++++++++++++++++++++ shell.nix | 39 ++++++++++++ 14 files changed, 452 insertions(+) create mode 100644 .drone.yml create mode 100644 .envrc create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 acronyms.tex create mode 100644 default.nix create mode 100644 diazessay.cls create mode 100644 latexmkrc create mode 100644 main.tex create mode 100644 nix/fetch-nixpkgs.nix create mode 100644 nix/nixpkgs-src.json create mode 100755 scripts/detex-languagetool.py create mode 100755 scripts/detex.py create mode 100644 shell.nix diff --git a/.drone.yml b/.drone.yml new file mode 100644 index 00000000..571cced2 --- /dev/null +++ b/.drone.yml @@ -0,0 +1,15 @@ +--- +kind: pipeline +type: docker +name: default + +steps: + - name: build + image: nixos/nix + commands: + - nix-build +--- +kind: signature +hmac: 830da6e38a18c0405b56b500d229248e30cbaac49df92116a077564489ecbfab + +... diff --git a/.envrc b/.envrc new file mode 100644 index 00000000..051d09d2 --- /dev/null +++ b/.envrc @@ -0,0 +1 @@ +eval "$(lorri direnv)" diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..1b1af78c --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +_minted-paper/ +*.aux +*.bbl +*.bcf +*.blg +*.fdb_latexmk +*.fls +*.log +*.out +*.pdf +*.run.xml + +result + +#!cv.pdf diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..31b1b5db --- /dev/null +++ b/Makefile @@ -0,0 +1,32 @@ +# use bash so process substutution is available +SHELL = bash +SRC = main.tex +TARGET = $(SRC:%.tex=%.pdf) + +.PHONY: build +build: $(TARGET) + +# used for `nix-build` +.PHONY: install +install: build + mkdir -pv ${out}/ + cp $(TARGET) ${out}/ + +%.pdf: %.tex + latexmk $< + +.PHONY: watch +watch: + latexmk -pvc $(SRC) + +.PHONY: lint +lint: + chktex $(SRC) + +.PHONY: languagetool +languagetool: + languagetool <(cat $(SRC) | ./scripts/detex.py) + +.PHONY: clean +clean: + latexmk -C diff --git a/acronyms.tex b/acronyms.tex new file mode 100644 index 00000000..18a3370e --- /dev/null +++ b/acronyms.tex @@ -0,0 +1,4 @@ +\DeclareAcronym{html}{ + short = HTML, + long = hyper text markup language +} diff --git a/default.nix b/default.nix new file mode 100644 index 00000000..cdb6c511 --- /dev/null +++ b/default.nix @@ -0,0 +1,51 @@ +# { pkgs ? import (import nix/fetch-nixpkgs.nix) {} +# }: +{ pkgs ? import {} }: + +with pkgs; + +let + latexPackage = pkgs.texlive.combine { + inherit (texlive) + + # base packages + scheme-small + + csquotes + latexmk + moderncv + needspace + fontawesome + silence + wrapfig + enumitem + mathpazo + ; + }; + +in + +stdenv.mkDerivation { + name = "story"; + buildInputs = [ + latexPackage + + # language correction + pkgs.languagetool + # detex script + pkgs.python + # make + pkgs.gnumake + # PDF viewer + pkgs.zathura + ]; + + src = ./.; + buildPhase = "make"; + + meta = with lib; { + description = "Deterministic LaTeX template using Nix"; + license = licenses.bsd3; + platforms = platforms.linux; + }; +} diff --git a/diazessay.cls b/diazessay.cls new file mode 100644 index 00000000..0f212101 --- /dev/null +++ b/diazessay.cls @@ -0,0 +1,114 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Diaz Essay +% LaTeX Class +% Version 1.0 (13/1/19) +% +% This class originates from: +% http://www.LaTeXTemplates.com +% +% Authors: +% Vel (vel@LaTeXTemplates.com) +% Nicolas Diaz (nsdiaz@uc.cl) +% +% License: +% CC BY-NC-SA 3.0 (http://creativecommons.org/licenses/by-nc-sa/3.0/) +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +%---------------------------------------------------------------------------------------- +% CLASS CONFIGURATION +%---------------------------------------------------------------------------------------- + +\NeedsTeXFormat{LaTeX2e} +\ProvidesClass{diazessay}[2019/01/13 Diaz Essay class v1.0] + +\DeclareOption*{\PassOptionsToClass{\CurrentOption}{article}} % Pass through any options to the base class +\ProcessOptions\relax % Process given options + +\LoadClass{article} % Load the base class + +%---------------------------------------------------------------------------------------- +% PACKAGES AND OTHER DOCUMENT CONFIGURATIONS +%---------------------------------------------------------------------------------------- + +\usepackage[english]{babel} % English language hyphenation + +\usepackage{graphicx} % Required for including images +\graphicspath{{Figures/}{./}} % Specifies where to look for included images (trailing slash required) + +\usepackage{wrapfig} % Allows in-line images + +\usepackage{booktabs} % Required for better horizontal rules in tables + +\usepackage{enumitem} % Required for list customisation +\setlist{noitemsep} % No spacing between list items + +\makeatletter +\renewcommand\@biblabel[1]{\textbf{#1.}} % Remove the square brackets from each bibliography item ('[1]' to '1.') +\makeatother + +%---------------------------------------------------------------------------------------- +% DOCUMENT MARGINS +%---------------------------------------------------------------------------------------- + +\usepackage{geometry} % Required for adjusting page dimensions and margins + +\geometry{ + paper=a4paper, % Paper size, change to letterpaper for US letter size + top=2.5cm, % Top margin + bottom=3cm, % Bottom margin + left=4cm, % Left margin + right=4cm, % Right margin + headheight=0.75cm, % Header height + footskip=1.5cm, % Space from the bottom margin to the baseline of the footer + headsep=0.75cm, % Space from the top margin to the baseline of the header + %showframe, % Uncomment to show how the type block is set on the page +} + +%---------------------------------------------------------------------------------------- +% FONTS +%---------------------------------------------------------------------------------------- + +\usepackage[utf8]{inputenc} % Required for inputting international characters +\usepackage[T1]{fontenc} % Use 8-bit encoding + +\usepackage{mathpazo} % Use the Palatino font + +\usepackage[protrusion=true, expansion=true]{microtype} % Better typography + +\linespread{1.05} % Increase line spacing slightly; Palatino benefits from a slight increase by default + +%---------------------------------------------------------------------------------------- +% TITLE +%---------------------------------------------------------------------------------------- + +\makeatletter +\renewcommand{\maketitle}{ % Customise the title (do not edit title and author name here) + \vspace*{30pt} % Vertical whitespace before the title + \begin{flushright} % Right align + {\LARGE\@title} % Increase the font size of the title + + \vspace{50pt} % Vertical whitespace between the title and author name + + {\large\@author}\\ % Author name + \@date % Date + + \vspace{40pt} % Vertical whitespace between the author block and abstract + \end{flushright} +} +\makeatother + +%---------------------------------------------------------------------------------------- +% HEADERS AND FOOTERS +%---------------------------------------------------------------------------------------- + +\usepackage{fancyhdr} % Required for customising headers and footers +\pagestyle{fancy} % Enable custom headers and footers + +\renewcommand{\headrulewidth}{0pt} % Remove default top horizontal rule +\lhead{} % Left header +\chead{} % Centre header +\rhead{} % Right header +\lfoot{} % Left footer +\cfoot{\thepage} % Centre footer +\rfoot{} % Right footer diff --git a/latexmkrc b/latexmkrc new file mode 100644 index 00000000..e5526177 --- /dev/null +++ b/latexmkrc @@ -0,0 +1,15 @@ +# create PDF +$pdf_mode = 1; + +# clean transitive assets +$cleanup_includes_cusdep_generated = 1; +# clean files generated by LaTeX +$cleanup_includes_generated = 1; + +$biber = 'biber --validate-datamodel %O %S'; + +# use zathura as viewer +$pdf_previewer = 'zathura'; + +$pdflatex = 'pdflatex --shell-escape -interaction=nonstopmode'; +$latex = 'latex --shell-escape -interaction=nonstopmode'; diff --git a/main.tex b/main.tex new file mode 100644 index 00000000..321eff04 --- /dev/null +++ b/main.tex @@ -0,0 +1,58 @@ +% silence external warnings +\RequirePackage{silence} +\WarningFilter{scrreprt}{Usage of package `titlesec'} +\WarningFilter{scrreprt}{Activating an ugly workaround} +\WarningFilter{titlesec}{Non standard sectioning command detected} +\WarningFilter{microtype}{protrusion codes list} +\WarningFilter{latexfont}{Font} +\WarningFilter{latexfont}{Some font shapes} + +\documentclass[11pt]{diazessay} + +% document language +% \usepackage[ngerman]{babel} + +% UTF-8 encoding +\usepackage[utf8]{inputenc} +\usepackage[T1]{fontenc} +\usepackage{lmodern} + +% language specific quotes +\usepackage{csquotes} + +\usepackage{needspace} + +% make overfull hbox warnings prominently visible in document +\overfullrule=2cm + +% \usepackage[scale=0.75]{geometry} + + +\title{\textbf{Main Title} \\ {\Large\itshape Subtitle}} + +\author{Valentin Brandl} + +% \date{\today} +\date{} + +\begin{document} + +\maketitle + +\begin{abstract} +Foo Bar baz lel +\end{abstract} + +\hspace*{3.6mm}\textit{Keywords:} foo, bar, baz, trololol + +\vspace{30pt} + +\section*{Once upon a time} + + + +\section*{Once upon a time} + + +\end{document} +% vim: set filetype=tex ts=2 sw=2 tw=0 et : diff --git a/nix/fetch-nixpkgs.nix b/nix/fetch-nixpkgs.nix new file mode 100644 index 00000000..5d4f933a --- /dev/null +++ b/nix/fetch-nixpkgs.nix @@ -0,0 +1,6 @@ +let + spec = builtins.fromJSON (builtins.readFile ./nixpkgs-src.json); +in builtins.fetchTarball { + url = "https://github.com/${spec.owner}/${spec.repo}/archive/${spec.rev}.tar.gz"; + inherit (spec) sha256; +} diff --git a/nix/nixpkgs-src.json b/nix/nixpkgs-src.json new file mode 100644 index 00000000..834fde01 --- /dev/null +++ b/nix/nixpkgs-src.json @@ -0,0 +1,9 @@ +{ + "owner": "NixOS", + "repo": "nixpkgs", + "url": "https://github.com/nixos/nixpkgs", + "rev": "6a3f5bcb061e1822f50e299f5616a0731636e4e7", + "date": "2018-10-05T18:33:19-04:00", + "sha256": "1ib96has10v5nr6bzf7v8kw7yzww8zanxgw2qi1ll1sbv6kj6zpd", + "fetchSubmodules": false +} diff --git a/scripts/detex-languagetool.py b/scripts/detex-languagetool.py new file mode 100755 index 00000000..b9f42796 --- /dev/null +++ b/scripts/detex-languagetool.py @@ -0,0 +1,12 @@ +#!/usr/bin/env python3 + +import os +import subprocess +import sys + +dir_path = os.path.dirname(os.path.realpath(__file__)) + +subprocess.call('cat ' + sys.argv[-1] + ' | ' + + os.path.join(dir_path, 'detex.py') + ' | ' + + 'languagetool ' + ' '.join(sys.argv[1:-1]), + shell=True) \ No newline at end of file diff --git a/scripts/detex.py b/scripts/detex.py new file mode 100755 index 00000000..85f66297 --- /dev/null +++ b/scripts/detex.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 + +import re +import sys + + +def swallow(match): + return ' ' * len(match.group(0)) + + +def swallow_command(match): + return ' ' * (len(match.group(1)) + 1) + ' ' + match.group(2) + ' ' + + +def main(): + + text = sys.stdin.read() + text_len = len(text) + + # \hyp + text = re.subn(r'(\w+)\\hyp\{\}(\w+)', r' \1-\2 ', text)[0] + text = re.subn(r'(\w+)\\fshyp\{\}(\w+)', r' \1-\2 ', text)[0] + + # glossary entries + def replace_glossary(match): + text = match.group(2).replace('-', ' ') + if match.group(1).endswith('pl'): + text += 's' + if match.group(1)[0].isupper(): + text = text[0].upper() + text[1:] + text = ' ' * len(match.group(1)) + ' ' + text + ' ' + if match.group(1).endswith('pl'): + text = text[1:] + return text + text = re.subn(r'\\((?:newdef)?[gG]ls(?:pl)?){((?:\w+-?)+?)}', + replace_glossary, text)[0] + + # acronyms + def replace_acronym(match): + return ' ' * len(match.group(1)) + ' ' + match.group(2) + ' ' + text = re.subn(r'\\([aA]cr.*?){(.+?)}', + replace_acronym, text)[0] + + # remove keypoints + text = re.subn(r'\\keypoint\{.*?\}', swallow, text)[0] + + # remove autocites + text = re.subn(r'~?\\[aA]utocite(?:\[.+?\])?\{.*?\}', swallow, text)[0] + + # Remove textcites + def replace_textcite(match): + template = 'Foo and Bar' + return template + ' ' * (len(match.group(0)) - len(template)) + text = re.subn(r'\\[tT]extcite\{(.*?)\}', replace_textcite, text)[0] + + # citesoftware + text = re.subn(r'\\(citesoftware)\{(.*?)\}', swallow_command, text)[0] + + # Remove common surrounding markup + text = re.subn(r'\\(emph|texttt|textit|texttt|texthtt)\{(.*?)\}', + swallow_command, text)[0] + + # Remove abbreviations + text = re.subn(r'\\eg\b', 'eg.', text)[0] + text = re.subn(r'\\cf\b', 'cf.', text)[0] + text = re.subn(r'\\ie\b', 'ie.', text)[0] + + # references + text = re.subn(r'\\([vV]?ref)\{(.*?)\}', swallow_command, text)[0] + + # remove comments at line end + text = re.subn(r'([^\\])%.*', '\\1', text)[0] + + # do not move things around too much + print(text) + + assert len(text) == text_len + + +if __name__ == '__main__': + main() diff --git a/shell.nix b/shell.nix new file mode 100644 index 00000000..5cb96be8 --- /dev/null +++ b/shell.nix @@ -0,0 +1,39 @@ +{ pkgs ? import {} }: + +with pkgs; + +let + latexPackage = pkgs.texlive.combine { + inherit (texlive) + + # base packages + scheme-small + + csquotes + latexmk + moderncv + needspace + fontawesome + silence + wrapfig + enumitem + mathpazo + ; + }; + +in + +pkgs.mkShell { + buildInputs = [ + latexPackage + + # language correction + pkgs.languagetool + # detex script + pkgs.python + # make + pkgs.gnumake + # PDF viewer + pkgs.zathura + ]; +}