docs: def horiz_string(*args, **kwargs):
      """
      Horizontally concatenates strings reprs preserving indentation
  
      Concats a list of objects ensuring that the next item in the list
      is all the way to the right of any previous items.
  
      Args:
          *args: list of strings to concat
          **kwargs: precision, sep
  
      CommandLine:
          python -m utool.util_str --test-horiz_string
  
      Example1:
          >>> # ENABLE_DOCTEST
          >>> # Pretty printing of matrices demo / test
          >>> import utool
          >>> import numpy as np
          >>> # Wouldn't it be nice if we could print this operation easily?
          >>> B = np.array(((1, 2), (3, 4)))
          >>> C = np.array(((5, 6), (7, 8)))
          >>> A = B.dot(C)
          >>> # Eg 1:
          >>> result = (utool.hz_str('A = ', A, ' = ', B, ' * ', C))
          >>> print(result)
          A = [[19 22]  = [[1 2]  * [[5 6]
               [43 50]]    [3 4]]    [7 8]]
  
      Exam2:
          >>> # Eg 2:
          >>> str_list = ['A = ', str(B), ' * ', str(C)]
          >>> horizstr = (utool.horiz_string(*str_list))
          >>> result = (horizstr)
          >>> print(result)
          A = [[1 2]  * [[5 6]
               [3 4]]    [7 8]]
      """
      import unicodedata
  
      precision = kwargs.get('precision', None)
      sep = kwargs.get('sep', '')
  
      if len(args) == 1 and not isinstance(args[0], six.string_types):
          val_list = args[0]
      else:
          val_list = args
  
      val_list = [unicodedata.normalize('NFC', ensure_unicode(val))
                  for val in val_list]
      all_lines = []
      hpos = 0
      # for each value in the list or args
      for sx in range(len(val_list)):
          # Ensure value is a string
          val = val_list[sx]
          str_ = None
          if precision is not None:
              # Hack in numpy precision
              if util_type.HAVE_NUMPY:
                  try:
                      if isinstance(val, np.ndarray):
                          str_ = np.array_str(val, precision=precision,
                                              suppress_small=True)
                  except ImportError:
                      pass
          if str_ is None:
              str_ = six.text_type(val_list[sx])
          # continue with formating
          lines = str_.split('\n')
          line_diff = len(lines) - len(all_lines)
          # Vertical padding
          if line_diff > 0:
              all_lines += [' ' * hpos] * line_diff
          # Add strings
          for lx, line in enumerate(lines):
              all_lines[lx] += line
              hpos = max(hpos, len(all_lines[lx]))
          # Horizontal padding
          for lx in range(len(all_lines)):
              hpos_diff = hpos - len(all_lines[lx])
              all_lines[lx] += ' ' * hpos_diff + sep
      all_lines = [line.rstrip(' ') for line in all_lines]
      ret = '\n'.join(all_lines)
      return ret