anchor.diff:      | Op({idText = "==>"}, [e1;e2]) -> infix0 (str "==>") (p_tmArrow (Arrows (2, 2)) p_tmFormula e1) (p_tmImplies e2)
       | _ -> p_tmArrow (Arrows (2, 2)) p_tmFormula e
   
  -(* This function is somewhat convoluted because it is used in a few different contexts and it's trying to properly  *)
  -(* indent for each of them. For signatures, it is trying to print the whole arrow on one line. If this fails, it    *)
  -(* tries to print everything except the last term on the same line and push the last term on a new line. If this    *)
  -(* fails, it prints every term on a separate line. This seems consistent with the current style used in most cases. *)
  -(* A trailing space may sometimes be introduced, which we should trim.                                              *)
  +// This function is somewhat convoluted because it is used in a few
  +// different contexts and it is trying to properly indent for each of
  +// them. For signatures, it is trying to print the whole arrow on one
  +// line. If this fails, it tries to print everything except the
  +// computation type on the same line and push the computation type on a
  +// new line. If this fails, it prints every term on a separate line. A
  +// trailing space may sometimes be introduced, which we should trim.
  +// It also needs to make adjustments depending on which style a signature
  +// is to be printed in. For more details see the `annotation_style` type
  +// definition.
   and p_tmArrow style p_Tm e =
     let terms = p_tmArrow' p_Tm e in
     let terms', last = List.splitAt (List.length terms - 1) terms in
  
positive.code:   match List.length terms with
    | 1 -> List.hd terms
    | _ -> group (ifflat ((separate sep terms') ^^ space ^^ last_op ^^ List.hd last)
               (prefix n 1 (group ((ifflat (separate sep terms')
                    (jump2 ((single_line_arg_indent ^^ separate (sep ^^ single_line_arg_indent) (List.map (fun x -> align (hang 2 x)) terms'))))))) (align (hang last_n (last_op ^^ List.hd last)))))
  
  and all_binders_annot e =
    let rec all_binders e l =
      match e.tm with
      | Product(bs, tgt) -> if List.for_all is_binder_annot bs then all_binders tgt (l+ List.length bs) else (false, 0)
      | _ -> (true, l+1)
    in
    let b, l = all_binders e 0 in
    if b && l > 1 then true else false
  
  and p_tmArrow' p_Tm e = match e.tm with
    | Product(bs, tgt) -> (List.map (fun b -> p_binder false b) bs) @ (p_tmArrow' p_Tm tgt)
  
negative.code:             (p_trigger trigger))) term_doc)
    | _ -> p_simpleTerm ps pb e
  
  and p_typ_top style ps pb e = with_comment (p_typ_top' style ps pb) e e.range "!41"
  
  and p_typ_top' style ps pb e = p_tmArrow style p_tmFormula e
  
  and p_quantifier e = match e.tm with
      | QForall _ -> str "forall"
  