docs: def read_zmat(cls, inputfile, implicit_index=True):
          """Reads a zmat file.
  
          Lines beginning with ``#`` are ignored.
  
          Args:
              inputfile (str):
              implicit_index (bool): If this option is true the first column
              has to be the element symbols for the atoms.
                  The row number is used to determine the index.
  
          Returns:
              Zmat:
          """
          cols = ['atom', 'b', 'bond', 'a', 'angle', 'd', 'dihedral']
          if implicit_index:
              zmat_frame = pd.read_table(inputfile, comment='#',
                                         delim_whitespace=True,
                                         names=cols)
              zmat_frame.index = range(1, len(zmat_frame) + 1)
          else:
              zmat_frame = pd.read_table(inputfile, comment='#',
                                         delim_whitespace=True,
                                         names=['temp_index'] + cols)
              zmat_frame.set_index('temp_index', drop=True, inplace=True)
              zmat_frame.index.name = None
          if pd.isnull(zmat_frame.iloc[0, 1]):
              zmat_values = [1.27, 127., 127.]
              zmat_refs = [constants.int_label[x] for x in
                           ['origin', 'e_z', 'e_x']]
              for row, i in enumerate(zmat_frame.index[:3]):
                  cols = ['b', 'a', 'd']
                  zmat_frame.loc[:, cols] = zmat_frame.loc[:, cols].astype('O')
                  if row < 2:
                      zmat_frame.loc[i, cols[row:]] = zmat_refs[row:]
                      zmat_frame.loc[i, ['bond', 'angle', 'dihedral'][row:]
                                     ] = zmat_values[row:]
                  else:
                      zmat_frame.loc[i, 'd'] = zmat_refs[2]
                      zmat_frame.loc[i, 'dihedral'] = zmat_values[2]
  
          elif zmat_frame.iloc[0, 1] in constants.int_label.keys():
              zmat_frame = zmat_frame.replace(
                  {col: constants.int_label for col in ['b', 'a', 'd']})
          zmat_frame = cls._cast_correct_types(zmat_frame)
          try:
              Zmat = cls(zmat_frame)
          except InvalidReference:
              raise UndefinedCoordinateSystem(
                  'Your zmatrix cannot be transformed to cartesian coordinates')
          return Zmat