diff '--color=auto' -rupN fmt.orig/doc/build.py fmt/doc/build.py
--- fmt.orig/doc/build.py	2024-01-04 17:40:34.014213222 +0100
+++ fmt/doc/build.py	2024-01-04 17:41:48.775161340 +0100
@@ -11,34 +11,6 @@ versions = [
   '7.1.3', '8.0.0', '8.0.1', '8.1.0', '8.1.1', '9.0.0', '9.1.0']
 versions += ['10.0.0', '10.1.0', '10.1.1', '10.1.1', '10.2.0']
 
-class Pip:
-  def __init__(self, venv_dir):
-    self.path = os.path.join(venv_dir, 'bin', 'pip')
-
-  def install(self, package, commit=None):
-    "Install package using pip."
-    if commit:
-      package = 'git+https://github.com/{0}.git@{1}'.format(package, commit)
-    print('Installing {0}'.format(package))
-    check_call([self.path, 'install', package])
-
-def create_build_env(venv_dir='virtualenv'):
-  # Create virtualenv.
-  if not os.path.exists(venv_dir):
-    check_call(['python3', '-m', 'venv', venv_dir])
-  # Install Sphinx and Breathe. Require the exact version of Sphinx which is
-  # compatible with Breathe.
-  pip = Pip(venv_dir)
-  pip.install('wheel')
-  pip.install('six')
-  # See: https://github.com/sphinx-doc/sphinx/issues/9777
-  pip.install('docutils==0.17.1')
-  # Jinja2 >= 3.1 incompatible with sphinx 3.3.0
-  # See: https://github.com/sphinx-doc/sphinx/issues/10291
-  pip.install('Jinja2<3.1')
-  pip.install('sphinx==3.3.0')
-  pip.install('michaeljones/breathe', 'v4.25.0')
-
 def build_docs(version='dev', **kwargs):
   doc_dir = kwargs.get('doc_dir', os.path.dirname(os.path.realpath(__file__)))
   work_dir = kwargs.get('work_dir', '.')
@@ -103,13 +75,14 @@ def build_docs(version='dev', **kwargs):
 
   html_dir = os.path.join(work_dir, 'html')
   main_versions = reversed(versions[-3:])
-  check_call([os.path.join(work_dir, 'virtualenv', 'bin', 'sphinx-build'),
+  check_call(['sphinx-build',
               '-Dbreathe_projects.format=' + os.path.abspath(doxyxml_dir),
               '-Dversion=' + version, '-Drelease=' + version,
               '-Aversion=' + version, '-Aversions=' + ','.join(main_versions),
               '-b', 'html', doc_dir, html_dir])
   try:
-    check_call(['lessc', '--verbose', '--clean-css',
+    check_call(['npm', 'install', 'less', 'less-plugin-clean-css'])
+    check_call(['npx', 'lessc', '--verbose', '--clean-css',
                 '--include-path=' + os.path.join(doc_dir, 'bootstrap'),
                 os.path.join(doc_dir, 'fmt.less'),
                 os.path.join(html_dir, '_static', 'fmt.css')])
@@ -122,5 +95,4 @@ def build_docs(version='dev', **kwargs):
   return html_dir
 
 if __name__ == '__main__':
-  create_build_env()
   build_docs(sys.argv[1])
