static public PageElement Merge(PageElement[] elements)
{
var target = elements.First();
Debug.Assert(target is PageElements.Notations.Ol);
foreach (var elem in elements.Skip(1))
{
    Debug.Assert(elem is PageElements.Notations.Ol);
    target.Children.AddRange(elem.Children);
}

{
    var elements_ = new List<PageElement>();
    var buf = new List<PageElement>();
    foreach (var li in target.Children.Where(e => e is PageElements.Notations.Li))
    {
        foreach (var c in li.Children)
        {
            if (c is PageElements.Notations.Ol)
            {
                buf.Add(c);
            }
            else if (buf.Count > 0)
            {
                elements_.Add(Merge(buf.ToArray()));
                buf.Clear();
            }
            else
            {
                elements_.Add(c);
            }
        }
        li.Children.Clear();
        li.Children.AddRange(elements_);
        elements_.Clear();
    }
}
}