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);
			elem.Children.Clear();
		}
		{
			var children_ = new List<PageElement>();
			var buf = new List<PageElement>();
			PageElement currentLi = null;
			foreach (var child in target.Children)
			{
				Debug.Assert(child is PageElements.Affix || child is Li);
				if (child is PageElements.Affix)
				{
					children_.Add(child);
				}
				else if (child is Li && child.Children.Count > 0 && child.Children[0] is Ol)
				{
					buf.Add(child.Children[0]);
				}
				else
				{
					if (buf.Count > 0)
					{
						//TODO:children_最後のLi.ChildrenにAdd、Affix.Childrenではなく
						//children_.Add(Merge(buf.ToArray()));
						Debug.Assert(currentLi != null);
						currentLi.Children.Add(Merge(buf.ToArray()));
						buf.Clear();
					}
					children_.Add(child);
					if (child is Li)
						currentLi = child;
				}
			}
			if (buf.Count > 0)
			{
				children_.Add(Merge(buf.ToArray()));
				buf.Clear();
			}
			target.Children.Clear();
			target.Children.AddRange(children_);
			children_.Clear();
		}
		//        foreach (var grandchild in li.Children)
		//        {
		//            if (grandchild is PageElements.Notations.Ol)
		//            {
		//                buf.Add(grandchild);
		//            }
		//            else if (buf.Count > 0)
		//            {
		//                grandchildren_.Add(Merge(buf.ToArray()));
		//                buf.Clear();
		//            }
		//            else
		//            {
		//                grandchildren_.Add(grandchild);
		//            }
		//        }
		//        if (buf.Count > 0)
		//        {
		//            grandchildren_.AddRange(buf.ToArray());
		//            buf.Clear();
		//        }
		//        li.Children.Clear();
		//        li.Children.AddRange(grandchildren_);
		//    }
		//}
		//var grandchildren = new List<PageElement>();
		//{
		//    foreach (var elem in elements)
		//    {
		//        foreach (var li in elem.Children)
		//        {
		//            grandchildren.AddRange(li.Children);
		//        }
		//    }
		//}
		//{
		//    var grandchildren_ = new List<PageElement>();
		//    var buf = new List<PageElement>();
		//    foreach (var grandchild in grandchildren)
		//    {
		//        if (grandchild is PageElements.Notations.Ol)
		//        {
		//            buf.Add(grandchild);
		//        }
		//        else if (buf.Count > 0)
		//        {
		//            grandchildren_.Add(Merge(buf.ToArray()));
		//            //Merge(buf.ToArray());
		//            buf.Clear();
		//        }
		//        else
		//        {
		//            grandchildren_.Add(grandchild);
		//        }
		//    }
		//    grandchildren = grandchildren_;
		//}
		//{
		//    var target = elements.First();
		//    var li = target.Children.First();
		//    target.Children.Clear();
		//    target.Children.Add(li);
		//    target.Children[0].Children.Clear();
		//    target.Children[0].Children.AddRange(grandchildren);
		//}
		//foreach (var elem in elements.Skip(1))
		//{
		//    Debug.Assert(elem is PageElements.Notations.Ol);
		//    target.Children.AddRange(elem.Children);
		//    elem.Children.Clear();
		//}
		//Debug.Assert(target.Children[1] is PageElements.Notations.Li);
		//target.Children[1].Children.Clear();
		//target.Children[1].Children.AddRange(grandchildren);
		//{
		//    var grandchildren_ = 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)
		//            {
		//                grandchildren_.Add(Merge(buf.ToArray()));
		//                buf.Clear();
		//            }
		//            else
		//            {
		//                grandchildren_.Add(c);
		//            }
		//        }
		//        li.Children.Clear();
		//        li.Children.AddRange(grandchildren_);
		//        grandchildren_.Clear();
		//    }
		//}
		//{
		//    // 連結可能Elementを連結
		//    var buf = new List<PageElement>();
		//    //FIXME:remove general adding
		//    elements.Add(new Affix(null, ""));
		//    foreach (var elem in elements)
		//    {
		//        if (buf.Count >= 1 && buf.Last().GetType() != elem.GetType())
		//        {
		//            // 既存Elementに連結
		//            //TODO:Merge可能かどうかはPlugin.Mergableを実装しているかで判定
		//            var merge = buf.First().GetType().GetMethod("Merge", BindingFlags.Static | BindingFlags.Public | BindingFlags.FlattenHierarchy);
		//            if (buf.Count >= 2 && merge != null)
		//            {
		//                merge.Invoke(null, new object[] { buf.ToArray() });
		//            }
		//            else
		//                buf.Clear();
		//        }
		//        buf.Add(elem);
		//    }
		//    buf.Clear();
		//}
		return target;
	}
	/// <summary>
	/// 連結
	/// </summary>
	static public void Merge(PageElements.Notations.Ol self, PageElements.Notations.Ol target)
	{
		Debug.Assert(self.Children.Count > 0);
		var existsTargetChild = target.Children[target.Children.Count - 2] is PageElements.Notations.Li && target.Children[target.Children.Count - 2].Children.Count > 0 && target.Children[target.Children.Count - 2].Children[0] is PageElements.Notations.Ol;
		var existsSelfChild = self.Children[self.Children.Count - 2] is PageElements.Notations.Li && self.Children[self.Children.Count - 2].Children.Count > 0 && self.Children[self.Children.Count - 2].Children[0] is PageElements.Notations.Ol; ;
		if (existsTargetChild && existsSelfChild)
		{
			Debug.Assert(self.Children[self.Children.Count - 2].Children[0] is Ol && target.Children[target.Children.Count - 2].Children[0] is Ol);
			// どちらもまだ深い階層がある(レベル解析途中)
			PageElements.Notations.Ol.Merge((Ol)self.Children[self.Children.Count - 2].Children[0], (Ol)target.Children[target.Children.Count - 2].Children[0]);
			//Debug.Assert(self is PageElements.Notations.Ol && self.Children[1] is PageElements.Notations.Li && self.Children[1].Children[1] is PageElements.Notations.Ol);
			//var selfLi = (Li)self.Children[1];
			//var selfOl2 = (Ol)selfLi.Children[1];
			//var targetLi = (Li)target.Children[1];
			//var targetOl2 = (Ol)targetLi.Children[1];
			//PageElements.Notations.Ol.Merge(selfOl2, targetOl2);
		}
		else if (!existsTargetChild && existsSelfChild)
		{
			// レベルが深くなった
			target.Children[target.Children.Count - 2].Children.Add(self.Children[self.Children.Count - 2].Children[0]);
		}
		else
		{
			// レベルが浅くなったかどちらも最下層(レベル解析完了)
			Debug.Assert(
					existsTargetChild && !existsSelfChild
				|| !existsTargetChild && !existsSelfChild
			);
			target.Children.AddRange(self.Children);
		}
	}