{
  description = "LaTeX Documents for Systemsicherheit";
  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixos-24.05";
  };
  outputs = { self, nixpkgs }: let
    assignments = [
      "Assignment 4 - Protokollsicherheit (Praxis)"
    ];

    forAllSystems = function:
      nixpkgs.lib.genAttrs [
        "x86_64-linux"
        "aarch64-linux"
      ] (system: function {
        inherit system;
        pkgs = nixpkgs.legacyPackages.${system};
      });

    forAllAssignments = function:
      nixpkgs.lib.genAttrs assignments (assignment: function assignment);

    texPackages = pkgs: pkgs.texlive.combine {
        inherit (pkgs.texlive) scheme-full latex-bin latexmk;
      };
  in rec {
    packages = forAllSystems({system, pkgs}: forAllAssignments(assignment: let
      tex = texPackages pkgs;
      document = pkgs.stdenvNoCC.mkDerivation rec {
        name = assignment;
        src = self;
        buildInputs = [ pkgs.coreutils tex ];
        phases = [ "unpackPhase" "buildPhase" "installPhase" ];
        buildPhase = ''
          export PATH="${pkgs.lib.makeBinPath buildInputs}";
          mkdir -p .cache/texmf-var
          cd "./${assignment}"
          env TEXMFHOME=.cache TEXMFVAR=.cache/texmf-var \
            latexmk -interaction=nonstopmode -pdf -lualatex \
            "./abgabe.tex"
        '';
        installPhase = ''
          mkdir -p $out
          cp *.pdf $out/
        '';
      };
    in document) // {
      default = packages.${system}.${pkgs.lib.last assignments};
    });

    devShells = forAllSystems({pkgs, ...}: let
      tex = texPackages pkgs;
    in {
      default = pkgs.mkShell {
        packages = [ pkgs.coreutils tex ];
      };
    });

    hydraJobs = packages;
  };
}

