':return: A pretty-printed string representation of this tree.
:rtype: str
:param margin: The right margin at which to do line-wrapping.
:type margin: int
:param indent: The indentation level at which printing
begins.  This number is used to decide how far to indent
subsequent lines.
:type indent: int
:param nodesep: A string that is used to separate the node
from the children.  E.g., the default value ``\':\'`` gives
trees like ``(S: (NP: I) (VP: (V: saw) (NP: it)))``.'

def pformat(self, margin=70, indent=0, nodesep=u'', parens=u'()', quotes=False):

    s = self._pformat_flat(nodesep, parens, quotes)
    if ((len(s) + indent) < margin):
        return s
    if isinstance(self._label, string_types):
        s = (u'%s%s%s' % (parens[0], self._label, nodesep))
    else:
        s = (u'%s%s%s' % (parens[0], unicode_repr(self._label), nodesep))
    for child in self:
        if isinstance(child, Tree):
            s += ((u'\n' + (u'    ' * (indent + 2))) + child.pformat(margin, (indent + 2), nodesep, parens, quotes))
        elif isinstance(child, tuple):
            s += ((u'\n' + (u'    ' * (indent + 2))) + u'/'.join(child))
        elif (isinstance(child, string_types) and (not quotes)):
            s += ((u'\n' + (u'    ' * (indent + 2))) + (u'%s' % child))
        else:
            s += ((u'\n' + (u'    ' * (indent + 2))) + unicode_repr(child))
    return (s + parens[1])
