{ core, physical, ... } @ libs:
let
  inherit(core)     debug list set string type;
  inherit(physical) formatValueInMath;

  formatUnitDescription
  =   unit:
      {
        about         ? null,
        alternatives  ? [],
        archaic       ? false,
        description   ? null,
        foreign       ? null,
        person        ? null,
        pseudoUnit    ? false,
        siBasic       ? false,
        siDerived     ? false,
        value         ? null,
      }:
      let
        optional
        =   condition:
            text:
              if condition
              then
                [ text ]
              else
                [ ];
        origin
        =   if foreign != null
            then
              let
                text                    =   if foreign.text    or null != null  then " \\Q{${foreign.text}}"          else "";
                latin                   =   if foreign.latin   or null != null  then " (${foreign.latin})"            else "";
                meaning                 =   if foreign.meaning or null != null  then ": \\textit{${foreign.meaning}}" else "";
              in
                [ "von \\acrshort{${foreign.language}}${text}${latin}${meaning}" ]
            else if person != null
            then
              [ "benannt nach ${person.about} \\person{${person.name}}" ]
            else
              [];
        alternatives'
        =   let
              last                      =   list.foot alternatives;
              first                     =   list.body alternatives;
              first'                    =   list.map (item: "\\textit{${item}}") first;
            in
              if first != []
              then
                "auch ${string.concatWith ", " first'} oder \\textit{${last}}"
              else
                "auch \\textit{${last}}";
        value'
        =   let
              unit'                     =   { value = 1; inherit unit; };
              mapValues
              =   ValueList:
                    "\\mbox{\\ensuremath{${string.concatMappedWith ({ value, unit }: formatValueInMath value unit) " = " ValueList}}}";
            in
              type.matchPrimitiveOrPanic value
              {
                list                    =   mapValues ( [ unit' ] ++ value );
                set                     =   mapValues [ unit' value ];
              };
        parts
        =   (
              if siBasic
              then
                [ "\\acrshort{siStandard}-Basis\\-einheit ${about}" ]
              else if siDerived
              then
                [ "\\acrshort{siStandard}-Einheit ${about}" ]
              else if pseudoUnit
              then
                [ "Pseudo\\-einheit" ]
              else if archaic
              then
                [ "Veraltete Einheit ${about}" ]
              else
                [ "Einheit ${about}" ]
            )
        ++  (optional (alternatives != []) alternatives')
        ++  origin
        ++  (optional (value != null) value')
        ++  (optional (description != null) description);
      in
        string.concatWith ", " parts;

  Miscellaneous
  =   { description, long, short, sortedBy ? "" }:
      {
        __type__                        =   "Acronym";
        __variant__                     =   "Miscellaneous";
        section                         =   "Miscellaneous";
        inherit long short description sortedBy;
        text                            =   long;
        data
        =   {
              kind                      =   "Default";
              inherit short;
            };
      };

  RawUnit
  =   kind:
      short:
      { title, description, sortedBy ? "" }:
      {
        __type__                        =   "Acronym";
        __variant__                     =   "Unit";
        section                         =   "Units";
        text                            =   title;
        inherit title sortedBy;
        description
        =   { name, ... }:
            {
              deu                       =   formatUnitDescription name description.deu;
            };
        data                            =   { inherit kind short; };
      };

in
{
  Angle                                 =   RawUnit "Angle";
  Unit                                  =   RawUnit "Unit";
  inherit Miscellaneous;
}