From 2cb43216d3c2cbc6f40e0d6646abb9f31a1c40f7 Mon Sep 17 00:00:00 2001 From: "quentin@aristote.fr" Date: Sat, 26 Aug 2023 23:28:27 +0200 Subject: devenv: add more modules --- modules/devenv/languages/default.nix | 2 +- modules/devenv/languages/latex.nix | 127 +++++++++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 modules/devenv/languages/latex.nix (limited to 'modules/devenv/languages') diff --git a/modules/devenv/languages/default.nix b/modules/devenv/languages/default.nix index 2f4fc86..a97402c 100644 --- a/modules/devenv/languages/default.nix +++ b/modules/devenv/languages/default.nix @@ -1,3 +1,3 @@ { - imports = [ ./nix.nix ]; + imports = [./latex.nix ./nix.nix]; } diff --git a/modules/devenv/languages/latex.nix b/modules/devenv/languages/latex.nix new file mode 100644 index 0000000..eece173 --- /dev/null +++ b/modules/devenv/languages/latex.nix @@ -0,0 +1,127 @@ +{ + config, + lib, + pkgs, + devenv, + ... +}: let + cfg = config.languages.texlive; + pdfModes = { + "pdflatex" = "1"; + "ps2pdf" = "2"; + "dvi2pdf" = "3"; + "lulatex" = "4"; + "xelatex" = "5"; + }; + dviModes = { + "latex" = "1"; + "lualatex" = "2"; + }; + latexmkrc = with latexmkrc; let + pdfMode = with output.pdf; + if enable + then pdfModes."${mode}" + else "0"; + dviMode = with output.dvi; + if enable + then dviModes."${mode}" + else "0"; + psMode = + if output.ps.enable + then "1" + else "0"; + in '' + set_tex_cmds('${extraFlags}'); + $pdf_mode=${pdfMode} + $dvi_mode=${dviMode} + $ps_mode=${psMode} + + ${extraConfig} + ''; + packages = cfg.packages cfg.base; + packagesRequireShellEscape = packages ? minted; + texlive = cfg.base.combine packages; +in { + disabledModules = ["${devenv}/src/modules/languages/texlive.nix"]; + + options.languages.texlive = { + enable = lib.mkEnableOption "TeX Live"; + base = lib.mkPackageOption pkgs "TeX Live" { + default = ["texlive"]; + }; + packages = lib.mkOption { + type = with lib.types; + functionTo (attrsOf (submodule { + pkgs = lib.mkOption { + type = listOf package; + }; + })); + default = tl: {inherit (tl) scheme-medium;}; + description = "Packages available to TeX Live."; + }; + + latexmk = { + enable = lib.mkEnableOption "latexmk"; + shellEscape.enable = lib.mkEnableOption "shell escaping"; + extraFlags = lib.mkOption { + type = with lib.types; listOf str; + default = []; + example = ["--interaction=nonstopmode"]; + }; + output = let + mkOutputOptions = formats: + lib.mapAttrs (format: extra: + lib.recursiveUpdate { + enable = lib.mkEnableOption "${format} output"; + } + extra) + formats; + in + mkOutputOptions { + pdf = { + enable.default = true; + mode = lib.mkOption { + type = lib.types.enum (lib.attrNames pdfModes); + default = "lualatex"; + description = "How to generate the pdf file."; + }; + }; + dvi = { + mode = lib.mkOption { + type = lib.types.enum (lib.attrNames dviModes); + default = "latex"; + description = "How to generate the dvi file."; + }; + }; + ps = {}; + }; + extraConfig = lib.mkOption { + type = lib.types.lines; + default = ""; + description = "Extra configuration to put inside the RC file."; + }; + }; + }; + + config = lib.mkMerge [ + { + languages.texlive = { + latexmk = { + shellEscape.enable = lib.mkIf (lib.mkDefault packagesRequireShellEscape true); + extraFlags = lib.optional cfg.latexmkrc.shellEscape.enable "-shell-escape"; + }; + packages = tl: lib.optionalAttrs cfg.latexmk.enable {inherit (tl) latexmk;}; + }; + packages = lib.optional cfg.enable texlive; + } + (lib.mkIf cfg.latexmk.enable { + scripts.latexmk.exec = '' + ${texlive}/bin/latexmk -r ${devenv.root}/.latexmkrc + ''; + dotfiles.".latexmkrc" = { + gitignore = lib.mkDefault false; + text = latexmkrc; + }; + }) + ]; +} -- cgit v1.2.3