package tex
import "github.com/d2lang/mathjax-go/internal/mml"
type braketItem struct {
stretchy, single bool
barcount, barmax int
open, close string
singleFence *mml .Node
}
func (p *parser ) braket (name string ) ([]*mml .Node , error ) {
p .skipNextSpaces ()
if p .pos == len (p .source ) {
return nil , texError ("MissingArgFor" , "Missing argument for %s" , "\\" +name )
}
item := &braketItem {stretchy : name != "set" , single : true , barmax : -1 }
open , close := "⟨" , "⟩"
if name == "Set" || name == "set" {
open , close = "{" , "}"
item .barmax = 1
}
item .open , item .close = open , close
terminator := byte (0 )
if p .source [p .pos ] == '{' {
p .pos ++
item .single = false
terminator = '}'
}
previous , cdArrayEntry , environmentRow , ordinaryArray := p .braketOwner , p .cdArrayEntry , p .environmentRow , p .ordinaryArray
p .environmentRow , p .ordinaryArray = nil , nil
p .braketOwner = item
if !item .single {
p .cdArrayEntry = false
}
defer func () {
p .braketOwner , p .cdArrayEntry , p .environmentRow , p .ordinaryArray = previous , cdArrayEntry , environmentRow , ordinaryArray
}()
children , _ , err := p .parseRowWithInfix (terminator , false , false )
if err != nil {
return nil , err
}
popped := p .environmentPopped
if popped {
p .environmentPopped = false
}
if item .single && p .pendingCell != nil {
p .pendingCell .envSaved = false
}
var tail []*mml .Node
if item .single && len (children ) > 1 {
tail = children [1 :]
children = children [:1 ]
}
result := item .singleFence
if result == nil {
result = p .leftRightFenced (open , row (children , true ), close , item .stretchy )
}
if popped {
if err := mathtoolsSpreadPop (result , nil ); err != nil {
return nil , err
}
}
return append ([]*mml .Node {result }, tail ...), nil
}
func (p *parser ) braketBar () []*mml .Node {
owner := p .braketOwner
if owner == nil || owner .barmax >= 0 && owner .barcount >= owner .barmax {
return []*mml .Node {p .operator ("∥" , mml .TeXClassOrd , map [string ]any {"stretchy" : false })}
}
if !owner .stretchy {
return []*mml .Node {setAttributes (p .token ("mo" , "∥" ), map [string ]any {"stretchy" : false , "braketbar" : true })}
}
closing := texAtom (row (nil , true ), mml .TeXClassClose )
if owner .single {
owner .singleFence = p .leftRightFenced (owner .open , closing , owner .close , true )
p .braketOwner = nil
}
owner .barcount ++
bar := setAttributes (p .token ("mo" , "∥" ), map [string ]any {"stretchy" : true , "braketbar" : true })
return []*mml .Node {closing , bar , texAtom (row (nil , true ), mml .TeXClassOpen )}
}
The pages are generated with Golds v0.8.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .