docs: def full(self, filetype, **kwargs):
          """Return the full name of a given type of file.
  
          Parameters
          ----------
          filetype : str
              File type parameter.
  
          Returns
          -------
          full : str
              The full path to the file.
          """
  
          # check if full already in kwargs
          if 'full' in kwargs:
              return kwargs.get('full')
  
          # check for filetype in template
          assert filetype in self.templates, ('No entry {0} found. Filetype must '
                                              'be one of the designated templates '
                                              'in the currently loaded tree'.format(filetype))
          template = self.templates[filetype]
  
          # Now replace {} items
          if template:
              # check for missing keyword arguments
              keys = self.lookup_keys(filetype)
              # split keys to remove :format from any "key:format"
              keys = [k.split(':')[0] for k in keys]
              missing_keys = set(keys) - set(kwargs.keys())
              if missing_keys:
                  raise KeyError('Missing required keyword arguments: {0}'.format(list(missing_keys)))
              else:
                  template = template.format(**kwargs)
  
          if template:
              # Now replace environmental variables
              template = os.path.expandvars(template)
  
              # Now call special functions as appropriate
              template = self._call_special_functions(filetype, template, **kwargs)
  
          return template