docs: def signed_face_areas(faces, axis=1):
      '''
      signed_face_areas(faces) yields a potential function f(x) that calculates the signed area of
        each face represented by the simplices matrix faces.
  
      If faces is None, then the parameters must arrive in the form of a flattened (n x 3 x 2) matrix
      where n is the number of triangles. Otherwise, the faces matrix must be either (n x 3) or (n x 3
      x s); if the former, each row must list the vertex indices for the faces where the vertex matrix
      is presumed to be shaped (V x 2). Alternately, faces may be a full (n x 3 x 2) simplex array of
      the indices into the parameters.
  
      The optional argument axis (default: 1) may be set to 0 if the faces argument is a matrix but
      the coordinate matrix will be (2 x V) instead of (V x 2).
      '''
      faces = np.asarray(faces)
      if len(faces.shape) == 2:
          if faces.shape[1] != 3: faces = faces.T
          n = 2 * (np.max(faces) + 1)
          if axis == 0: tmp = np.reshape(np.arange(n), (2,-1)).T
          else:         tmp = np.reshape(np.arange(n), (-1,2))
          faces = np.reshape(tmp[faces.flat], (-1,3,2))
      faces = faces.flatten()
      return compose(TriangleSignedArea2DPotential(), part(Ellipsis, faces))