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