docs: def format_listfield_nodes(field_name, field, field_id, state, lineno):
      """Create a section node that documents a ListField config field.
  
      Parameters
      ----------
      field_name : `str`
          Name of the configuration field (the attribute name of on the config
          class).
      field : ``lsst.pex.config.ListField``
          A configuration field.
      field_id : `str`
          Unique identifier for this field. This is used as the id and name of
          the section node. with a -section suffix
      state : ``docutils.statemachine.State``
          Usually the directive's ``state`` attribute.
      lineno (`int`)
          Usually the directive's ``lineno`` attribute.
  
      Returns
      -------
      ``docutils.nodes.section``
          Section containing documentation nodes for the ListField.
      """
      # ListField's store their item types in the itemtype attribute
      itemtype_node = nodes.definition_list_item()
      itemtype_node += nodes.term(text='Item type')
      itemtype_def = nodes.definition()
      itemtype_def += make_python_xref_nodes_for_type(
          field.itemtype,
          state,
          hide_namespace=False)
      itemtype_node += itemtype_def
  
      minlength_node = None
      if field.minLength:
          minlength_node = nodes.definition_list_item()
          minlength_node += nodes.term(text='Minimum length')
          minlength_def = nodes.definition()
          minlength_def += nodes.paragraph(text=str(field.minLength))
          minlength_node += minlength_def
  
      maxlength_node = None
      if field.maxLength:
          maxlength_node = nodes.definition_list_item()
          maxlength_node += nodes.term(text='Maximum length')
          maxlength_def = nodes.definition()
          maxlength_def += nodes.paragraph(text=str(field.maxLength))
          maxlength_node += maxlength_def
  
      length_node = None
      if field.length:
          length_node = nodes.definition_list_item()
          length_node += nodes.term(text='Required length')
          length_def = nodes.definition()
          length_def += nodes.paragraph(text=str(field.length))
          length_node += length_def
  
      # Type description
      field_type_item = nodes.definition_list_item()
      field_type_item.append(nodes.term(text="Field type"))
      field_type_item_content = nodes.definition()
      field_type_item_content_p = nodes.paragraph()
      field_type_item_content_p += make_python_xref_nodes_for_type(
          field.itemtype,
          state,
          hide_namespace=False)[0].children[0]
      field_type_item_content_p += nodes.Text(' ', ' ')
      field_type_item_content_p += make_python_xref_nodes_for_type(
          type(field),
          state,
          hide_namespace=True)[0].children[0]
      if field.optional:
          field_type_item_content_p += nodes.Text(' (optional)', ' (optional)')
      field_type_item_content += field_type_item_content_p
      field_type_item += field_type_item_content
  
      # Reference target
      env = state.document.settings.env
      ref_target = create_configfield_ref_target_node(field_id, env, lineno)
  
      # Title is the field's attribute name
      title = nodes.title(text=field_name)
      title += ref_target
  
      # Definition list for key-value metadata
      dl = nodes.definition_list()
      dl += create_default_item_node(field, state)
      dl += field_type_item
      if minlength_node:
          dl += minlength_node
      if maxlength_node:
          dl += maxlength_node
      if length_node:
          dl += length_node
  
      # Doc for this ConfigurableField, parsed as rst
      desc_node = create_description_node(field, state)
  
      # Title for configuration field
      title = create_title_node(field_name, field, field_id, state, lineno)
  
      return [title, dl, desc_node]