GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
############ here we provide some text themes to display the text ############ versions of GAPDoc manuals GAPDoc2TextProcs.OtherThemes := rec(); # components must be pairs of strings, but as abbreviations we allow # - a string a starting with TextAttr.CSI for [a, TextAttr.reset] # - another string a for [a, a] GAPDoc2TextProcs.OtherThemes.default := rec( info := "the default theme", reset := TextAttr.reset, Heading := Concatenation(TextAttr.normal, TextAttr.underscore), Func := Concatenation(TextAttr.normal, TextAttr.4), Arg := Concatenation(TextAttr.normal, TextAttr.2), Example := Concatenation(TextAttr.normal, TextAttr.0), Package := TextAttr.bold, Returns := TextAttr.normal, URL := TextAttr.6, Mark := Concatenation(TextAttr.bold, TextAttr.5), K := Concatenation(TextAttr.normal, TextAttr.1), C := Concatenation(TextAttr.normal, TextAttr.1), F := Concatenation(TextAttr.normal, TextAttr.6), B := ["<", ">"], Emph := Concatenation(TextAttr.bold, ""), Ref := TextAttr.6, BibReset := TextAttr.reset, BibAuthor := Concatenation(TextAttr.bold, TextAttr.1), BibTitle := TextAttr.4, BibJournal := ["",""], BibVolume := TextAttr.4, BibLabel := TextAttr.5, Q := ["\"","\""], M := ["",""], Math := ["$","$"], Display := ["",""], Prompt := Concatenation(TextAttr.bold,TextAttr.4), BrkPrompt := Concatenation(TextAttr.bold,TextAttr.1), GAPInput := TextAttr.1, GAPOutput := TextAttr.reset, DefLineMarker := "\342\200\243 ", # must be two visible characters long ListBullet := " \342\200\242", # must be together two visible characters long EnumMarks := [" ","."], FillString := "\342\224\200\342\224\200\342\224\200", format := "", flush := "both", ); GAPDoc2TextProcs.OtherThemes.classic := rec( info := "similar to GAPDoc default until GAP 4.4", reset := TextAttr.reset, Heading := Concatenation(TextAttr.bold, TextAttr.underscore, TextAttr.1), Func := Concatenation(TextAttr.bold, TextAttr.4), Arg := Concatenation(TextAttr.normal, TextAttr.4), Example := Concatenation(TextAttr.normal, TextAttr.5), Package := TextAttr.bold, Returns := TextAttr.bold, URL := TextAttr.4, Mark := Concatenation(TextAttr.bold, TextAttr.5), K := Concatenation(TextAttr.normal, TextAttr.2), C := Concatenation(TextAttr.normal, TextAttr.2), F := Concatenation(TextAttr.bold, ""), B := Concatenation(TextAttr.bold, TextAttr.b6), Emph := Concatenation(TextAttr.normal, TextAttr.6), Ref := TextAttr.bold, BibReset := TextAttr.reset, BibAuthor := Concatenation(TextAttr.bold, TextAttr.1), BibTitle := TextAttr.4, BibJournal := ["",""], BibVolume := TextAttr.4, BibLabel := TextAttr.5, Q := ["\"","\""], M := ["",""], Math := ["$","$"], Display := ["",""], Prompt := Concatenation(TextAttr.bold,TextAttr.4), BrkPrompt := Concatenation(TextAttr.bold,TextAttr.1), GAPInput := TextAttr.1, GAPOutput := TextAttr.reset, DefLineMarker := "> ", # must be two visible characters long ListBullet := "--", # must be together two visible characters long EnumMarks := [" ","."], FillString := "------", format := "", flush := "both", ); GAPDoc2TextProcs.OtherThemes.old := rec( info := "similar to old style manuals in GAP 3 and GAP 4.4", reset := "", Heading := ["",""], Func := ["`","'"], Arg := ["<", ">"], Example := ["",""], Package := ["",""], Returns := ["",""], URL := ["<",">"], Mark := ["",""], K := ["`","'"], C := ["`","'"], F := ["`","'"], B := ["",""], Q := ["\"","\""], Emph := ["*","*"], Ref := ["\"","\""], BibReset := "", BibAuthor := ["",""], BibTitle := ["",""], BibJournal := ["",""], BibVolume := ["",""], BibLabel := ["",""], M := ["$", "$"], Math := ["$", "$"], Display := ["$$","$$"], Prompt := "", BrkPrompt := "", GAPInput := "", GAPOutput := "", DefLineMarker := "> ", # must be two visible characters long ListBullet := " -", # must be together two visible characters long EnumMarks := [" ","."], FillString := "---", format := "", flush := "both" ); GAPDoc2TextProcs.OtherThemes.equalquotes := rec( info := "(together with \"old\") uses '...' instead of `...'", C := "'", F := "'", K := "'", Func := "'" ); GAPDoc2TextProcs.OtherThemes.none := rec(); GAPDoc2TextProcs.f := function() local dt, a; dt := GAPDoc2TextProcs.OtherThemes.default; # most empty, some copied from default for a in RecNames(dt) do GAPDoc2TextProcs.OtherThemes.none.(a) := ""; od; for a in ["Q", "DefLineMarker", "ListBullet", "FillString", "EnumMarks"] do GAPDoc2TextProcs.OtherThemes.none.(a) := dt.(a); od; GAPDoc2TextProcs.OtherThemes.none.info := "plain text without markup"; end; GAPDoc2TextProcs.f(); Unbind(GAPDoc2TextProcs.f); GAPDoc2TextProcs.OtherThemes.ColorPrompt := rec( info := "show examples in ColorPrompt(true) style (default)", Prompt := Concatenation(TextAttr.bold,TextAttr.4), BrkPrompt := Concatenation(TextAttr.bold,TextAttr.1), GAPInput := TextAttr.1, GAPOutput := TextAttr.reset ); GAPDoc2TextProcs.OtherThemes.noColorPrompt := rec( info := "show examples in ColorPrompt(false) style", Prompt := "", BrkPrompt := "", GAPInput := "", GAPOutput := "" ); GAPDoc2TextProcs.OtherThemes.justify := rec( info := "left-right justify paragraphs (default)", flush := "left", ); GAPDoc2TextProcs.OtherThemes.raggedright := rec( info := "do not left-right justify paragraphs", flush := "left", ); InstallValue(GAPDocTextTheme, rec()); # this is only relevant for HPCGAP, record is used by the handler functions # in the GAP help system if IsBound(HPCGAP) then LockAndMigrateObj(GAPDocTextTheme, HELP_REGION); fi; # argument doesn't need all component, the missing ones are taken from default InstallGlobalFunction(SetGAPDocTextTheme, function(arg) local r, res, h, af, v, a, nam, f, i; r := rec(); for a in arg do if IsString(a) then if not IsBound(GAPDoc2TextProcs.OtherThemes.(a)) then Print("Only the following named text themes are available \ (choose one or several):\n"); for nam in RecNames(GAPDoc2TextProcs.OtherThemes) do Print(" ",String(Concatenation("\"",nam,"\""), -25), GAPDoc2TextProcs.OtherThemes.(nam).info, "\n"); od; return; else for f in RecNames(GAPDoc2TextProcs.OtherThemes.(a)) do r.(f) := GAPDoc2TextProcs.OtherThemes.(a).(f); od; fi; else for f in RecNames(a) do r.(f) := a.(f); od; fi; od; res := rec(hash := [[], []]); h := res.hash; af := GAPDoc2TextProcs.TextAttrFields; for i in [1..Length(af)] do if IsBound(r.(af[i])) then v := r.(af[i]); else v := GAPDoc2TextProcs.OtherThemes.default.(af[i]); fi; if IsString(v) then Add(h[1], Concatenation(String(i-1), "X")); Add(h[2], v); Add(h[1], Concatenation(String(100+i-1), "X")); if Length(v) > 1 and v{[1,2]} = TextAttr.CSI then Add(h[2], TextAttr.reset); else Add(h[2], v); fi; else Add(h[1], Concatenation(String(i-1), "X")); Add(h[2], v[1]); Add(h[1], Concatenation(String(100+i-1), "X")); Add(h[2], v[2]); fi; res.(af[i]) := [[h[1][2*i-1], h[1][2*i]],[h[2][2*i-1], h[2][2*i]]]; od; SortParallel(h[1], h[2]); if IsBoundGlobal("HPCGAP") then # in HPCGAP `GAPDocTextTheme` and its entries must be visible to # all threads atomic HELP_REGION do for f in RecNames(res) do GAPDocTextTheme.(f) := CopyToRegion(res.(f), HELP_REGION); od; od; else for f in RecNames(res) do GAPDocTextTheme.(f) := res.(f); od; fi; end); SetGAPDocTextTheme(rec());