_single = function( targInfo, theme, finished ) {

  let ret = null;
  let ex = null;
  const f = targInfo.file;

  try {

    if (!targInfo.fmt) {
      return { };
    }
    let theFormat = null;

    this.stat(HMEVENT.beforeGenerate, {
      fmt: targInfo.fmt.outFormat,
      file: PATH.relative(process.cwd(), f)
    }
    );

    _opts.targets = finished;

    // If targInfo.fmt.files exists, this format is backed by a document.
    // Fluent/FRESH themes are handled here.
    if (targInfo.fmt.files && targInfo.fmt.files.length) {
      theFormat = _fmts.filter( fmt => fmt.name === targInfo.fmt.outFormat)[0];
      MKDIRP.sync(PATH.dirname( f ));
      ret = theFormat.gen.generate(_rezObj, f, _opts);

    // Otherwise this is an ad-hoc format (JSON, YML, or PNG) that every theme
    // gets "for free".
    } else {
      theFormat = _fmts.filter( fmt => fmt.name === targInfo.fmt.outFormat)[0];
      const outFolder = PATH.dirname(f);
      MKDIRP.sync(outFolder); // Ensure dest folder exists;
      ret = theFormat.gen.generate(_rezObj, f, _opts);
    }

  } catch (e) {
    ex = e;
  }

  this.stat(HMEVENT.afterGenerate, {
    fmt: targInfo.fmt.outFormat,
    file: PATH.relative(process.cwd(), f),
    error: ex
  }
  );

  if (ex) {
    if (ex.fluenterror) {
      ret = ex;
    } else {
      ret = {fluenterror: HMSTATUS.generateError, inner: ex};
    }
  }
  return ret;
}
Generate a single target resume such as "out/rez.html" or "out/rez.doc".
TODO: Refactor.
@param targInfo Information for the target resume.
@param theme A FRESHTheme or JRSTheme object.