{ lib, flake-parts-lib, ... }: let inherit (lib) mkIf mkOption mkPackageOption mkEnableOption types ; inherit (flake-parts-lib) mkPerSystemOption; in { options.perSystem = mkPerSystemOption ( { config, pkgs, ... }: { options = { texShell = { scheme = mkPackageOption pkgs "texliveSmall" { }; extraPackages = mkOption { type = types.functionTo (types.listOf types.package); description = "Extra packages to add to the texlive scheme"; default = _: [ ]; }; latexmk = { enable = mkEnableOption "latexmk"; rc = mkOption { type = types.lines; description = "contents of the .latexmkrc file"; }; rcFile = mkOption { type = types.path; default = pkgs.writeText "latexmkrc" config.texShell.latexmk.rc; description = "the .latexmkrc file"; }; _wrapper = mkOption { type = types.functionTo types.package; readOnly = true; internal = true; default = tex: pkgs.symlinkJoin { inherit (tex) name; nativeBuildInputs = [ pkgs.makeWrapper ]; paths = [ tex ]; postBuild = '' wrapProgram $out/bin/latexmk --add-flags "-r" --add-flags "${config.texShell.latexmk.rcFile}" ''; }; }; }; build = { package = mkOption { type = types.package; readOnly = true; default = let wrapper = if config.texShell.latexmk.enable then config.texShell.latexmk._wrapper else x: x; in wrapper (config.texShell.scheme.withPackages config.texShell.extraPackages); }; devShell = mkOption { type = types.package; readOnly = true; default = pkgs.mkShellNoCC { buildInputs = [ config.texShell.build.package ]; }; }; }; }; }; config = { texShell.extraPackages = mkIf config.texShell.latexmk.enable (ps: [ ps.latexmk ]); }; } ); }