-- |
-- Module      : Math.LaTeX.Internal.Display
-- Copyright   : (c) Justus Sagemüller 2017
-- License     : GPL v3
-- 
-- Maintainer  : (@) jsag $ hvl.no
-- Stability   : experimental
-- Portability : requires GHC>7 extensions
-- 

{-# LANGUAGE OverloadedStrings   #-}
{-# LANGUAGE RankNTypes          #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE UnicodeSyntax       #-}
{-# LANGUAGE TemplateHaskell     #-}
{-# LANGUAGE CPP                 #-}

module Math.LaTeX.Internal.Display where

import qualified Text.LaTeX as LaTeX
import Text.LaTeX (raw)
import Text.LaTeX.Base.Class (LaTeXC, fromLaTeX)
import qualified Text.LaTeX.Base.Class as LaTeX
import qualified Text.LaTeX.Base.Types as LaTeX
import qualified Text.LaTeX.Base.Commands as LaTeX
import Text.LaTeX.Base.Syntax (LaTeX(TeXEnv, TeXComm))
import qualified Text.LaTeX.Packages.AMSMath as LaTeX
import qualified Text.LaTeX.Packages.AMSFonts as LaTeX

import CAS.Dumb
import CAS.Dumb.Tree
import CAS.Dumb.Symbols
import CAS.Dumb.LaTeX.Symbols
import Math.LaTeX.Internal.MathExpr

import Data.Foldable (fold)
import Data.Monoid ((<>))
import Control.Arrow
import Data.String (fromString)
import Data.Char (isAlpha)

import GHC.Stack (HasCallStack)


infixl 1 >$
-- | Embed inline maths in a monadic chain of document-components. Space before
--   the math is included automatically.
--
-- @
--   do
--     \"If\">$𝑎;" and">$𝑏;" are the lengths of the legs and">$𝑐
--     " of the cathete of a right triangle, then">$ 𝑎◝2+𝑏◝2 ⩵ 𝑐◝2;" holds."
-- @
(>$) :: (LaTeXC r, LaTeXSymbol σ)
        => r -> LaTeXMath σ -> r
r
s >$ :: forall r σ. (LaTeXC r, LaTeXSymbol σ) => r -> LaTeXMath σ -> r
>$ LaTeXMath σ
m = r
s forall a. Semigroup a => a -> a -> a
<> r
" " forall a. Semigroup a => a -> a -> a
<> forall l. LaTeXC l => l -> l
LaTeX.math (forall σ l.
(LaTeXC l, SymbolClass σ, SCConstraint σ LaTeX) =>
CAS (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX) -> l
toMathLaTeX' LaTeXMath σ
m)

infixr 6 $<>
-- | Embed inline maths in a semigroup/monoidal chain of document-components.
--
-- @
--     "If "<>𝑎$<>" and "<>𝑏$<>" are the lengths of the legs and "<>𝑐$<>
--      " of the cathete of a right triangle, then "<>(𝑎◝2+𝑏◝2 ⩵ 𝑐◝2)$<>" holds."
-- @
($<>) :: (LaTeXC r, LaTeXSymbol σ)
        => LaTeXMath σ -> r -> r
LaTeXMath σ
m $<> :: forall r σ. (LaTeXC r, LaTeXSymbol σ) => LaTeXMath σ -> r -> r
$<> r
s = forall l. LaTeXC l => l -> l
LaTeX.math (forall σ l.
(LaTeXC l, SymbolClass σ, SCConstraint σ LaTeX) =>
CAS (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX) -> l
toMathLaTeX' LaTeXMath σ
m) forall a. Semigroup a => a -> a -> a
<> r
s

-- | Include a formula / equation system as a LaTeX display. If it's a single
--   equation, automatic line breaks are inserted (requires the
--   <https://www.ctan.org/pkg/breqn?lang=en breqn LaTeX package>).
dmaths :: (LaTeXC r, LaTeXSymbol σ)
   => [[LaTeXMath σ]]
               -- ^ Equations to show.
    -> String  -- ^ “Terminator” – this can include punctuation (when an equation
               --   is at the end of a sentence in the preceding text).
    -> r
dmaths :: forall r σ.
(LaTeXC r, LaTeXSymbol σ) =>
[[LaTeXMath σ]] -> String -> r
dmaths [[LaTeXMath σ
e]] String
garnish = case Maybe LaTeX
eqnum of
    Maybe LaTeX
Nothing -> forall l. LaTeXC l => LaTeX -> l
fromLaTeX forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [TeXArg] -> LaTeX -> LaTeX
TeXEnv String
"dmath*" [] forall a b. (a -> b) -> a -> b
$ forall σ l.
(l ~ LaTeX, SymbolClass σ, SCConstraint σ l) =>
CAS (Infix l) (Encapsulation l) (SymbolD σ l) -> l
toMathLaTeX LaTeXMath σ
e forall a. Semigroup a => a -> a -> a
<> LaTeX
terminator
    Just LaTeX
n  -> forall l. LaTeXC l => LaTeX -> l
fromLaTeX forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [TeXArg] -> LaTeX -> LaTeX
TeXEnv String
"equation" [] forall a b. (a -> b) -> a -> b
$ LaTeX
n forall a. Semigroup a => a -> a -> a
<> forall σ l.
(l ~ LaTeX, SymbolClass σ, SCConstraint σ l) =>
CAS (Infix l) (Encapsulation l) (SymbolD σ l) -> l
toMathLaTeX LaTeXMath σ
e forall a. Semigroup a => a -> a -> a
<> LaTeX
terminator
 where (Maybe LaTeX
eqnum, LaTeX
terminator) = forall r. LaTeXC r => String -> (Maybe r, r)
parseEqnum String
garnish
dmaths [[LaTeXMath σ]]
eqLines String
garnish = forall l. LaTeXC l => LaTeX -> l
fromLaTeX forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [TeXArg] -> LaTeX -> LaTeX
TeXEnv
           (case Maybe LaTeX
eqnum of{Maybe LaTeX
Nothing->String
"align*";Just LaTeX
_->String
"align"}) [] forall a b. (a -> b) -> a -> b
$ forall {σ}.
(SCConstraint σ LaTeX, SymbolClass σ) =>
[[LaTeXMath σ]] -> LaTeX
stack [[LaTeXMath σ]]
eqLines
 where stack :: [[LaTeXMath σ]] -> LaTeX
stack [[LaTeXMath σ]
singline] = forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold Maybe LaTeX
eqnum forall a. Semigroup a => a -> a -> a
<> forall {σ} {a}.
(SCConstraint σ LaTeX, LaTeXC a, SymbolClass σ) =>
[LaTeXMath σ] -> a
aliLine [LaTeXMath σ]
singline forall a. Semigroup a => a -> a -> a
<> LaTeX
terminator
       stack ([LaTeXMath σ]
line : [[LaTeXMath σ]]
lines) = forall {σ} {a}.
(SCConstraint σ LaTeX, LaTeXC a, SymbolClass σ) =>
[LaTeXMath σ] -> a
aliLine [LaTeXMath σ]
line forall a. Semigroup a => a -> a -> a
<> forall l. LaTeXC l => l
LaTeX.lnbk forall a. Semigroup a => a -> a -> a
<> [[LaTeXMath σ]] -> LaTeX
stack [[LaTeXMath σ]]
lines
       aliLine :: [LaTeXMath σ] -> a
aliLine [] = forall a. Monoid a => a
mempty
       aliLine [LaTeXMath σ
q] = forall c σ. (LaTeXC c, LaTeXSymbol σ) => LaTeXMath σ -> c
contentsWithAlignAnchor LaTeXMath σ
q
       aliLine (LaTeXMath σ
q : [LaTeXMath σ]
cols)
             = forall c σ. (LaTeXC c, LaTeXSymbol σ) => LaTeXMath σ -> c
contentsWithAlignAnchor LaTeXMath σ
q forall l. LaTeXC l => l -> l -> l
LaTeX.& [LaTeXMath σ] -> a
aliLine [LaTeXMath σ]
cols
       (Maybe LaTeX
eqnum, LaTeX
terminator) = forall r. LaTeXC r => String -> (Maybe r, r)
parseEqnum String
garnish

-- | Include a set of equations or formulas, each with a LaTeX label that can be
--   referenced with 'LaTeX.ref'. (The label name will /not/ appear in the rendered
--   document output; by default it will be just a number but you can tweak it with
--   the terminator by including the desired tag in parentheses.)
equations :: (LaTeXC r, LaTeXSymbol σ, HasCallStack)
  => [(LaTeXMath σ, String)]
              -- ^ Equations to show, with label name.
   -> String  -- ^ “Terminator” – this can include punctuation (when an equation
              --   is at the end of a sentence in the preceding text).
   -> r
equations :: forall r σ.
(LaTeXC r, LaTeXSymbol σ, HasCallStack) =>
[(LaTeXMath σ, String)] -> String -> r
equations [(LaTeXMath σ
e,String
lbl)] String
garnish = forall l. LaTeXC l => LaTeX -> l
fromLaTeX forall a b. (a -> b) -> a -> b
$ case Maybe LaTeX
eqnum of
    Maybe LaTeX
Nothing -> String -> [TeXArg] -> LaTeX -> LaTeX
TeXEnv String
"equation" []
          forall a b. (a -> b) -> a -> b
$ forall b a. b -> (a -> b) -> Maybe a -> b
maybe forall a. Monoid a => a
mempty forall a. a -> a
id Maybe LaTeX
eqnum forall a. Semigroup a => a -> a -> a
<> forall σ l.
(l ~ LaTeX, SymbolClass σ, SCConstraint σ l) =>
CAS (Infix l) (Encapsulation l) (SymbolD σ l) -> l
toMathLaTeX LaTeXMath σ
e forall a. Semigroup a => a -> a -> a
<> LaTeX
terminator forall a. Semigroup a => a -> a -> a
<> HasCallStack => String -> LaTeX
asSafeLabel String
lbl
    Just LaTeX
tag -> String -> [TeXArg] -> LaTeX -> LaTeX
TeXEnv String
"equation*" []
          forall a b. (a -> b) -> a -> b
$ LaTeX
tag forall a. Semigroup a => a -> a -> a
<> forall σ l.
(l ~ LaTeX, SymbolClass σ, SCConstraint σ l) =>
CAS (Infix l) (Encapsulation l) (SymbolD σ l) -> l
toMathLaTeX LaTeXMath σ
e forall a. Semigroup a => a -> a -> a
<> LaTeX
terminator forall a. Semigroup a => a -> a -> a
<> HasCallStack => String -> LaTeX
asSafeLabel String
lbl
 where (Maybe LaTeX
eqnum, LaTeX
terminator) = forall r. LaTeXC r => String -> (Maybe r, r)
parseEqnum String
garnish
equations [(LaTeXMath σ, String)]
eqLines String
garnish = forall l. LaTeXC l => LaTeX -> l
fromLaTeX forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [TeXArg] -> LaTeX -> LaTeX
TeXEnv String
"align" [] forall a b. (a -> b) -> a -> b
$ forall {σ}.
(SCConstraint σ LaTeX, SymbolClass σ) =>
[(LaTeXMath σ, String)] -> LaTeX
stack [(LaTeXMath σ, String)]
eqLines
 where stack :: [(LaTeXMath σ, String)] -> LaTeX
stack [(LaTeXMath σ, String)
singline] = forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold Maybe LaTeX
eqnum forall a. Semigroup a => a -> a -> a
<> forall {σ}.
(SCConstraint σ LaTeX, SymbolClass σ) =>
(LaTeXMath σ, String) -> LaTeX
aliLine (LaTeXMath σ, String)
singline forall a. Semigroup a => a -> a -> a
<> LaTeX
terminator
       stack ((LaTeXMath σ, String)
line : [(LaTeXMath σ, String)]
lines) = forall {σ}.
(SCConstraint σ LaTeX, SymbolClass σ) =>
(LaTeXMath σ, String) -> LaTeX
aliLine (LaTeXMath σ, String)
line forall a. Semigroup a => a -> a -> a
<> forall l. LaTeXC l => l
LaTeX.lnbk forall a. Semigroup a => a -> a -> a
<> [(LaTeXMath σ, String)] -> LaTeX
stack [(LaTeXMath σ, String)]
lines
       aliLine :: (LaTeXMath σ, String) -> LaTeX
aliLine (LaTeXMath σ
q, String
lbl) = forall c σ. (LaTeXC c, LaTeXSymbol σ) => LaTeXMath σ -> c
contentsWithAlignAnchor LaTeXMath σ
q forall a. Semigroup a => a -> a -> a
<> HasCallStack => String -> LaTeX
asSafeLabel String
lbl
       terminator :: LaTeX
       (Maybe LaTeX
eqnum, LaTeX
terminator) = forall r. LaTeXC r => String -> (Maybe r, r)
parseEqnum String
garnish

asSafeLabel :: HasCallStack => String -> LaTeX
asSafeLabel :: HasCallStack => String -> LaTeX
asSafeLabel String
lbl
  | forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Char -> Bool
safeChar String
lbl  = forall l. LaTeXC l => l -> l
LaTeX.label forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall l. LaTeXC l => Text -> l
raw forall a b. (a -> b) -> a -> b
$ forall a. IsString a => String -> a
fromString String
lbl
  | Bool
otherwise         = forall a. HasCallStack => String -> a
error forall a b. (a -> b) -> a -> b
$ String
"Labels can only contain alphabetic characters or “"
                                  forall a. [a] -> [a] -> [a]
++String
safeSpecialCharsforall a. [a] -> [a] -> [a]
++String
"”."
 where safeChar :: Char -> Bool
safeChar Char
c = Char -> Bool
isAlpha Char
c Bool -> Bool -> Bool
|| Char
cforall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem`String
safeSpecialChars
       safeSpecialChars :: String
safeSpecialChars = String
"[]:/._"

-- | Include a formula / equation system as a LaTeX display.
maths :: (LaTeXC r, LaTeXSymbol σ)
  => [[LaTeXMath σ]]
              -- ^ Equations to show.
   -> String  -- ^ “Terminator” – this can include punctuation (when an equation
              --   is at the end of a sentence in the preceding text).
   -> r
maths :: forall r σ.
(LaTeXC r, LaTeXSymbol σ) =>
[[LaTeXMath σ]] -> String -> r
maths [[LaTeXMath σ
e]] String
garnish = case Maybe LaTeX
eqnum of
   Maybe LaTeX
Nothing -> forall l. LaTeXC l => LaTeX -> l
fromLaTeX forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [TeXArg] -> LaTeX -> LaTeX
TeXEnv String
"equation*" [] forall a b. (a -> b) -> a -> b
$ forall σ l.
(l ~ LaTeX, SymbolClass σ, SCConstraint σ l) =>
CAS (Infix l) (Encapsulation l) (SymbolD σ l) -> l
toMathLaTeX LaTeXMath σ
e forall a. Semigroup a => a -> a -> a
<> LaTeX
terminator
   Just LaTeX
n  -> forall l. LaTeXC l => LaTeX -> l
fromLaTeX forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [TeXArg] -> LaTeX -> LaTeX
TeXEnv String
"equation" [] forall a b. (a -> b) -> a -> b
$ LaTeX
n forall a. Semigroup a => a -> a -> a
<> forall σ l.
(l ~ LaTeX, SymbolClass σ, SCConstraint σ l) =>
CAS (Infix l) (Encapsulation l) (SymbolD σ l) -> l
toMathLaTeX LaTeXMath σ
e forall a. Semigroup a => a -> a -> a
<> LaTeX
terminator
 where (Maybe LaTeX
eqnum, LaTeX
terminator) = forall r. LaTeXC r => String -> (Maybe r, r)
parseEqnum String
garnish
maths [[LaTeXMath σ]]
eqLines String
garnish = forall l. LaTeXC l => LaTeX -> l
fromLaTeX forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [TeXArg] -> LaTeX -> LaTeX
TeXEnv
           (case Maybe LaTeX
eqnum of{Maybe LaTeX
Nothing->String
"align*";Just LaTeX
_->String
"align"}) [] forall a b. (a -> b) -> a -> b
$ forall {σ}.
(SCConstraint σ LaTeX, SymbolClass σ) =>
[[LaTeXMath σ]] -> LaTeX
stack [[LaTeXMath σ]]
eqLines
 where stack :: [[LaTeXMath σ]] -> LaTeX
stack [[LaTeXMath σ]
singline] = forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold Maybe LaTeX
eqnum forall a. Semigroup a => a -> a -> a
<> forall {σ} {a}.
(SCConstraint σ LaTeX, LaTeXC a, SymbolClass σ) =>
[LaTeXMath σ] -> a
aliLine [LaTeXMath σ]
singline forall a. Semigroup a => a -> a -> a
<> LaTeX
terminator
       stack ([LaTeXMath σ]
line : [[LaTeXMath σ]]
lines) = forall {σ} {a}.
(SCConstraint σ LaTeX, LaTeXC a, SymbolClass σ) =>
[LaTeXMath σ] -> a
aliLine [LaTeXMath σ]
line forall a. Semigroup a => a -> a -> a
<> forall l. LaTeXC l => l
LaTeX.lnbk forall a. Semigroup a => a -> a -> a
<> [[LaTeXMath σ]] -> LaTeX
stack [[LaTeXMath σ]]
lines
       aliLine :: [LaTeXMath σ] -> a
aliLine [] = forall a. Monoid a => a
mempty
       aliLine [LaTeXMath σ
q] = forall c σ. (LaTeXC c, LaTeXSymbol σ) => LaTeXMath σ -> c
contentsWithAlignAnchor LaTeXMath σ
q
       aliLine (LaTeXMath σ
q : [LaTeXMath σ]
cols)
             = forall c σ. (LaTeXC c, LaTeXSymbol σ) => LaTeXMath σ -> c
contentsWithAlignAnchor LaTeXMath σ
q forall l. LaTeXC l => l -> l -> l
LaTeX.& [LaTeXMath σ] -> a
aliLine [LaTeXMath σ]
cols
       (Maybe LaTeX
eqnum, LaTeX
terminator) = forall r. LaTeXC r => String -> (Maybe r, r)
parseEqnum String
garnish

-- | Display an equation and also extract the final result. As with 'dmaths', automatic
--   line breaks are inserted by <https://www.ctan.org/pkg/breqn?lang=en breqn>.
dcalculation :: (LaTeXC (m ()), LaTeXSymbol σ, Functor m)
  => LaTeXMath σ
              -- ^ Computation chain to display.
   -> String  -- ^ “Terminator” – this can include punctuation (when an equation
              --   is at the end of a sentence in the preceding text).
   -> m (LaTeXMath σ)
              -- ^ Yield the rightmost expression in the displayed computation
              --   (i.e. usually the final result in a chain of algebraic equalities).
dcalculation :: forall (m :: * -> *) σ.
(LaTeXC (m ()), LaTeXSymbol σ, Functor m) =>
LaTeXMath σ -> String -> m (LaTeXMath σ)
dcalculation LaTeXMath σ
ch String
garnish = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\() -> LaTeXMath σ
result) forall a b. (a -> b) -> a -> b
$ case Maybe LaTeX
eqnum of
    Maybe LaTeX
Nothing -> forall l. LaTeXC l => LaTeX -> l
fromLaTeX forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [TeXArg] -> LaTeX -> LaTeX
TeXEnv String
"dmath*" [] forall a b. (a -> b) -> a -> b
$ forall σ l.
(l ~ LaTeX, SymbolClass σ, SCConstraint σ l) =>
CAS (Infix l) (Encapsulation l) (SymbolD σ l) -> l
toMathLaTeX LaTeXMath σ
ch forall a. Semigroup a => a -> a -> a
<> LaTeX
terminator
    Just LaTeX
n  -> forall l. LaTeXC l => LaTeX -> l
fromLaTeX forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [TeXArg] -> LaTeX -> LaTeX
TeXEnv String
"equation" [] forall a b. (a -> b) -> a -> b
$ LaTeX
n forall a. Semigroup a => a -> a -> a
<> forall σ l.
(l ~ LaTeX, SymbolClass σ, SCConstraint σ l) =>
CAS (Infix l) (Encapsulation l) (SymbolD σ l) -> l
toMathLaTeX LaTeXMath σ
ch forall a. Semigroup a => a -> a -> a
<> LaTeX
terminator
 where (Maybe LaTeX
eqnum, LaTeX
terminator) = forall r. LaTeXC r => String -> (Maybe r, r)
parseEqnum String
garnish
       result :: LaTeXMath σ
result = case LaTeXMath σ
ch of
        OperatorChain LaTeXMath σ
_ ((Infix LaTeX
_,LaTeXMath σ
r):[(Infix LaTeX, LaTeXMath σ)]
_) -> LaTeXMath σ
r
        LaTeXMath σ
r -> LaTeXMath σ
r

parseEqnum :: LaTeXC r => String -> (Maybe r, r)
parseEqnum :: forall r. LaTeXC r => String -> (Maybe r, r)
parseEqnum [] = (forall a. Maybe a
Nothing, forall a. Monoid a => a
mempty)
parseEqnum (Char
'.':String
n) = forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second (r
"."forall a. Semigroup a => a -> a -> a
<>) forall a b. (a -> b) -> a -> b
$ forall r. LaTeXC r => String -> (Maybe r, r)
parseEqnum String
n
parseEqnum (Char
',':String
n) = forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second (r
","forall a. Semigroup a => a -> a -> a
<>) forall a b. (a -> b) -> a -> b
$ forall r. LaTeXC r => String -> (Maybe r, r)
parseEqnum String
n
parseEqnum (Char
'!':String
n) = forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second (r
"!"forall a. Semigroup a => a -> a -> a
<>) forall a b. (a -> b) -> a -> b
$ forall r. LaTeXC r => String -> (Maybe r, r)
parseEqnum String
n
parseEqnum (Char
'?':String
n) = forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second (r
"?"forall a. Semigroup a => a -> a -> a
<>) forall a b. (a -> b) -> a -> b
$ forall r. LaTeXC r => String -> (Maybe r, r)
parseEqnum String
n
parseEqnum (Char
';':String
n) = forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second (r
";"forall a. Semigroup a => a -> a -> a
<>) forall a b. (a -> b) -> a -> b
$ forall r. LaTeXC r => String -> (Maybe r, r)
parseEqnum String
n
parseEqnum (Char
':':String
n) = forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second (forall l. LaTeXC l => Text -> l
rawText
"{:}"forall a. Semigroup a => a -> a -> a
<>) forall a b. (a -> b) -> a -> b
$ forall r. LaTeXC r => String -> (Maybe r, r)
parseEqnum String
n
parseEqnum (Char
'(':String
n) = ( forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$ forall l. LaTeXC l => Text -> l
rawText
"\\tag{"forall a. Semigroup a => a -> a -> a
<>forall a. IsString a => String -> a
fromString String
numforall a. Semigroup a => a -> a -> a
<>forall l. LaTeXC l => Text -> l
rawText
"}"
                     , forall a b. (a, b) -> b
snd forall a b. (a -> b) -> a -> b
$ forall r. LaTeXC r => String -> (Maybe r, r)
parseEqnum String
r )
 where (String
num,Char
')':String
r) = forall a. (a -> Bool) -> [a] -> ([a], [a])
break (forall a. Eq a => a -> a -> Bool
==Char
')') String
n
parseEqnum (Char
c:String
n) = forall r. LaTeXC r => String -> (Maybe r, r)
parseEqnum String
n

contentsWithAlignAnchor :: (LaTeXC c, LaTeXSymbol σ)
      => LaTeXMath σ -> c
contentsWithAlignAnchor :: forall c σ. (LaTeXC c, LaTeXSymbol σ) => LaTeXMath σ -> c
contentsWithAlignAnchor (OperatorChain CAS' Void (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX)
lc rcs :: [(Infix LaTeX,
  CAS' Void (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX))]
rcs@((Infix LaTeX,
 CAS' Void (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX))
_:[(Infix LaTeX,
  CAS' Void (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX))]
_))
    = forall σ l.
(LaTeXC l, SymbolClass σ, SCConstraint σ LaTeX) =>
CAS (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX) -> l
toMathLaTeX' CAS' Void (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX)
lc forall a. Semigroup a => a -> a -> a
<> forall l. LaTeXC l => LaTeX -> l
fromLaTeX LaTeX
op
         forall a. Semigroup a => a -> a -> a
<> forall l. LaTeXC l => Text -> l
rawText
"\\:"forall l. LaTeXC l => l -> l -> l
LaTeX.&forall σ l.
(LaTeXC l, SymbolClass σ, SCConstraint σ LaTeX) =>
CAS (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX) -> l
toMathLaTeX' (forall γ s² s¹ s⁰.
CAS' γ s² s¹ s⁰ -> [(s², CAS' γ s² s¹ s⁰)] -> CAS' γ s² s¹ s⁰
OperatorChain CAS' Void (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX)
rc₀ forall a b. (a -> b) -> a -> b
$ forall a. [a] -> [a]
init [(Infix LaTeX,
  CAS' Void (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX))]
rcs)
 where (Infix Fixity
_ LaTeX
op, CAS' Void (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX)
rc₀) = forall a. [a] -> a
last [(Infix LaTeX,
  CAS' Void (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX))]
rcs
contentsWithAlignAnchor (Operator (Infix Fixity
_ LaTeX
op) CAS' Void (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX)
lc CAS' Void (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX)
rc)
    = forall σ l.
(LaTeXC l, SymbolClass σ, SCConstraint σ LaTeX) =>
CAS (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX) -> l
toMathLaTeX' CAS' Void (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX)
lc forall a. Semigroup a => a -> a -> a
<> forall l. LaTeXC l => LaTeX -> l
fromLaTeX LaTeX
op forall a. Semigroup a => a -> a -> a
<> forall l. LaTeXC l => Text -> l
rawText
"\\:"forall l. LaTeXC l => l -> l -> l
LaTeX.&forall σ l.
(LaTeXC l, SymbolClass σ, SCConstraint σ LaTeX) =>
CAS (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX) -> l
toMathLaTeX' CAS' Void (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX)
rc
contentsWithAlignAnchor CAS' Void (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX)
q = forall l. LaTeXC l => Text -> l
rawText
"\\:" forall l. LaTeXC l => l -> l -> l
LaTeX.& forall σ l.
(LaTeXC l, SymbolClass σ, SCConstraint σ LaTeX) =>
CAS (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX) -> l
toMathLaTeX' CAS' Void (Infix LaTeX) (Encapsulation LaTeX) (SymbolD σ LaTeX)
q