Given a list of sentence markables (i.e. sentence root nodes) and a list of
    lists of token markables (one list per sentence), returns a list of
    (sentence root node, token nodes) tuples. The result is sorted by the
    order in which the tokens occur in the text.

    Parameters
    ----------
    sentence_root_nodes : list of str
        a list of all sentence root node IDs
    token_nodes : list of list of str
        a list of lists. each list represents a sentence and contains
        token node IDs (in the order they occur in the text)

    Returns
    -------
    sorted_sentence_tuples : list of (str, list of str) tuples
        a list of all sentences in the order they occur in the text. each
        sentence is represented by an list of ordered token node IDs

def sort_sentences_by_token_order(sentence_root_nodes, token_nodes):
    """
    Given a list of sentence markables (i.e. sentence root nodes) and a list of
    lists of token markables (one list per sentence), returns a list of
    (sentence root node, token nodes) tuples. The result is sorted by the
    order in which the tokens occur in the text.

    Parameters
    ----------
    sentence_root_nodes : list of str
        a list of all sentence root node IDs
    token_nodes : list of list of str
        a list of lists. each list represents a sentence and contains
        token node IDs (in the order they occur in the text)

    Returns
    -------
    sorted_sentence_tuples : list of (str, list of str) tuples
        a list of all sentences in the order they occur in the text. each
        sentence is represented by an list of ordered token node IDs
    """
    def sentence_sort_key(sentence_token_tuple):
        """
        extracts a sortable key from the first token node ID of a sentence
        """
        return natural_sort_key(sentence_token_tuple[1][0])

    sentence_token_tuples = zip(sentence_root_nodes, token_nodes)
    return sorted(sentence_token_tuples, key=sentence_sort_key)