generate the PAULA file that contains the tokenization of the document
        graph. (In general, a PAULA document may contain more than one
        tokenization, but in discoursegraphs we'll only work with documents
        that have exactly one tokenization.)

        Example
        -------
        <?xml version="1.0" standalone="no"?>
        <!DOCTYPE paula SYSTEM "paula_mark.dtd">
        <paula version="1.1">
            <header paula_id="nolayer.maz-1423.tok"/>
            <markList xmlns:xlink="http://www.w3.org/1999/xlink" type="tok"
                xml:base="maz-1423.text.xml">
                <mark id="sTok1"
                    xlink:href="#xpointer(string-range(//body,'',1,3))" />
                <mark id="sTok2"
                    xlink:href="#xpointer(string-range(//body,'',5,10))" />
                ...
            </markList>
        </paula>

def __gen_tokenization_file(self):
        """
        generate the PAULA file that contains the tokenization of the document
        graph. (In general, a PAULA document may contain more than one
        tokenization, but in discoursegraphs we'll only work with documents
        that have exactly one tokenization.)

        Example
        -------
        <?xml version="1.0" standalone="no"?>
        <!DOCTYPE paula SYSTEM "paula_mark.dtd">
        <paula version="1.1">
            <header paula_id="nolayer.maz-1423.tok"/>
            <markList xmlns:xlink="http://www.w3.org/1999/xlink" type="tok"
                xml:base="maz-1423.text.xml">
                <mark id="sTok1"
                    xlink:href="#xpointer(string-range(//body,'',1,3))" />
                <mark id="sTok2"
                    xlink:href="#xpointer(string-range(//body,'',5,10))" />
                ...
            </markList>
        </paula>
        """
        paula_id = '{0}.{1}.tok'.format(self.corpus_name, self.name)
        E, tree = gen_paula_etree(paula_id)
        self.paulamap['tokenization'] = paula_id

        base_paula_id = '{0}.{1}.text'.format(self.corpus_name, self.name)
        mlist = E('markList',
                  {'type': 'tok',
                   XMLBASE: base_paula_id+'.xml'})
        tok_tuples = self.dg.get_tokens()
        for (tid, onset, tlen) in get_onsets(tok_tuples):
            # even SaltNPepper still uses xpointers for string-ranges!
            xp = "#xpointer(string-range(//body,'',{0},{1}))".format(onset, tlen)
            mlist.append(E('mark', {'id': tid,
                                    XLINKHREF: xp}))
        tree.append(mlist)
        self.files[paula_id] = tree
        self.file2dtd[paula_id] = PaulaDTDs.mark
        return paula_id