docs: def param_docstrings(self, info, max_col_len=100, only_changed=False):
          """
          Build a string to that presents all of the parameter
          docstrings in a clean format (alternating red and blue for
          readability).
          """
  
          (params, val_dict, changed) = info
          contents = []
          displayed_params = {}
          for name, p in params.items():
              if only_changed and not (name in changed):
                  continue
              displayed_params[name] = p
  
          right_shift = max(len(name) for name in displayed_params.keys())+2
  
          for i, name in enumerate(sorted(displayed_params)):
              p = displayed_params[name]
              heading = "%s: " % name
              unindented = textwrap.dedent("< No docstring available >" if p.doc is None else p.doc)
  
              if (WARN_MISFORMATTED_DOCSTRINGS
                  and not unindented.startswith("\n")  and len(unindented.splitlines()) > 1):
                  param.main.warning("Multi-line docstring for %r is incorrectly formatted "
                                     " (should start with newline)", name)
              # Strip any starting newlines
              while unindented.startswith("\n"):
                  unindented = unindented[1:]
  
              lines = unindented.splitlines()
              if len(lines) > 1:
                  tail = ['%s%s' % (' '  * right_shift, line) for line in lines[1:]]
                  all_lines = [ heading.ljust(right_shift) + lines[0]] + tail
              elif len(lines) == 1:
                  all_lines = [ heading.ljust(right_shift) + lines[0]]
              else:
                  all_lines = []
  
              if i % 2:  # Alternate red and blue for docstrings
                  contents.extend([red %el for el in all_lines])
              else:
                  contents.extend([blue %el for el in all_lines])
  
          return "\n".join(contents)