docs: def import_txt(filename, **kwargs):
      """Import Syscal measurements from a text file, exported as 'Spreadsheet'.
  
      Parameters
      ----------
      filename: string
          input filename
      x0: float, optional
          position of first electrode. If not given, then use the smallest
          x-position in the data as the first electrode.
      spacing: float
          electrode spacing. This is important if not all electrodes are used in
          a given measurement setup. If not given, then the smallest distance
          between electrodes is assumed to be the electrode spacing. Naturally,
          this requires measurements (or injections) with subsequent electrodes.
      reciprocals: int, optional
          if provided, then assume that this is a reciprocal measurements where
          only the electrode cables were switched. The provided number N is
          treated as the maximum electrode number, and denotations are renamed
          according to the equation :math:`X_n = N - (X_a - 1)`
  
      Returns
      -------
      data: :py:class:`pandas.DataFrame`
          Contains the measurement data
      electrodes: :py:class:`pandas.DataFrame`
          Contains electrode positions (None at the moment)
      topography: None
          No topography information is contained in the text files, so we always
          return None
  
      Notes
      -----
  
      * TODO: we could try to infer electrode spacing from the file itself
  
      """
      # read in text file into a buffer
      with open(filename, 'r') as fid:
          text = fid.read()
      strings_to_replace = {
          'Mixed / non conventional': 'Mixed/non-conventional',
          'Date': 'Date Time AM-PM',
      }
      for key in strings_to_replace.keys():
          text = text.replace(key, strings_to_replace[key])
  
      buffer = StringIO(text)
  
      # read data file
      data_raw = pd.read_csv(
          buffer,
          # sep='\t',
          delim_whitespace=True,
      )
  
      # clean up column names
      data_raw.columns = [x.strip() for x in data_raw.columns.tolist()]
  
      # generate electrode positions
      data = _convert_coords_to_abmn_X(
          data_raw[['Spa.1', 'Spa.2', 'Spa.3', 'Spa.4']],
          **kwargs
      )
  
      # [mV] / [mA]
      data['r'] = data_raw['Vp'] / data_raw['In']
      data['Vmn'] = data_raw['Vp']
      data['Iab'] = data_raw['In']
  
      # rename electrode denotations
      rec_max = kwargs.get('reciprocals', None)
      if rec_max is not None:
          print('renumbering electrode numbers')
          data[['a', 'b', 'm', 'n']] = rec_max + 1 - data[['a', 'b', 'm', 'n']]
  
      return data, None, None