%%[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 %%]