packages feed

ruler-0.4.0.0: src/Expr/LaTeXAG.cag

%%[1 ag

-------------------------------------------------------------------------
-- Pretty printing, LaTeX, Expr
-------------------------------------------------------------------------

ATTR AGExprItf Expr [ | | ppLaTeX USE {>-<} {empty} : PP_Doc ]

SEM Expr
  | Int             loc     .   ppLaTeX     =   pp @int
  | StrText         loc     .   ppLaTeX     =   switchLaTeXLhs (mkMBox (text @str))
  | StrAsIs         loc     .   ppLaTeX     =   pp @str
  | App             loc     .   ppLaTeX     =   @lExpr.ppLaTeX >#< @rExpr.ppLaTeX
  | Op              loc     .   ppLaTeX     =   @lExpr.ppLaTeX >#< @nmExpr.ppLaTeX >#< @rExpr.ppLaTeX
  | LF              loc     .   ppLaTeX     =   @lExpr.ppLaTeX >#< switchLaTeXLhs (mkTexCmdUse "quad" empty) >#< @rExpr.ppLaTeX
  | SP              loc     .   ppLaTeX     =   let c = case @rExpr.exprKind of
                                                          EKNm n -> case show n of
                                                                      (c:_) | isAlpha c -> (>#<)
                                                                            | otherwise -> (>|<)
                                                                      _                 -> (>#<)
                                                          _      -> (>#<)
                                                in  @lExpr.ppLaTeX `c` @rExpr.ppLaTeX
  | Paren           loc     .   ppLaTeX     =   (if @lhs.needToParen then ppParens else id) @expr.ppLaTeX
  | Cnstr           loc     .   ppLaTeX     =   @expr.ppLaTeX
  | SelTop          loc     .   ppLaTeXSel  =   ppSelLaTeX ((== nmOverl),(== nmOverVec)) @expr.ppLaTeX (reverse @expr.selL)
                    loc     .   ppLaTeX     =   if @expr.exprKind == EKEmp then empty else @ppLaTeXSel
  | Sel             lhs     .   ppLaTeX     =   @expr.ppLaTeX
  | Var             loc     .   ppLaTeX     =   ppNmLaTeX . nmLhs2TeXSafe $ @nm
  | Wrap            loc     .   ppLaTeX     =   let wr o c e
                                                      = switchLaTeXLhs (mkTexCmdUse (show o) empty) >#< e >#< switchLaTeXLhs (mkTexCmdUse (show c) empty)
                                                in  case gamLookup @wrKind wrKindGam of
                                                      Just i -> wr beg end @expr.ppLaTeX
                                                             where beg = fmNmFmtCmd @lhs.opts @lhs.fmGam $ wkBegCmd i
                                                                   end = fmNmFmtCmd @lhs.opts @lhs.fmGam $ wkEndCmd i
                                                      _      -> @expr.ppLaTeX
  | ChildOrder      loc     .   ppLaTeX     =   @expr.ppLaTeX
  | Expr            lhs     .   ppLaTeX     =   ensureTeXMath . switchLaTeXLhs' $ @expr.ppLaTeX
  | Empty           loc     .   ppLaTeX     =   empty
  | Undefined       loc     .   ppLaTeX     =   pp (fmNmFmtCmd @lhs.opts @lhs.fmGam $ Nm "rulerUndefinedExtern")

-------------------------------------------------------------------------
-- Maybe Pretty printing, LaTeX
-------------------------------------------------------------------------

ATTR MbExpr [ | | mbPPLaTeX: {Maybe (Nm,PP_Doc)} ]

SEM MbExpr
  | Nothing         lhs     .   mbPPLaTeX   =   Nothing
  | Just            lhs     .   mbPPLaTeX   =   Just (@just.txt,@just.ppLaTeX)

-------------------------------------------------------------------------
-- Need parenthesis
-------------------------------------------------------------------------

ATTR MbExpr Expr [ needToParen: Bool | | ]

SEM Expr
  | Sel             selMbExpr   .   needToParen =   False
                    expr        .   needToParen =   case @selMbExpr.mbPPLaTeX of
                                                        Just (n,_) | nmIsOver n
                                                          -> False
                                                        _ -> case @expr.exprKind of
                                                               EKNm _ -> False
                                                               _      -> @lhs.needToParen
  | Paren App Op SelTop SP
                    loc         .   needToParen =   True

SEM AGExprItf
  | AGItf           loc         .   needToParen =   True

%%]
  
-------------------------------------------------------------------------
-- Empty expr?
-------------------------------------------------------------------------

%%[1 hs
data ExprKind = EKEmp | EKNm Nm | EKOther deriving Eq
%%]

%%[1 ag

ATTR Expr [ | | exprKind: ExprKind ]

SEM Expr
  | Empty           lhs     .   exprKind    =   EKEmp
  | Var             lhs     .   exprKind    =   EKNm @nm
  | Sel             lhs     .   exprKind    =   @expr.exprKind
  | * - Var Empty Sel AppTop Paren
                    lhs     .   exprKind    =   EKOther

-------------------------------------------------------------------------
-- Selections info
-------------------------------------------------------------------------

ATTR Expr [ | | selL: {[Maybe (Nm,PP_Doc)]}]

SEM Expr
  | Sel             lhs     .   selL        =   @selMbExpr.mbPPLaTeX : @expr.selL
  | * - Sel         lhs     .   selL        =   []

-------------------------------------------------------------------------
-- Just the text of a name
-------------------------------------------------------------------------

ATTR Expr [ | | txt USE {`const`} {nmNone}: Nm ]

SEM Expr
  | Var             lhs     .   txt         =   @nm
  | StrText StrAsIs lhs     .   txt         =   Nm @str
  | App SelTop Op   lhs     .   txt         =   nmNone

%%]