boolean isExactlyUnder(ZLTextElementRegion other) {
   if (other == null) {
     return true;
   }
   if (!isUnder(other)) {
     return false;
   }
   final List<ZLTextElementArea> areas0 = textAreas();
   final List<ZLTextElementArea> areas1 = other.textAreas();
   for (ZLTextElementArea i : areas0) {
     for (ZLTextElementArea j : areas1) {
       if (i.XStart <= j.XEnd && j.XStart <= i.XEnd) {
         return true;
       }
     }
   }
   return false;
 }
 boolean isOver(ZLTextElementRegion other) {
   return other == null || other.isUnder(this);
 }
 boolean isAtLeftOf(ZLTextElementRegion other) {
   return other == null || other.isAtRightOf(this);
 }