diff options
103 files changed, 4077 insertions, 1884 deletions
diff --git a/context/data/scite/context/lexers/data/scite-context-data-metapost.lua b/context/data/scite/context/lexers/data/scite-context-data-metapost.lua index 06e247c39..f3ace2b6a 100644 --- a/context/data/scite/context/lexers/data/scite-context-data-metapost.lua +++ b/context/data/scite/context/lexers/data/scite-context-data-metapost.lua @@ -3,7 +3,7 @@ return { ["disabled"]={ "verbatimtex", "troffmode" }, ["internals"]={ "mitered", "rounded", "beveled", "butt", "squared", "eps", "epsilon", "infinity", "bboxmargin", "ahlength", "ahangle", "labeloffset", "dotlabeldiam", "defaultpen", "defaultscale", "join_radius", "charscale", "pen_lft", "pen_rt", "pen_top", "pen_bot" }, ["metafont"]={ "autorounding", "beginchar", "blacker", "boundarychar", "capsule_def", "capsule_end", "change_width", "chardp", "chardx", "chardy", "charexists", "charext", "charht", "charic", "charlist", "charwd", "cull", "cullit", "currenttransform", "currentwindow", "define_blacker_pixels", "define_corrected_pixels", "define_good_x_pixels", "define_good_y_pixels", "define_horizontal_corrected_pixels", "define_pixels", "define_whole_blacker_pixels", "define_whole_pixels", "define_whole_vertical_blacker_pixels", "define_whole_vertical_pixels", "designsize", "display", "displaying", "endchar", "extensible", "extra_beginchar", "extra_endchar", "extra_setup", "fillin", "font_coding_scheme", "font_extra_space", "font_identifier", "font_normal_shrink", "font_normal_space", "font_normal_stretch", "font_quad", "font_size", "font_slant", "font_x_height", "fontdimen", "fontmaking", "gfcorners", "granularity", "grayfont", "headerbyte", "hppp", "hround", "imagerules", "italcorr", "kern", "labelfont", "ligtable", "lowres_fix", "makebox", "makegrid", "maketicks", "mode_def", "mode_setup", "nodisplays", "notransforms", "numspecial", "o_correction", "openit", "openwindow", "pixels_per_inch", "proofing", "proofoffset", "proofrule", "proofrulethickness", "rulepen", "screenchars", "screenrule", "screenstrokes", "screen_cols", "screen_rows", "showit", "slantfont", "smode", "smoothing", "titlefont", "totalweight", "tracingedges", "tracingpens", "turningcheck", "unitpixel", "vppp", "vround", "xoffset", "yoffset" }, - ["primitives"]={ "charcode", "day", "linecap", "linejoin", "miterlimit", "month", "pausing", "prologues", "showstopping", "time", "tracingcapsules", "tracingchoices", "mpprocset", "tracingcommands", "tracingequations", "tracinglostchars", "tracingmacros", "tracingonline", "tracingoutput", "tracingrestores", "tracingspecs", "tracingstats", "tracingtitles", "truecorners", "warningcheck", "year", "false", "nullpicture", "pencircle", "true", "and", "angle", "arclength", "arctime", "ASCII", "boolean", "bot", "char", "color", "cosd", "cycle", "decimal", "directiontime", "floor", "fontsize", "hex", "infont", "intersectiontimes", "known", "length", "llcorner", "lrcorner", "makepath", "makepen", "mexp", "mlog", "normaldeviate", "not", "numeric", "oct", "odd", "or", "path", "pair", "pen", "penoffset", "picture", "point", "postcontrol", "precontrol", "reverse", "rotated", "scaled", "shifted", "sind", "slanted", "sqrt", "str", "string", "subpath", "substring", "transform", "transformed", "ulcorner", "uniformdeviate", "unknown", "urcorner", "xpart", "xscaled", "xxpart", "xypart", "ypart", "yscaled", "yxpart", "yypart", "zscaled", "addto", "clip", "input", "interim", "let", "newinternal", "save", "setbounds", "shipout", "show", "showdependencies", "showtoken", "showvariable", "special", "begingroup", "endgroup", "of", "curl", "tension", "and", "controls", "interpath", "on", "off", "def", "vardef", "enddef", "expr", "suffix", "text", "primary", "secondary", "tertiary", "primarydef", "secondarydef", "tertiarydef", "randomseed", "also", "contour", "doublepath", "withcolor", "withcmykcolor", "withpen", "dashed", "if", "else", "elseif", "fi", "for", "endfor", "forever", "exitif", "within", "forsuffixes", "step", "until", "charlist", "extensible", "fontdimen", "headerbyte", "kern", "ligtable", "boundarychar", "chardp", "charext", "charht", "charic", "charwd", "designsize", "fontmaking", "charexists", "cullit", "currenttransform", "gfcorners", "grayfont", "hround", "imagerules", "lowres_fix", "nodisplays", "notransforms", "openit", "displaying", "currentwindow", "screen_rows", "screen_cols", "pixels_per_inch", "cull", "display", "openwindow", "numspecial", "totalweight", "autorounding", "fillin", "proofing", "tracingpens", "xoffset", "chardx", "granularity", "smoothing", "turningcheck", "yoffset", "chardy", "hppp", "tracingedges", "vppp", "extra_beginfig", "extra_endfig", "mpxbreak", "endinput", "message", "delimiters", "turningnumber", "errmessage", "readstring", "scantokens", "end", "outer", "inner", "write", "to", "readfrom", "withprescript", "withpostscript", "top", "bot", "lft", "rt", "ulft", "urt", "llft", "lrt", "redpart", "greenpart", "bluepart", "cyanpart", "magentapart", "yellowpart", "blackpart", "prescriptpart", "postscriptpart", "rgbcolor", "cmykcolor", "colormodel", "graypart", "greypart", "greycolor", "graycolor", "dashpart", "penpart", "stroked", "filled", "textual", "clipped", "bounded", "pathpart", "expandafter", "minute", "hour", "outputformat", "outputtemplate", "filenametemplate", "fontmapfile", "fontmapline", "fontpart", "fontsize", "glyph", "restoreclipcolor", "troffmode", "runscript" }, + ["primitives"]={ "charcode", "day", "linecap", "linejoin", "miterlimit", "month", "pausing", "prologues", "showstopping", "time", "tracingcapsules", "tracingchoices", "mpprocset", "tracingcommands", "tracingequations", "tracinglostchars", "tracingmacros", "tracingonline", "tracingoutput", "tracingrestores", "tracingspecs", "tracingstats", "tracingtitles", "truecorners", "warningcheck", "year", "false", "nullpicture", "pencircle", "true", "and", "angle", "arclength", "arctime", "ASCII", "boolean", "bot", "char", "color", "cosd", "cycle", "decimal", "directiontime", "floor", "fontsize", "hex", "infont", "intersectiontimes", "known", "length", "llcorner", "lrcorner", "makepath", "makepen", "mexp", "mlog", "normaldeviate", "not", "numeric", "oct", "odd", "or", "path", "pair", "pen", "penoffset", "picture", "point", "postcontrol", "precontrol", "reverse", "rotated", "scaled", "shifted", "sind", "slanted", "sqrt", "str", "string", "subpath", "substring", "transform", "transformed", "ulcorner", "uniformdeviate", "unknown", "urcorner", "xpart", "xscaled", "xxpart", "xypart", "ypart", "yscaled", "yxpart", "yypart", "zscaled", "addto", "clip", "input", "interim", "let", "newinternal", "save", "setbounds", "shipout", "show", "showdependencies", "showtoken", "showvariable", "special", "begingroup", "endgroup", "of", "curl", "tension", "and", "controls", "interpath", "on", "off", "def", "vardef", "enddef", "expr", "suffix", "text", "primary", "secondary", "tertiary", "primarydef", "secondarydef", "tertiarydef", "randomseed", "also", "contour", "doublepath", "withcolor", "withcmykcolor", "withpen", "dashed", "if", "else", "elseif", "fi", "for", "endfor", "forever", "exitif", "within", "forsuffixes", "step", "until", "charlist", "extensible", "fontdimen", "headerbyte", "kern", "ligtable", "boundarychar", "chardp", "charext", "charht", "charic", "charwd", "designsize", "fontmaking", "charexists", "cullit", "currenttransform", "gfcorners", "grayfont", "hround", "imagerules", "lowres_fix", "nodisplays", "notransforms", "openit", "displaying", "currentwindow", "screen_rows", "screen_cols", "pixels_per_inch", "cull", "display", "openwindow", "numspecial", "totalweight", "autorounding", "fillin", "proofing", "tracingpens", "xoffset", "chardx", "granularity", "smoothing", "turningcheck", "yoffset", "chardy", "hppp", "tracingedges", "vppp", "extra_beginfig", "extra_endfig", "mpxbreak", "endinput", "message", "delimiters", "turningnumber", "errmessage", "readstring", "scantokens", "end", "outer", "inner", "write", "to", "readfrom", "withprescript", "withpostscript", "top", "bot", "lft", "rt", "ulft", "urt", "llft", "lrt", "redpart", "greenpart", "bluepart", "cyanpart", "magentapart", "yellowpart", "blackpart", "prescriptpart", "postscriptpart", "rgbcolor", "cmykcolor", "colormodel", "graypart", "greypart", "greycolor", "graycolor", "dashpart", "penpart", "stroked", "filled", "textual", "clipped", "bounded", "pathpart", "expandafter", "minute", "hour", "outputformat", "outputtemplate", "filenametemplate", "fontmapfile", "fontmapline", "fontpart", "fontsize", "glyph", "restoreclipcolor", "troffmode", "runscript", "maketext" }, ["shortcuts"]={ "..", "...", "--", "---", "&", "\\" }, ["tex"]={ "btex", "etex", "verbatimtex" }, }
\ No newline at end of file diff --git a/context/data/scite/context/lexers/scite-context-lexer-tex.lua b/context/data/scite/context/lexers/scite-context-lexer-tex.lua index 0099b968a..a34d3842a 100644 --- a/context/data/scite/context/lexers/scite-context-lexer-tex.lua +++ b/context/data/scite/context/lexers/scite-context-lexer-tex.lua @@ -410,6 +410,8 @@ local stoplua = P("\\stop") * Cmt(luaenvironment,stopdisplaylua) local startluacode = token("embedded", startlua) local stopluacode = #stoplua * token("embedded", stoplua) +local luacall = P("clf_") * R("az","__","AZ")^1 + local metafuncall = ( P("reusable") + P("usable") + P("unique") + P("use") + P("reuse") ) * ("MPgraphic") + P("uniqueMPpagegraphic") + P("MPpositiongraphic") @@ -430,6 +432,7 @@ local startmetafuncode = token("embedded", startmetafun) * metafunargument local stopmetafuncode = token("embedded", stopmetafun) local callers = token("embedded", P("\\") * metafuncall) * metafunarguments + + token("embedded", P("\\") * luacall) lexer.embed_lexer(contextlexer, cldlexer, startluacode, stopluacode) lexer.embed_lexer(contextlexer, mpslexer, startmetafuncode, stopmetafuncode) diff --git a/context/data/scite/context/scite-context-data-metapost.properties b/context/data/scite/context/scite-context-data-metapost.properties index db91621b1..59014623a 100644 --- a/context/data/scite/context/scite-context-data-metapost.properties +++ b/context/data/scite/context/scite-context-data-metapost.properties @@ -116,7 +116,7 @@ penpart stroked filled textual clipped \ bounded pathpart expandafter minute hour \ outputformat outputtemplate filenametemplate fontmapfile fontmapline \ fontpart fontsize glyph restoreclipcolor troffmode \ -runscript +runscript maketext keywordclass.metapost.shortcuts=\ .. ... -- --- \ diff --git a/doc/context/documents/general/manuals/epub-mkiv-demo.epub b/doc/context/documents/general/manuals/epub-mkiv-demo.epub Binary files differnew file mode 100644 index 000000000..c813e4e79 --- /dev/null +++ b/doc/context/documents/general/manuals/epub-mkiv-demo.epub diff --git a/doc/context/documents/general/manuals/epub-mkiv-demo.pdf b/doc/context/documents/general/manuals/epub-mkiv-demo.pdf Binary files differnew file mode 100644 index 000000000..2382d188c --- /dev/null +++ b/doc/context/documents/general/manuals/epub-mkiv-demo.pdf diff --git a/doc/context/documents/general/manuals/epub-mkiv.pdf b/doc/context/documents/general/manuals/epub-mkiv.pdf Binary files differnew file mode 100644 index 000000000..44cafcd27 --- /dev/null +++ b/doc/context/documents/general/manuals/epub-mkiv.pdf diff --git a/doc/context/documents/general/manuals/tiptrick.pdf b/doc/context/documents/general/manuals/tiptrick.pdf Binary files differindex edfa6f0ad..5332e70ec 100644 --- a/doc/context/documents/general/manuals/tiptrick.pdf +++ b/doc/context/documents/general/manuals/tiptrick.pdf diff --git a/doc/context/documents/general/manuals/workflows-mkiv.pdf b/doc/context/documents/general/manuals/workflows-mkiv.pdf Binary files differindex 7cdd669cc..828fb86cb 100644 --- a/doc/context/documents/general/manuals/workflows-mkiv.pdf +++ b/doc/context/documents/general/manuals/workflows-mkiv.pdf diff --git a/doc/context/scripts/mkii/texmfstart.html b/doc/context/scripts/mkii/texmfstart.html index 70de410df..ed149a0d0 100644 --- a/doc/context/scripts/mkii/texmfstart.html +++ b/doc/context/scripts/mkii/texmfstart.html @@ -40,6 +40,7 @@ <tr><th style="width: 10em">flag</th><th style="width: 8em">value</th><th>description</th></tr> <tr><th/><td/><td/></tr> <tr><th>--script</th><td></td><td>run an mtx script (lua prefered method) (--noquotes), no script gives list</td></tr> + <tr><th>--evaluate</th><td></td><td>run code passed on the commandline (between quotes)</td></tr> <tr><th>--execute</th><td></td><td>run a script or program (texmfstart method) (--noquotes)</td></tr> <tr><th>--resolve</th><td></td><td>resolve prefixed arguments</td></tr> <tr><th>--ctxlua</th><td></td><td>run internally (using preloaded libs)</td></tr> diff --git a/doc/context/scripts/mkii/texmfstart.man b/doc/context/scripts/mkii/texmfstart.man index 643d8b1c9..8a3a75b64 100644 --- a/doc/context/scripts/mkii/texmfstart.man +++ b/doc/context/scripts/mkii/texmfstart.man @@ -14,6 +14,9 @@ .B --script run an mtx script (lua prefered method) (--noquotes), no script gives list .TP +.B --evaluate +run code passed on the commandline (between quotes) +.TP .B --execute run a script or program (texmfstart method) (--noquotes) .TP diff --git a/doc/context/scripts/mkii/texmfstart.xml b/doc/context/scripts/mkii/texmfstart.xml index c19484d9d..c7e719541 100644 --- a/doc/context/scripts/mkii/texmfstart.xml +++ b/doc/context/scripts/mkii/texmfstart.xml @@ -8,6 +8,7 @@ <category name="basic"> <subcategory> <flag name="script"><short>run an mtx script (lua prefered method) (<ref name="noquotes"/>), no script gives list</short></flag> + <flag name="evaluate"><short>run code passed on the commandline (between quotes)</short></flag> <flag name="execute"><short>run a script or program (texmfstart method) (<ref name="noquotes"/>)</short></flag> <flag name="resolve"><short>resolve prefixed arguments</short></flag> <flag name="ctxlua"><short>run internally (using preloaded libs)</short></flag> diff --git a/doc/context/scripts/mkiv/mtx-bibtex.html b/doc/context/scripts/mkiv/mtx-bibtex.html deleted file mode 100644 index 61a679716..000000000 --- a/doc/context/scripts/mkiv/mtx-bibtex.html +++ /dev/null @@ -1,55 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> - -<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> - -<!-- compare with lmx framework variant --> - -<!-- - filename : context-base.xml - comment : companion to mtx-server-ctx-startup.tex - author : Hans Hagen, PRAGMA-ADE, Hasselt NL - copyright: PRAGMA ADE / ConTeXt Development Team - license : see context related readme files ---> - -<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> - <head> - <title>bibtex helpers</title> - <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> - <style type="text/css"> - body { color: #FFFFFF; background-color: #808080; font-family: optima, verdana, futura, "lucida sans", arial, geneva, helvetica, sans; font-size: 12px; line-height: 18px; } a:link, a:active, a:visited { color: #FFFFFF; } a.dir-view:link, a.dir-view:active, a.dir-view:visited { color: #FFFFFF; text-decoration: underline; } .valid { color: #00FF00; } .invalid { color: #FF0000; } button, .commonlink, .smallbutton { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; border-color: #7F7F7F; border-style: solid; border-width: .125ex; background-color: #FFFFFF; padding: .5ex; } .smallbutton { width: 1em; } a.commonlink:link, a.commonlink:active, a.commonlink:visited, a.smalllink:link, a.smalllink:active, a.smalllink:visited { font-weight: bold; font-size: 12px; text-decoration: none; color: #000000; } h1, .title { font-style: normal; font-weight: normal; font-size: 18px; line-height: 18px; margin-bottom: 20px; } h2, .subtitle { font-style: normal; font-weight: normal; font-size: 12px; margin-top: 18px; margin-bottom: 18px; } table { line-height: 18px; font-size: 12px; margin: 0; } th { font-weight: bold; text-align: left; padding-bottom: 6px; } .tc { font-weight: bold; text-align: left; } p, li { max-width: 60em; } .empty-line { margin-top: 4px; } .more-room { margin-right: 1.5em; } .much-more-room { margin-right: 3em; } #main { position: absolute; left: 10%; top: 10%; right: 10%; bottom: 10%; z-index: 2; width: 80%; height: 80%; padding: 0%; margin: 0%; overflow: auto; border-style: none; border-width: 0; background-color: #3F3F3F; } #main-settings { margin: 12px; x_max-width: 60em; line-height: 18px; font-size: 12px; } #left { position: absolute; top : 10%; left: 0%; bottom: 0%; right: 90%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; } #right { position: absolute; top : 0%; left: 90%; bottom: 10%; right: 0%; z-index: 1; width: 10%; height: 90%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #4F6F6F; _margin-left: -15px; } #bottom { position: absolute; left: 10%; right: 0%; top: 90%; bottom: 0%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top { position: absolute; left: 0%; right: 10%; top: 0%; bottom: 90%; z-index: 1; width: 90%; height: 10%; padding: 0%; margin: 0%; font-size: 16px; border-style: none; border-width: 0; background-color: #6F6F8F; } #top-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #top-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: right; vertical-align: middle; } #bottom-one { position: absolute; bottom: 50%; width: 100%; buggedheight: 100%; } #bottom-two { position: relative; margin-bottom: -9px; margin-left: 12px; margin-right: 12px; line-height: 18px; text-align: left; vertical-align: middle; } #left-one { position: absolute; width: 100%; buggedheight: 100%; } #left-two { position: relative; margin-top: 12px; line-height: 18px; text-align: center; vertical-align: top; } #right-one { display: table; height: 100%; width: 100%; } #right-two { display: table-row; height: 100%; width: 100%; } #right-three { display: table-cell; width: 100%; vertical-align: bottom; _position: absolute; _top: 100%; } #right-four { text-align: center; margin-bottom: 2ex; _position: relative; _top: -100%; } #more-top { position: absolute; top: 0%; left: 90%; bottom: 90%; right: 0%; z-index: 3; width: 10%; height: 10%; padding: 0%; margin: 0%; border-style: none; border-width: 0; } #more-top-settings { text-align: center; } #more-right-settings { margin-right: 12px; margin-left: 12px; line-height: 18px; font-size: 10px; text-align: center; } #right-safari { _display: table; width: 100%; height: 100%; } - </style> - <style type="text/css"> - </style> - </head> - <body> - <div id="top"> <div id="top-one"> - <div id="top-two">bibtex helpers </div> - </div> - </div> - <div id="bottom"> <div id="bottom-one"> - <div id="bottom-two">wiki: http://contextgarden.net | mail: ntg-context@ntg.nl | website: http://www.pragma-ade.nl</div> - </div> - </div> - <div id="left"></div> - <div id="right"></div> - <div id="main"> - <div id='main-settings'> - <h1>Command line options</h1> -<table> - <tr><th style="width: 10em">flag</th><th style="width: 8em">value</th><th>description</th></tr> - <tr><th/><td/><td/></tr> - <tr><th>--toxml</th><td></td><td>convert bibtex database(s) to xml</td></tr> - <tr><th>--tolua</th><td></td><td>convert bibtex database(s) to lua</td></tr> - <tr><th>--search</th><td></td><td>seatch bibtex database(s)</td></tr> - </table> -<br/> -<h1>Example</h1> -<tt>mtxrun --script bibtex --tolua bibl-001.bib</tt> -<br/><tt>mtxrun --script bibtex --tolua --simple bibl-001.bib</tt> -<br/><tt>mtxrun --script bibtex --toxml bibl-001.bib bibl-002.bib bibl-003.bib biblio.xml</tt> -<br/><tt>mtxrun --script bibtex --search --list --pattern=match(author:foo) bar.bib</tt> -<br/><br/> </div> - </div> - </body> - </html> diff --git a/doc/context/scripts/mkiv/mtx-bibtex.man b/doc/context/scripts/mkiv/mtx-bibtex.man deleted file mode 100644 index ddd3cfbc5..000000000 --- a/doc/context/scripts/mkiv/mtx-bibtex.man +++ /dev/null @@ -1,33 +0,0 @@ -.TH "mtx-bibtex" "1" "01-01-2015" "version 1.00" "bibtex helpers" -.SH NAME -.B mtx-bibtex -.SH SYNOPSIS -.B mtxrun --script bibtex [ -.I OPTIONS ... -.B ] [ -.I FILENAMES -.B ] -.SH DESCRIPTION -.B bibtex helpers -.SH OPTIONS -.TP -.B --toxml -convert bibtex database(s) to xml -.TP -.B --tolua -convert bibtex database(s) to lua -.TP -.B --search -seatch bibtex database(s) -.SH AUTHOR -More information about ConTeXt and the tools that come with it can be found at: - - -.B "maillist:" -ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context - -.B "webpage:" -http://www.pragma-ade.nl / http://tex.aanhet.net - -.B "wiki:" -http://contextgarden.net diff --git a/doc/context/scripts/mkiv/mtx-bibtex.xml b/doc/context/scripts/mkiv/mtx-bibtex.xml deleted file mode 100644 index 5c28b946a..000000000 --- a/doc/context/scripts/mkiv/mtx-bibtex.xml +++ /dev/null @@ -1,28 +0,0 @@ -<?xml version="1.0"?> -<application> - <metadata> - <entry name="name">mtx-bibtex</entry> - <entry name="detail">bibtex helpers</entry> - <entry name="version">1.00</entry> - </metadata> - <flags> - <category name="basic"> - <subcategory> - <flag name="toxml"><short>convert bibtex database(s) to xml</short></flag> - <flag name="tolua"><short>convert bibtex database(s) to lua</short></flag> - <flag name="search"><short>seatch bibtex database(s)</short></flag> - </subcategory> - </category> - </flags> - <examples> - <category> - <title>Example</title> - <subcategory> - <example><command>mtxrun --script bibtex --tolua bibl-001.bib</command></example> - <example><command>mtxrun --script bibtex --tolua --simple bibl-001.bib</command></example> - <example><command>mtxrun --script bibtex --toxml bibl-001.bib bibl-002.bib bibl-003.bib biblio.xml</command></example> - <example><command>mtxrun --script bibtex --search --list --pattern=match(author:foo) bar.bib</command></example> - </subcategory> - </category> - </examples> -</application> diff --git a/doc/context/scripts/mkiv/mtxrun.html b/doc/context/scripts/mkiv/mtxrun.html index f1ec9a29d..6e4146899 100644 --- a/doc/context/scripts/mkiv/mtxrun.html +++ b/doc/context/scripts/mkiv/mtxrun.html @@ -40,6 +40,7 @@ <tr><th style="width: 10em">flag</th><th style="width: 8em">value</th><th>description</th></tr> <tr><th/><td/><td/></tr> <tr><th>--script</th><td></td><td>run an mtx script (lua prefered method) (--noquotes), no script gives list</td></tr> + <tr><th>--evaluate</th><td></td><td>run code passed on the commandline (between quotes)</td></tr> <tr><th>--execute</th><td></td><td>run a script or program (texmfstart method) (--noquotes)</td></tr> <tr><th>--resolve</th><td></td><td>resolve prefixed arguments</td></tr> <tr><th>--ctxlua</th><td></td><td>run internally (using preloaded libs)</td></tr> diff --git a/doc/context/scripts/mkiv/mtxrun.man b/doc/context/scripts/mkiv/mtxrun.man index 643d8b1c9..8a3a75b64 100644 --- a/doc/context/scripts/mkiv/mtxrun.man +++ b/doc/context/scripts/mkiv/mtxrun.man @@ -14,6 +14,9 @@ .B --script run an mtx script (lua prefered method) (--noquotes), no script gives list .TP +.B --evaluate +run code passed on the commandline (between quotes) +.TP .B --execute run a script or program (texmfstart method) (--noquotes) .TP diff --git a/doc/context/scripts/mkiv/mtxrun.xml b/doc/context/scripts/mkiv/mtxrun.xml index 01f2d1263..138afc96e 100644 --- a/doc/context/scripts/mkiv/mtxrun.xml +++ b/doc/context/scripts/mkiv/mtxrun.xml @@ -9,6 +9,7 @@ <category name="basic"> <subcategory> <flag name="script"><short>run an mtx script (lua prefered method) (<ref name="noquotes"/>), no script gives list</short></flag> + <flag name="evaluate"><short>run code passed on the commandline (between quotes)</short></flag> <flag name="execute"><short>run a script or program (texmfstart method) (<ref name="noquotes"/>)</short></flag> <flag name="resolve"><short>resolve prefixed arguments</short></flag> <flag name="ctxlua"><short>run internally (using preloaded libs)</short></flag> diff --git a/doc/context/sources/general/manuals/epub/epub-mkiv-demo.tex b/doc/context/sources/general/manuals/epub/epub-mkiv-demo.tex new file mode 100644 index 000000000..b4b979874 --- /dev/null +++ b/doc/context/sources/general/manuals/epub/epub-mkiv-demo.tex @@ -0,0 +1,43 @@ + +% \usemodule[luacalls] + +\usemodule[mathml] + +\setupexternalfigures + [location=default] + +\setupbackend + [export=yes] + +\setupexport + [svgstyle=mathtest-style, + hyphen=yes, + width=60em] + +\setupbodyfont[pagella] + +\definefloat[graphic][graphics][figure] + +% \environment [mathtest-style] + +\starttext + + \startsection[title=First] + + \startitemize + \startitem one \stopitem + \startitem two \stopitem + \stopitemize + + \startplacefigure[title=First] + \externalfigure[cow.pdf] + \stopplacefigure + + \startplacegraphic[title=Second] + \externalfigure[cow.pdf] + \stopplacegraphic + + some math: \m{e=mc^2} + + \stopsection +\stoptext diff --git a/doc/context/sources/general/manuals/epub/epub-mkiv.tex b/doc/context/sources/general/manuals/epub/epub-mkiv.tex new file mode 100644 index 000000000..cea7d592b --- /dev/null +++ b/doc/context/sources/general/manuals/epub/epub-mkiv.tex @@ -0,0 +1,463 @@ +% language=uk + +% todo: +% +% metadata +% properties +% \dontleavehmode before hbox +% cover page +% +% http://www.cnet.com/news/google-subtracts-mathml-from-chrome-and-anger-multiplies/ + +% \usemodule[luacalls] + +\usemodule[art-01,abr-02] + +\definehighlight[notabene][style=bold] + +\definecolor[darkorange] [.70(green,red)] +\definecolor[lightorange][.45(orange,white)] +\definecolor[lesswhite] [.90(white)] + +\setuptyping[color=darkorange] +\setuptype [color=darkorange] + +\starttext + +\startMPpage + +numeric w ; w := 21cm ; +numeric h ; h := 29.7cm ; +numeric ww ; ww := 9w/10 ; +numeric oo ; oo := (w-ww) / 2 ; +numeric hh ; hh := h/5.5 ; +path p ; p := unitsquare xysized(w,h) ; + +color orange ; orange := \MPcolor{darkorange} ; % .7[green,red] ; + +fill p enlarged 2mm withcolor orange ; + +draw image ( + draw anchored.top( + textext("\ttbf\setupinterlinespace[line=1.7ex]\framed[frame=off,align=middle,offset=0mm]{\smash{<div/>}\\\smash{<div >}\\\smash{</div>}}") + xsized w, + center topboundary p shifted (0,-12mm)) withcolor \MPcolor{lightorange} ; % 0.45[white,orange] ; + draw anchored.bot( + textext("\ssbf\setupinterlinespace[line=2.2ex]\framed[frame=off,align=middle]{exporting\\xml and epub\\from context}") + xsized w, + center bottomboundary p shifted (0,4mm)) withcolor \MPcolor {lesswhite} ; % 0.90white ; +) ; + +setbounds currentpicture to p ; + +\stopMPpage + +\startsection[title=Introduction] + +There is a pretty long tradition of typesetting math with \TEX\ and it looks like +this program will dominate for many more years. Even if we move to the web, the +simple fact that support for \MATHML\ in some browsers is subtoptimal will drive +those who want a quality document to use \PDF\ instead. + +I'm writing this in 2014, at a time that \XML\ is widespread. The idea of \XML\ is +that you code your data in a very structured way, so that it can be manipulated and +(if needed) validated. Text has always been a target for \XML\ which is a follow|-|up +to \SGML\ that was in use by publishers. Because \HTML\ is less structured (and also +quite tolerant with respect to end tags) we prefer to use \XHTML\ but unfortunately +support for that is less widespread. + +Interesting is that documents are probably among the more complex targets of the +\XML\ format. The reason is that unless the author restricts him|/|herself or +gets restricted by the publisher, tag|-|abuse can happen. At \PRAGMA\ we mostly +deal with education related \XML\ and it's not always easy to come up with +something that suits the specific needs of the educational concept behind a +school method. Even if we start out nice and clean, eventually we end up with a +poluted source, often with additonal structure needed to satisfy the tools used +for conversion. + +We have been supporting \XML\ from the day it showed up and most of our projects +involve \XML\ in one way or the other. That doesn't mean that we don't use \TEX\ +for coding documents. This manual is for instance a regular \TEX\ document. In +many ways a structured \TEX\ document is much more convenient to edit, especially +if one wants to add a personal touch and do some local makeup. On the other hand, +diverting from standard structure commands makes the document less suitable for +other output than \PDF. There is simply no final solution for coding your document, +it's mostly a matter of taste. + +So we have a dilemma: if we want to have multiple output, frozen \PDF\ as well as +less controlled \HTML\ output, we can best code in \XML, but when we want to code +comfortably we'd like to use \TEX. There are other ways, like markdown, that can +be converted to intermediate formats like \TEX, but that is only suitable for +simple documents: the more advanced documents get, the more one has to escape +from the boundaries of (any) document encoding, and then often \TEX\ is not a bad +choice. There is a good reason why \TEX\ survived for so long. + +It is for this reason that in \CONTEXT\ \MKIV\ we can export the content in a +reasonable structured way to \XML. Of course we assume a structured document. It +started out as an experiment because it was relatively easy to implement, and it +is now an integral component. + +\stopsection + +\startsection[title=The output] + +The regular output is an \XML\ file but as we have some more related data it gets +organized in a tree. We also export a few variants. An example is given below: + +\starttyping +./test-export +./test-export/images +./test-export/images/... +./test-export/styles +./test-export/styles/test-defaults.css +./test-export/styles/test-images.css +./test-export/styles/test-styles.css +./test-export/styles/test-templates.css +./test-export/test-raw.xml +./test-export/test-raw.lua +./test-export/test-tag.xhtml +./test-export/test-div.xhtml +\stoptyping + +Say that we have this input: + +\starttyping +\setupbackend + [export=yes] + +\starttext + \startsection[title=First] + \startitemize + \startitem one \stopitem + \startitem two \stopitem + \stopitemize + \stopsection +\stoptext +\stoptyping + +The main export ends up in the \type {test-raw.xml} export file and looks as +follows (we leave out the preamble and style references): + +\starttyping +<document> <!-- with some attributes --> + <section detail="section" chain="section" level="3"> + <sectionnumber>1</sectionnumber> + <sectiontitle>First</sectiontitle> + <sectioncontent> + <itemgroup detail="itemize" chain="itemize" symbol="1" level="1"> + <item> + <itemtag><m:math ..><m:mo>•</m:mo></m:math></itemtag> + <itemcontent>one</itemcontent> + </item> + <item> + <itemtag><m:math ..><m:mo>•</m:mo></m:math></itemtag> + <itemcontent>two</itemcontent> + </item> + </itemgroup> + </sectioncontent> + </section> +</document> +\stoptyping + +This file refers to the stylesheets and therefore renders quite okay in a browser +like FireFox that can handle \XHTML\ with arbitrary tags. + +The \type {detail} attribute tells us what instance of the element is used. +Normally the \type {chain} attribute is the same but it can have more values. +For instance, if we have: + +\starttyping +\definefloat[graphic][graphics][figure] + +..... + +\startplacefigure[title=First] + \externalfigure[cow.pdf] +\stopplacefigure + +..... + +\startplacegraphic[title=Second] + \externalfigure[cow.pdf] +\stopplacegraphic +\stoptyping + +we get this: + +\starttyping +<float detail="figure" chain="figure"> + <floatcontent>...</floatcontent> + <floatcaption>...</floatcaption> +</float> +<float detail="graphic" chain="figure graphic"> + <floatcontent>...</floatcontent> + <floatcaption>...</floatcaption> +</float> +\stoptyping + +This makes it possible to style specific categories of floats by using a +(combination of) \type {detail} and|/|or \type {chain} as filter. + +The body of the \type {test-tag.xhtml} file looks similar but it is slightly more +tuned for viewing. For instance hyperlinks are converted to a way that \CSS\ and +browsers like more. Keep in mind that the raw file can be the base for conversion +to other formats, so that one stays closest to the original structure. + +The \type {test-div.xhtml} file is even more tuned for viewing in browsers as it +completely does away with specific tags. We explicitly don't map onto native +\HTML\ elements because that would make all look messy and horrible, if only +because there seldom is a relation between those elements and the original. One +can always transform one of the export formats to pure \HTML\ tags if needed. + +\starttyping +<body> + <div class="document"> + <div class="section" id="aut-1"> + <div class="sectionnumber">1</div> + <div class="sectiontitle">First</div> + <div class="sectioncontent"> + <div class="itemgroup itemize symbol-1"> + <div class="item"> + <div class="itemtag"><m:math ...><m:mo>•</m:mo></m:math></div> + <div class="itemcontent">one</div> + </div> + <div class="item"> + <div class="itemtag"><m:math ...><m:mo>•</m:mo></m:math></div> + <div class="itemcontent">two</div> + </div> + </div> + <div class="float figure"> + <div class="floatcontent">...</div></div> + <div class="floatcaption">...></div> + </div> + <div class="float figure graphic"> + <div class="floatcontent">...</div></div> + <div class="floatcaption">...></div> + </div> + </div> + </div> +</body> +\stoptyping + +The also default \CSS\ file can deal with tags as well as classes. The additional +styles file contains definitions of so called highlights. In the \CONTEXT\ source +one can better use explicit named highlights instead of local font and color +switches because these properties are then exported to the \CSS. The images style +defines all used images. The templates file lists all the used elements and can +be used as a starting point for additional \CSS\ styling. + +Keep in mind that the export is \notabene{not} meant as a one|-|to|-|one visual +representation. It represents structure so that it can be converted to whatever +you like. + +In order to get an export you must start your document with: + +\starttyping +\setupbackend + [export=yes] +\stoptyping + +So, we trigger a specific (extra) backend. In addition you can set up the export: + +\starttyping +\setupexport + [svgstyle=test-basic-style.tex, + cssfile=test-extras.css, + hyphen=yes, + width=60em] +\stoptyping + +The \type {hyphen} option will also export hyphenation information so that the +text can be nicely justified. The \type {svgstyle} option can be used to specify +a file where math is setup, normally this would only contain a bodyfont setup +and this option is only needed if you want to create an \EPUB\ file afterwards that +has math represented as \SVG. + +The value of \type {cssfile} ends up as style reference in the exported files. +You can also pass a comma separates list of names (between curly braces). These +entries come after those of the automatically generated \CSS\ files so you need +to be aware of default properties. + +\stopsection + +\startsection[title=Images] + +Inclusion of images is done in an indirect way. Each image gets an entry in a +special image related stylesheet and then gets referred to by \type {id}. Some +extra information is written to a status file so that the script that creates +\EPUB\ files can deal with the right conversion, for instance from \PDF\ to \SVG. +Because we can refer to specific pages in a \PDF\ file, this subsystem deals with +that too. Images are expected in an \type {images} subpath and because in \CSS\ +the references are relative to the path where the stylesheet resides, we use +\type {../images} instead. If you do some postprocessing on the files or relocate +them you need to keep in mind that you might have to change these paths in the +image related \CSS\ file. + +\stopsection + +\startsection[title=Epub files] + +At the end of a run with exporting enabled you will get a message to the console that +tells you how to generate an \EPUB\ file. For instance: + +\starttyping +mtxrun --script epub --make --purge test +\stoptyping + +This will create a tree with the following organization: + +\starttyping +./test-epub +./test-epub/META-INF +./test-epub/META-INF/container.xml +./test-epub/OEBPS +./test-epub/OEBPS/content.opf +./test-epub/OEBPS/toc.ncx +./test-epub/OEBPS/nav.xhtml +./test-epub/OEBPS/cover.xhtml +./test-epub/OEBPS/test-div.xhtml +./test-epub/OEBPS/images +./test-epub/OEBPS/images/... +./test-epub/styles +./test-epub/styles/test-defaults.css +./test-epub/styles/test-images.css +./test-epub/styles/test-styles.css +./test-epub/mimetype +\stoptyping + +Images will be moved to this tree as well and if needed they will be converted +into for instance \SVG. Converted \PDF\ files can have a \typ {page-<number>} in +their name when a specific page has been used. + +You can pass the option \type {--svgmath} in which case math will be converted to +\SVG. The main reason for this feature is that we found out that \MATHML\ support +in browsers will not be as widespread as expected. The best bet is FireFox which +natively supports it. The Chrome browser had it for a while but it got dropped +and math is now delegated to \JAVASCRIPT\ and friends. In Internet Explorer +\MATHML\ should work (but I need to test that again). This conversion mechanism is +kind of interesting: one enters \TEX\ math, then gets \MATHML\ in the export, and +that gets rendered by \TEX\ again, but now as standalone snippet that then gets +converted to \SVG\ and embedded in the result. + +\stopsection + +\startsection[title=Styles] + +One can argue that we should use native \HTML\ elements but we don't have a nice +guaranteed consistent mapping onto that so it makes no sense to do so. Instead we +rely on either explicit tags with details and chains or divisions with classes +that combine the tag, detail and chain. The tagged variant has some more +attributes and those that use a fixed set of values become classes in the +division variant. Also, once we start going the (for instance) \type {H1}, \type +{H2}, etc.\ route we're lost when we have more levels than that or use a +different structure. If an \type {H3} can reflect several levels it makes no +sense to use it. The same is true for other tags: if a list is not really a list +than tagging it with \type {LI} is counterproductive. We're often dealing with +very complex documents so basic \HTML\ tagging is rather meaningless then. + +If you look at the division variant (the one used for \EPUB\ too) you will notice +that there are no empty elements but \type {div} ones with a comment as content. +This is needed because otherwise they get ignored which for instance makes table +cells invisible. + +The relation between \type {detail} and \type {chain} (reflected in \type {class}) +can best be seen from the next example. + +\starttyping +\definefloat[myfloata] +\definefloat[myfloatb][myfloatbs][figure] +\definefloat[myfloatc][myfloatcs][myfloatb] +\stoptyping + +This creates two new float instances. The first inherits from the main float +settings, but can have its own properties. The second example inherits from +the \type {figure} so in fact it is part of a chain. The third one has a longer +chain. + +\starttyping +<float detail="myfloata">...</float> +<float detail="myfloatb" chain="figure">...</float> +<float detail="myfloatc" chain="figure myfloatb">...</float> +\stoptyping + +In a \CSS\ style you can now configure tags, details, and chains as well as +classes (we only show a few possibilities): + +\starttyping +div.float.myfloata { } float[detail='myfloata'] { } +div.float.myfloatb { } float[detail='myfloatb'] { } +div.float.figure { } float[detail='figure'] { } +div.float.figure.myfloatb { } float[chain~='figure'][detail='myfloata'] { } +div.myfloata { } *[detail='myfloata'] { } +div.myfloatb { } *[detail='myfloatb'] { } +div.figure { } *[chain~='figure'] { } +div.figure.myfloatb { } *[chain~='figure'][detail='myfloatb'] { } +\stoptyping + +The default styles cover some basics but if you're serious about the export +or want to use the \EPUB\ then it makes sense to overload some of it and|/|or +provide additional styling. You can find enough about \CSS\ and it's options +on the internet. + +\stopsection + +\startsection[title=Coding] + +The default output reflects the structure present in the document. If this is not +enough you can add your own structure. + +\starttyping +\startelement[question] +Is this right? +\stopelement +\stoptyping + +You can also pass attributes: + +\starttyping +\startelement[question][level=difficult] +Is this right? +\stopelement +\stoptyping + +But these will only be exported when you also say: + +\starttyping +\setupexport + [properties=yes] +\stoptyping + +You can create a namespace. The following will generate attributes +like \type {my-level}. + +\starttyping +\setupexport + [properties=my-] +\stoptyping + +In most cases it makes more sense to use highlights: + +\starttyping +\definehighlight + [important] + [style=bold] +\stoptyping + +This has the advantage that the style and color are exported to a special +\CSS\ file. + +Headers and footers and other content that is part of the page builder is not +exported. If your document has coverpages you might want to hide them too. The +same is true when you create special chapter title rendering that have as side +effect that content ends up in the page stream. If something shows up that you +want to, you can wrap it in an \type {ignore} element: + +\starttyping +\startelement[ignore] +Don't export this. +\stopelement +\stoptyping + +\stopsection + +\stoptext diff --git a/doc/context/sources/general/manuals/workflows/workflows-graphics.tex b/doc/context/sources/general/manuals/workflows/workflows-graphics.tex index 25eed7bee..dc3c6e106 100644 --- a/doc/context/sources/general/manuals/workflows/workflows-graphics.tex +++ b/doc/context/sources/general/manuals/workflows/workflows-graphics.tex @@ -129,6 +129,28 @@ the tables passed as third argument. \stopsection +\startsection[title=Trackers] + +If you want a lot of info you can say: + +\starttyping +\enabletrackers[figures.*] +\stoptyping + +But you can be more specific. With \type {graphics.locating} you will get some +insight in where files are looked for. The \type {graphics.inclusion} tracker +gives some more info about actual inclusion. The \type {graphics.bases} is kind +of special and only makes sense when you use the graphic database options. The +\type {graphics.conversion} and related tracker \type {graphics.programs} show if +and how conversion of images takes place. + +The \type {graphics.lognames} will make sure that some extra information about +used graphics is saved in the log file, while \type {graphics.usage} will produce +a file \typ {<jobname>-figures-usage.lua} that contains information about found +(or not found) images and the way they are used. + +\stopsection + \stopchapter \stopcomponent diff --git a/metapost/context/base/mp-chem.mpiv b/metapost/context/base/mp-chem.mpiv index 7ca40bbea..b861d3f12 100644 --- a/metapost/context/base/mp-chem.mpiv +++ b/metapost/context/base/mp-chem.mpiv @@ -132,6 +132,8 @@ vardef chem_init_some (suffix $) (expr e) = fi if not chem_star[$] : scaled (.5/(sind .5chem_num1)) + % carbon-carbon benzene bond length + scaled (1.4/1.54) fi ; fi ; diff --git a/scripts/context/lua/mtxrun.lua b/scripts/context/lua/mtxrun.lua index c9096d81e..f7af42969 100644 --- a/scripts/context/lua/mtxrun.lua +++ b/scripts/context/lua/mtxrun.lua @@ -444,7 +444,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-lpeg"] = package.loaded["l-lpeg"] or true --- original size: 34559, stripped down to: 18815 +-- original size: 38619, stripped down to: 19653 if not modules then modules={} end modules ['l-lpeg']={ version=1.001, @@ -1009,24 +1009,48 @@ function lpeg.append(list,pp,delayed,checked) end return p end +local p_false=P(false) +local p_true=P(true) local function make(t,hash) - local p=P(false) + local p=p_false local keys=sortedkeys(t) + local function making(t,w) + local p=p_false + local keys=sortedkeys(t) + for i=1,#keys do + local k=keys[i] + local v=t[k] + if w then + if v==true then + p=p+P(k)*p_true + else + p=p+P(k)*(making(v,w)+p_true) + end + else + if v==true then + p=p+P(k) + else + p=p+P(k)*making(v,w) + end + end + end + return p + end for i=1,#keys do local k=keys[i] local v=t[k] local h=hash[v] if h then - if next(v) then - p=p+P(k)*(make(v,hash)+P(true)) + if v==true then + p=p+P(k)*p_true else - p=p+P(k)*P(true) + p=p+P(k)*(making(v,true)+p_true) end else - if next(v) then - p=p+P(k)*make(v,hash) - else + if v==true then p=p+P(k) + else + p=p+P(k)*making(v,false) end end end @@ -1034,34 +1058,55 @@ local function make(t,hash) end function lpeg.utfchartabletopattern(list) local tree={} - local hash={} + local hash local n=#list if n==0 then + hash=list for s in next,list do local t=tree + local p,pk for c in gmatch(s,".") do - local tc=t[c] - if not tc then - tc={} - t[c]=tc + if t==true then + t={ [c]=true } + p[pk]=t + p=t + t=true + else + local tc=t[c] + if not tc then + tc=true + t[c]=tc + end + p=t + t=tc end - t=tc + pk=c end - hash[t]=s end else + hash={} for i=1,n do local t=tree local s=list[i] + local p,pk for c in gmatch(s,".") do - local tc=t[c] - if not tc then - tc={} - t[c]=tc + if t==true then + t={ [c]=true } + p[pk]=t + p=t + t=true + else + local tc=t[c] + if not tc then + tc=true + t[c]=true + end + p=t + t=tc end - t=tc + pk=c end - hash[t]=s + hash[s]=true end end return make(tree,hash) @@ -17774,8 +17819,8 @@ end -- of closure -- used libraries : l-lua.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-mrg.lua util-tpl.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua -- skipped libraries : - --- original bytes : 745333 --- stripped bytes : 272372 +-- original bytes : 749393 +-- stripped bytes : 275594 -- end library merge diff --git a/scripts/context/stubs/mswin/mtxrun.lua b/scripts/context/stubs/mswin/mtxrun.lua index c9096d81e..f7af42969 100644 --- a/scripts/context/stubs/mswin/mtxrun.lua +++ b/scripts/context/stubs/mswin/mtxrun.lua @@ -444,7 +444,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-lpeg"] = package.loaded["l-lpeg"] or true --- original size: 34559, stripped down to: 18815 +-- original size: 38619, stripped down to: 19653 if not modules then modules={} end modules ['l-lpeg']={ version=1.001, @@ -1009,24 +1009,48 @@ function lpeg.append(list,pp,delayed,checked) end return p end +local p_false=P(false) +local p_true=P(true) local function make(t,hash) - local p=P(false) + local p=p_false local keys=sortedkeys(t) + local function making(t,w) + local p=p_false + local keys=sortedkeys(t) + for i=1,#keys do + local k=keys[i] + local v=t[k] + if w then + if v==true then + p=p+P(k)*p_true + else + p=p+P(k)*(making(v,w)+p_true) + end + else + if v==true then + p=p+P(k) + else + p=p+P(k)*making(v,w) + end + end + end + return p + end for i=1,#keys do local k=keys[i] local v=t[k] local h=hash[v] if h then - if next(v) then - p=p+P(k)*(make(v,hash)+P(true)) + if v==true then + p=p+P(k)*p_true else - p=p+P(k)*P(true) + p=p+P(k)*(making(v,true)+p_true) end else - if next(v) then - p=p+P(k)*make(v,hash) - else + if v==true then p=p+P(k) + else + p=p+P(k)*making(v,false) end end end @@ -1034,34 +1058,55 @@ local function make(t,hash) end function lpeg.utfchartabletopattern(list) local tree={} - local hash={} + local hash local n=#list if n==0 then + hash=list for s in next,list do local t=tree + local p,pk for c in gmatch(s,".") do - local tc=t[c] - if not tc then - tc={} - t[c]=tc + if t==true then + t={ [c]=true } + p[pk]=t + p=t + t=true + else + local tc=t[c] + if not tc then + tc=true + t[c]=tc + end + p=t + t=tc end - t=tc + pk=c end - hash[t]=s end else + hash={} for i=1,n do local t=tree local s=list[i] + local p,pk for c in gmatch(s,".") do - local tc=t[c] - if not tc then - tc={} - t[c]=tc + if t==true then + t={ [c]=true } + p[pk]=t + p=t + t=true + else + local tc=t[c] + if not tc then + tc=true + t[c]=true + end + p=t + t=tc end - t=tc + pk=c end - hash[t]=s + hash[s]=true end end return make(tree,hash) @@ -17774,8 +17819,8 @@ end -- of closure -- used libraries : l-lua.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-mrg.lua util-tpl.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua -- skipped libraries : - --- original bytes : 745333 --- stripped bytes : 272372 +-- original bytes : 749393 +-- stripped bytes : 275594 -- end library merge diff --git a/scripts/context/stubs/unix/mtxrun b/scripts/context/stubs/unix/mtxrun index c9096d81e..f7af42969 100644 --- a/scripts/context/stubs/unix/mtxrun +++ b/scripts/context/stubs/unix/mtxrun @@ -444,7 +444,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-lpeg"] = package.loaded["l-lpeg"] or true --- original size: 34559, stripped down to: 18815 +-- original size: 38619, stripped down to: 19653 if not modules then modules={} end modules ['l-lpeg']={ version=1.001, @@ -1009,24 +1009,48 @@ function lpeg.append(list,pp,delayed,checked) end return p end +local p_false=P(false) +local p_true=P(true) local function make(t,hash) - local p=P(false) + local p=p_false local keys=sortedkeys(t) + local function making(t,w) + local p=p_false + local keys=sortedkeys(t) + for i=1,#keys do + local k=keys[i] + local v=t[k] + if w then + if v==true then + p=p+P(k)*p_true + else + p=p+P(k)*(making(v,w)+p_true) + end + else + if v==true then + p=p+P(k) + else + p=p+P(k)*making(v,w) + end + end + end + return p + end for i=1,#keys do local k=keys[i] local v=t[k] local h=hash[v] if h then - if next(v) then - p=p+P(k)*(make(v,hash)+P(true)) + if v==true then + p=p+P(k)*p_true else - p=p+P(k)*P(true) + p=p+P(k)*(making(v,true)+p_true) end else - if next(v) then - p=p+P(k)*make(v,hash) - else + if v==true then p=p+P(k) + else + p=p+P(k)*making(v,false) end end end @@ -1034,34 +1058,55 @@ local function make(t,hash) end function lpeg.utfchartabletopattern(list) local tree={} - local hash={} + local hash local n=#list if n==0 then + hash=list for s in next,list do local t=tree + local p,pk for c in gmatch(s,".") do - local tc=t[c] - if not tc then - tc={} - t[c]=tc + if t==true then + t={ [c]=true } + p[pk]=t + p=t + t=true + else + local tc=t[c] + if not tc then + tc=true + t[c]=tc + end + p=t + t=tc end - t=tc + pk=c end - hash[t]=s end else + hash={} for i=1,n do local t=tree local s=list[i] + local p,pk for c in gmatch(s,".") do - local tc=t[c] - if not tc then - tc={} - t[c]=tc + if t==true then + t={ [c]=true } + p[pk]=t + p=t + t=true + else + local tc=t[c] + if not tc then + tc=true + t[c]=true + end + p=t + t=tc end - t=tc + pk=c end - hash[t]=s + hash[s]=true end end return make(tree,hash) @@ -17774,8 +17819,8 @@ end -- of closure -- used libraries : l-lua.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-mrg.lua util-tpl.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua -- skipped libraries : - --- original bytes : 745333 --- stripped bytes : 272372 +-- original bytes : 749393 +-- stripped bytes : 275594 -- end library merge diff --git a/scripts/context/stubs/win64/mtxrun.lua b/scripts/context/stubs/win64/mtxrun.lua index c9096d81e..f7af42969 100644 --- a/scripts/context/stubs/win64/mtxrun.lua +++ b/scripts/context/stubs/win64/mtxrun.lua @@ -444,7 +444,7 @@ do -- create closure to overcome 200 locals limit package.loaded["l-lpeg"] = package.loaded["l-lpeg"] or true --- original size: 34559, stripped down to: 18815 +-- original size: 38619, stripped down to: 19653 if not modules then modules={} end modules ['l-lpeg']={ version=1.001, @@ -1009,24 +1009,48 @@ function lpeg.append(list,pp,delayed,checked) end return p end +local p_false=P(false) +local p_true=P(true) local function make(t,hash) - local p=P(false) + local p=p_false local keys=sortedkeys(t) + local function making(t,w) + local p=p_false + local keys=sortedkeys(t) + for i=1,#keys do + local k=keys[i] + local v=t[k] + if w then + if v==true then + p=p+P(k)*p_true + else + p=p+P(k)*(making(v,w)+p_true) + end + else + if v==true then + p=p+P(k) + else + p=p+P(k)*making(v,w) + end + end + end + return p + end for i=1,#keys do local k=keys[i] local v=t[k] local h=hash[v] if h then - if next(v) then - p=p+P(k)*(make(v,hash)+P(true)) + if v==true then + p=p+P(k)*p_true else - p=p+P(k)*P(true) + p=p+P(k)*(making(v,true)+p_true) end else - if next(v) then - p=p+P(k)*make(v,hash) - else + if v==true then p=p+P(k) + else + p=p+P(k)*making(v,false) end end end @@ -1034,34 +1058,55 @@ local function make(t,hash) end function lpeg.utfchartabletopattern(list) local tree={} - local hash={} + local hash local n=#list if n==0 then + hash=list for s in next,list do local t=tree + local p,pk for c in gmatch(s,".") do - local tc=t[c] - if not tc then - tc={} - t[c]=tc + if t==true then + t={ [c]=true } + p[pk]=t + p=t + t=true + else + local tc=t[c] + if not tc then + tc=true + t[c]=tc + end + p=t + t=tc end - t=tc + pk=c end - hash[t]=s end else + hash={} for i=1,n do local t=tree local s=list[i] + local p,pk for c in gmatch(s,".") do - local tc=t[c] - if not tc then - tc={} - t[c]=tc + if t==true then + t={ [c]=true } + p[pk]=t + p=t + t=true + else + local tc=t[c] + if not tc then + tc=true + t[c]=true + end + p=t + t=tc end - t=tc + pk=c end - hash[t]=s + hash[s]=true end end return make(tree,hash) @@ -17774,8 +17819,8 @@ end -- of closure -- used libraries : l-lua.lua l-package.lua l-lpeg.lua l-function.lua l-string.lua l-table.lua l-io.lua l-number.lua l-set.lua l-os.lua l-file.lua l-gzip.lua l-md5.lua l-url.lua l-dir.lua l-boolean.lua l-unicode.lua l-math.lua util-str.lua util-tab.lua util-sto.lua util-prs.lua util-fmt.lua trac-set.lua trac-log.lua trac-inf.lua trac-pro.lua util-lua.lua util-deb.lua util-mrg.lua util-tpl.lua util-env.lua luat-env.lua lxml-tab.lua lxml-lpt.lua lxml-mis.lua lxml-aux.lua lxml-xml.lua trac-xml.lua data-ini.lua data-exp.lua data-env.lua data-tmp.lua data-met.lua data-res.lua data-pre.lua data-inp.lua data-out.lua data-fil.lua data-con.lua data-use.lua data-zip.lua data-tre.lua data-sch.lua data-lua.lua data-aux.lua data-tmf.lua data-lst.lua util-lib.lua luat-sta.lua luat-fmt.lua -- skipped libraries : - --- original bytes : 745333 --- stripped bytes : 272372 +-- original bytes : 749393 +-- stripped bytes : 275594 -- end library merge diff --git a/tex/context/base/anch-bck.mkvi b/tex/context/base/anch-bck.mkvi index 273cf0159..cccf14ee4 100644 --- a/tex/context/base/anch-bck.mkvi +++ b/tex/context/base/anch-bck.mkvi @@ -20,6 +20,10 @@ \unprotect +% we can flush 5 in one call (saved 4 lua calls) .. brrr wself .. will change + +\def\MPposset#1{\ctxcommand{MPposset("#1")}} % will go + % This might be overloaded later on: % \defineoverlay[\v!text-2][\positionoverlay{\v!text-2}] @@ -46,7 +50,7 @@ % tricky: we need to catch newly set! otherwise an old run can have positions \unexpanded\def\anch_backgrounds_text_initialize - {\doifelsepositionsused\enableparpositions\donothing + {\ctxcommand{doifelsepositionsused()}\enableparpositions\donothing \global\let\anch_backgrounds_text_initialize\relax} \appendtoks diff --git a/tex/context/base/anch-pgr.lua b/tex/context/base/anch-pgr.lua index 198e8a499..84d0f6939 100644 --- a/tex/context/base/anch-pgr.lua +++ b/tex/context/base/anch-pgr.lua @@ -19,9 +19,6 @@ local lpegmatch = lpeg.match local jobpositions = job.positions local formatters = string.formatters -local scanstring = tokens.scanstring -local scannumber = tokens.scannumber -local scandimen = tokens.scandimen local report_graphics = logs.reporter("graphics") diff --git a/tex/context/base/anch-pos.lua b/tex/context/base/anch-pos.lua index fc7e24b96..1f366121d 100644 --- a/tex/context/base/anch-pos.lua +++ b/tex/context/base/anch-pos.lua @@ -21,8 +21,6 @@ more efficient.</p> -- maybe replace texsp by our own converter (stay at the lua end) -- eventually mp will have large numbers so we can use sp there too -local commands, context = commands, context - local tostring, next, rawget, setmetatable = tostring, next, rawget, setmetatable local sort = table.sort local format, gmatch, match = string.format, string.gmatch, string.match @@ -30,12 +28,16 @@ local rawget = rawget local lpegmatch = lpeg.match local insert, remove = table.insert, table.remove local allocate, mark = utilities.storage.allocate, utilities.storage.mark -local texsp = tex.sp ------ texsp = string.todimen -- because we cache this is much faster but no rounding +local commands = commands +local context = context + +local tex = tex local texgetcount = tex.getcount local texsetcount = tex.setcount local texget = tex.get +local texsp = tex.sp +----- texsp = string.todimen -- because we cache this is much faster but no rounding local pdf = pdf -- h and v are variables diff --git a/tex/context/base/back-exp.lua b/tex/context/base/back-exp.lua index d4c252384..70ed78282 100644 --- a/tex/context/base/back-exp.lua +++ b/tex/context/base/back-exp.lua @@ -143,6 +143,9 @@ local locatedtag = structurestags.locatedtag local starttiming = statistics.starttiming local stoptiming = statistics.stoptiming +local characterdata = characters.data +local overloads = fonts.mappings.overloads + -- todo: more locals (and optimize) local exportversion = "0.33" @@ -2442,11 +2445,11 @@ local function collectresults(head,list,pat,pap) -- is last used (we also have c -- report_export("skipping character: %C (no attribute)",n.char) else -- we could add tonunicodes for ligatures (todo) - local components = getfield(n,"components") - if components then -- we loose data + local components = getfield(n,"components") + local c = getchar(n) + if components and (not characterdata[c] or overloads[c]) then -- we loose data collectresults(components,nil,at) -- this assumes that components have the same attribute as the glyph ... we should be more tolerant (see math) else - local c = getchar(n) if last ~= at then local tl = taglist[at] pushcontent() diff --git a/tex/context/base/back-pdf.lua b/tex/context/base/back-pdf.lua index f7f995f39..2d6370811 100644 --- a/tex/context/base/back-pdf.lua +++ b/tex/context/base/back-pdf.lua @@ -6,8 +6,13 @@ if not modules then modules = { } end modules ['back-pdf'] = { license = "see context related readme files" } + +local tonumber = tonumber +local sind, cosd = math.sind, math.cosd +local insert, remove = table.insert, table.remove local codeinjections = backends.pdf.codeinjections +local context = context local outputfilename function codeinjections.getoutputfilename() @@ -19,11 +24,6 @@ end backends.install("pdf") -local context = context - -local sind, cosd = math.sind, math.cosd -local insert, remove = table.insert, table.remove - local f_matrix = string.formatters["%F %F %F %F"] -- 0.8 is default function commands.pdfrotation(a) diff --git a/tex/context/base/buff-ver.mkiv b/tex/context/base/buff-ver.mkiv index 1e5a9e690..9e0244eca 100644 --- a/tex/context/base/buff-ver.mkiv +++ b/tex/context/base/buff-ver.mkiv @@ -75,7 +75,12 @@ \def\buff_verbatim_initialize_type_one {\let\obeylines\ignorelines - \usetypestyleandcolor\c!style\c!color + \edef\p_buff_option{\typeparameter\c!option}% + \ifx\p_buff_option\v!none + \usetypestyleandcolor\c!style\c!color + \else\ifx\p_buff_option\empty + \usetypestyleandcolor\c!style\c!color + \fi\fi \setcatcodetable\vrbcatcodes} \def\buff_verbatim_initialize_type_two @@ -114,7 +119,12 @@ \ifx\buff_verbatim_set_line_margin\relax \doadaptleftskip{\typingparameter\c!margin}% \fi - \usetypingstyleandcolor\c!style\c!color + \edef\p_buff_option{\typingparameter\c!option}% + \ifx\p_buff_option\v!none + \usetypingstyleandcolor\c!style\c!color + \else\ifx\p_buff_option\empty + \usetypingstyleandcolor\c!style\c!color + \fi\fi % will become: \usealignparameter\typingparameter \doifsomething{\typingparameter\c!align}{\setupalign[\typingparameter\c!align]}} % use fast one @@ -330,7 +340,7 @@ \ctxcommand{typestring{ data = \!!bs\detokenize{#1}\!!es, tab = "\typeparameter\c!tab", - method = "\typeparameter\c!option", + method = "\p_buff_option", nature = "inline", compact = "\typeparameter\c!compact", % none | all | last (all needed in tabulate etc for manuals) escape = \!!bs\typeparameter\c!escape\!!es, % new but rather useless imo (escaping in general is not used much) @@ -346,7 +356,7 @@ data = \!!bs\detokenize{#1}\!!es, tab = "\typeparameter\c!tab", method = "nested", % we force a special visualizer - option = "\typeparameter\c!option", % extra visualizer (maybe: nested,\typeparameter\c!option) + option = "\p_buff_option", % extra visualizer (maybe: nested,\typeparameter\c!option) nature = "inline", }}% \dostoptagged @@ -515,7 +525,7 @@ strip = "\typingparameter\c!strip", range = "\typingparameter\c!range", tab = "\typingparameter\c!tab", - method = "\typingparameter\c!option", + method = "\p_buff_option", escape = \!!bs\typingparameter\c!escape\!!es, nature = "display", }}% @@ -635,7 +645,7 @@ range = "\typingparameter\c!range", regime = "\currentregime", tab = "\typingparameter\c!tab", - method = "\typingparameter\c!option", + method = "\p_buff_option", nature = "display", }}% \dostoptagged @@ -808,7 +818,7 @@ range = "\typingparameter\c!range", regime = "\currentregime", tab = "\typingparameter\c!tab", - method = "\typingparameter\c!option", + method = "\p_buff_option", escape = \!!bs\typingparameter\c!escape\!!es, nature = "display", }}% @@ -850,7 +860,7 @@ name = "#2", strip = "\typingparameter\c!strip", tab = "\typingparameter\c!tab", - method = "\typingparameter\c!option", + method = "\p_buff_option", nature = "direct", }}} diff --git a/tex/context/base/catc-ini.mkiv b/tex/context/base/catc-ini.mkiv index 26cef30de..bb1e47faa 100644 --- a/tex/context/base/catc-ini.mkiv +++ b/tex/context/base/catc-ini.mkiv @@ -88,16 +88,25 @@ \xdef\outputnewlinechar{^^J}% \endgroup} -%D We predefine some prefixes ahead of syst-aux and mult-sys. We reserve 8 slots -%D for catcodes. +%D We predefine some prefixes ahead of syst-aux and mult-sys. -\def\??catcodelet {1>>} % let : \let -\def\??catcodedef {2>>} % def : \def -\def\??catcodeued {3>>} % ued : \unexpanded\def -\def\??catcodeget {4>>} % \meaning +% We reserve 8 slots for catcodes. +% +% \def\??catcodelet {1>>} % let : \let +% \def\??catcodedef {2>>} % def : \def +% \def\??catcodeued {3>>} % ued : \unexpanded\def +% \def\??catcodeget {4>>} % \meaning +% +% \def\??catcodetablet{5>>} +% \def\??catcodetablen{6>>} + +\installsystemnamespace {catcodelet} % let : \let +\installsystemnamespace {catcodedef} % def : \def +\installsystemnamespace {catcodeued} % ued : \unexpanded\def +\installsystemnamespace {catcodeget} % \meaning -\def\??catcodetablet{5>>} -\def\??catcodetablen{6>>} +\installsystemnamespace {catcodetablet} +\installsystemnamespace {catcodetablen} \newcount\c_syst_catcodes_n \c_syst_catcodes_n\zerocount % 0 = signal, so advance before allocate \newcount\c_syst_catcodes_a diff --git a/tex/context/base/char-ini.lua b/tex/context/base/char-ini.lua index 0f632935d..b50847d8e 100644 --- a/tex/context/base/char-ini.lua +++ b/tex/context/base/char-ini.lua @@ -891,7 +891,6 @@ lpegpatterns.toshape = toshape -- old ones ... will be overloaded -- function characters.upper (str) return lpegmatch(toupper,str) end -- function characters.shaped(str) return lpegmatch(toshape,str) end - -- local superscripts = allocate() characters.superscripts = superscripts -- local subscripts = allocate() characters.subscripts = subscripts @@ -987,9 +986,9 @@ if not characters.lhash then end -local lhash = characters.lhash -local uhash = characters.uhash -local shash = characters.shash +local lhash = characters.lhash mark(lhash) +local uhash = characters.uhash mark(uhash) +local shash = characters.shash mark(shash) local utf8lowercharacter = utfchartabletopattern(lhash) / lhash local utf8uppercharacter = utfchartabletopattern(uhash) / uhash diff --git a/tex/context/base/char-ini.mkiv b/tex/context/base/char-ini.mkiv index e130e200f..09e25f7fb 100644 --- a/tex/context/base/char-ini.mkiv +++ b/tex/context/base/char-ini.mkiv @@ -64,28 +64,23 @@ % \def\setcclcuc#1#2#3{\global\catcode#1=\lettercatcode\global\lccode#1=#2\global\uccode#1=#3\relax} % \def\setcclcucself#1{\global\catcode#1=\lettercatcode\global\lccode#1=#1\global\uccode#1=#1\relax } -\ctxcommand{setcharactercodes()} - % Is setting up vrb tpa and tpb needed? -\ctxcommand{definecatcodetable( - { % letter catcodes - \number\texcatcodes, - \number\ctxcatcodes, - \number\notcatcodes, - %number\mthcatcodes, - \number\vrbcatcodes, - \number\prtcatcodes, - \number\tpacatcodes, - \number\tpbcatcodes, - \number\txtcatcodes, - }, - { % activate catcodes - \number\ctxcatcodes, - \number\notcatcodes, - \number\prtcatcodes, % new - } -)} +% move to lua side + +\ctxcommand{setlettercatcodes(\number\texcatcodes)} +\ctxcommand{setlettercatcodes(\number\ctxcatcodes)} +\ctxcommand{setlettercatcodes(\number\notcatcodes)} +%ctxcommand{setlettercatcodes(\number\mthcatcodes)} +\ctxcommand{setlettercatcodes(\number\vrbcatcodes)} +\ctxcommand{setlettercatcodes(\number\prtcatcodes)} +\ctxcommand{setlettercatcodes(\number\tpacatcodes)} +\ctxcommand{setlettercatcodes(\number\tpbcatcodes)} +\ctxcommand{setlettercatcodes(\number\txtcatcodes)} + +\ctxcommand{setactivecatcodes(\number\ctxcatcodes)} +\ctxcommand{setactivecatcodes(\number\notcatcodes)} +\ctxcommand{setactivecatcodes(\number\prtcatcodes)} \def\chardescription#1% {\ctxcommand{chardescription(\number#1)}} diff --git a/tex/context/base/char-tex.lua b/tex/context/base/char-tex.lua index e03307cc3..e1caa64b9 100644 --- a/tex/context/base/char-tex.lua +++ b/tex/context/base/char-tex.lua @@ -412,6 +412,11 @@ function texcharacters.safechar(n) -- was characters.safechar end end +if not context or not commands then + -- used in e.g. mtx-bibtex + return +end + function texcharacters.defineaccents() for accent, group in next, accentmapping do context.dodefineaccentcommand(accent) @@ -421,11 +426,6 @@ function texcharacters.defineaccents() end end -if not context or not commands then - -- used in e.g. mtx-bibtex - return -end - -- all kind of initializations local tex = tex @@ -476,99 +476,119 @@ local forbidden = tohash { -- at least now -- 0xFEFF, } -function characters.define(tobelettered, tobeactivated) -- catcodetables +local csletters = characters.csletters -- also a signal that we have initialized +local activated = { } - if trace_defining then - report_defining("defining active character commands") - end +if not csletters then + + csletters = allocate() + characters.csletters = csletters - local activated, a = { }, 0 + report_defining("setting up character related commands") - for u, chr in next, data do -- these will be commands + for u, chr in next, data do -- will move up local fallback = chr.fallback if fallback then contextsprint("{\\catcode",u,"=13\\unexpanded\\gdef ",utfchar(u),"{\\checkedchar{",u,"}{",fallback,"}}}") - a = a + 1 - activated[a] = u + activated[#activated+1] = u else local contextname = chr.contextname + local category = chr.category if contextname then - local category = chr.category if is_character[category] then if chr.unicodeslot < 128 then if is_letter[category] then - contextsprint(ctxcatcodes,format("\\def\\%s{%s}",contextname,utfchar(u))) -- has no s + -- setmacro + local c = utfchar(u) + contextsprint(ctxcatcodes,format("\\def\\%s{%s}",contextname,c)) -- has no s + csletters[c] = u else + -- setchar contextsprint(ctxcatcodes,format("\\chardef\\%s=%s",contextname,u)) -- has no s end else - contextsprint(ctxcatcodes,format("\\def\\%s{%s}",contextname,utfchar(u))) -- has no s + -- setmacro + local c = utfchar(u) + contextsprint(ctxcatcodes,format("\\def\\%s{%s}",contextname,c)) -- has no s + if is_letter[chr.category] and u >= 32 and u <= 65536 then + csletters[c] = u + end end elseif is_command[category] and not forbidden[u] then + -- set contextsprint("{\\catcode",u,"=13\\unexpanded\\gdef ",utfchar(u),"{\\"..contextname,"}}") - a = a + 1 - activated[a] = u + activated[#activated+1] = u end + elseif is_letter[chr.category] and u >= 32 and u <= 65536 then + csletters[utfchar(u)] = u end end end - if tobelettered then -- shared - local saved = tex.catcodetable - for i=1,#tobelettered do - tex.catcodetable = tobelettered[i] - if trace_defining then - report_defining("defining letters (global, shared)") - end - for u, chr in next, data do - if not chr.fallback and is_letter[chr.category] and u >= 128 and u <= 65536 then - texsetcatcode(u,11) - end - local range = chr.range - if range then - for i=1,range.first,range.last do -- tricky as not all are letters - texsetcatcode(i,11) - end - end - end - texsetcatcode(0x200C,11) -- non-joiner - texsetcatcode(0x200D,11) -- joiner - for k, v in next, blocks do - if v.catcode == "letter" then - for i=v.first,v.last do - texsetcatcode(i,11) - end + if false then + for k, v in next, blocks do + if v.catcode == "letter" then + for u=v.first,v.last do + csletters[utfchar(u)] = u end end end - tex.catcodetable = saved end - local nofactivated = #tobeactivated - if tobeactivated and nofactivated > 0 then - for i=1,nofactivated do - local u = activated[i] - if u then - report_defining("character %U is active in set %a, containing %a",u,data[u].description,tobeactivated) - end - end - local saved = tex.catcodetable - for i=1,#tobeactivated do - local vector = tobeactivated[i] - if trace_defining then - report_defining("defining %a active characters in vector %a",nofactivated,vector) - end - tex.catcodetable = vector - for i=1,nofactivated do - local u = activated[i] - if u then - texsetcatcode(u,13) - end - end - end - tex.catcodetable = saved + if storage then + storage.register("characters/csletters", csletters, "characters.csletters") + end + +end + +lpegpatterns.csletter = utfchartabletopattern(csletters) + +-- todo: get rid of activated +-- todo: move first loop out ,merge with above + +function characters.setlettercatcodes(cct) + if trace_defining then + report_defining("assigning letter catcodes to catcode table %a",cct) end + local saved = tex.catcodetable + tex.catcodetable = cct + texsetcatcode(0x200C,11) -- non-joiner + texsetcatcode(0x200D,11) -- joiner + for c, u in next, csletters do + texsetcatcode(u,11) + end + -- for u, chr in next, data do + -- if not chr.fallback and is_letter[chr.category] and u >= 32 and u <= 65536 then + -- texsetcatcode(u,11) + -- end + -- local range = chr.range + -- if range then + -- for i=1,range.first,range.last do -- tricky as not all are letters + -- texsetcatcode(i,11) + -- end + -- end + -- end + -- for k, v in next, blocks do + -- if v.catcode == "letter" then + -- for u=v.first,v.last do + -- texsetcatcode(u,11) + -- end + -- end + -- end + tex.catcodetable = saved +end +function characters.setactivecatcodes(cct) + local saved = tex.catcodetable + tex.catcodetable = cct + for i=1,#activated do + local u = activated[i] + texsetcatcode(u,13) + if trace_defining then + report_defining("character %U (%s) is active in set %a",u,data[u].description,cct) + end + end + tex.catcodetable = saved end --[[ldx-- @@ -676,5 +696,6 @@ end -- entities.gt = utfchar(characters.activeoffset + utfbyte(">")) -- end -commands.definecatcodetable = characters.define -commands.setcharactercodes = characters.setcodes +commands.setlettercatcodes = characters.setlettercatcodes +commands.setactivecatcodes = characters.setactivecatcodes +commands.setcharactercodes = characters.setcodes diff --git a/tex/context/base/char-utf.lua b/tex/context/base/char-utf.lua index e3f7605a8..267c97c26 100644 --- a/tex/context/base/char-utf.lua +++ b/tex/context/base/char-utf.lua @@ -30,8 +30,11 @@ if not characters.blocks then require("char-ini") end local lpegmatch = lpeg.match local lpegpatterns = lpeg.patterns local p_utf8character = lpegpatterns.utf8character +local p_utf8byte = lpegpatterns.utf8byte local utfchartabletopattern = lpeg.utfchartabletopattern +local formatters = string.formatters + local allocate = utilities.storage.allocate or function() return { } end local charfromnumber = characters.fromnumber @@ -60,6 +63,8 @@ characters.filters = filters local utffilters = { } characters.filters.utf = utffilters +local data = characters.data + -- is characters.combined cached? --[[ldx-- @@ -611,4 +616,23 @@ end -- -- print(test,done,test==done,false) +local f_default = formatters["[%U] "] +local f_description = formatters["[%s] "] + +local function convert(n) + local d = data[n] + d = d and d.description + if d then + return f_description(d) + else + return f_default(n) + end +end + +local pattern = Cs((p_utf8byte / convert)^1) + +function utffilters.verbose(data) + return data and lpegmatch(pattern,data) or "" +end + return characters diff --git a/tex/context/base/cldf-bas.lua b/tex/context/base/cldf-bas.lua index b982fc364..1067a17d5 100644 --- a/tex/context/base/cldf-bas.lua +++ b/tex/context/base/cldf-bas.lua @@ -24,10 +24,10 @@ if not modules then modules = { } end modules ['cldf-bas'] = { -- maybe use context.generics -local type = type -local format = string.format -local utfchar = utf.char -local concat = table.concat +local type = type +local format = string.format +local utfchar = utf.char +local concat = table.concat local context = context local generics = context.generics @@ -49,13 +49,23 @@ function context.char(k) -- used as escape too, so don't change to utf elseif n > 0 then context([[\char%s\relax]],concat(k,[[\relax\char]])) end - elseif k then - context([[\char%s\relax]],k) + else + if type(k) == "string" then + k = tonumber(k) + end + if type(k) == "number" then + context([[\char%s\relax]],k) + end end end function context.utfchar(k) - context(utfchar(k)) + if type(k) == "string" then + k = tonumber(k) + end + if type(k) == "number" then + context(utfchar(k)) + end end -- plain variants diff --git a/tex/context/base/cldf-ini.lua b/tex/context/base/cldf-ini.lua index 62158e08b..43d5cebd1 100644 --- a/tex/context/base/cldf-ini.lua +++ b/tex/context/base/cldf-ini.lua @@ -315,13 +315,15 @@ local registerfunction, unregisterfunction, reservefunction, knownfunctions, cal interfaces.scanners = table.setmetatablenewindex(function(t,k,v) if storedscanners[k] then + -- report_cld("warning: scanner %a is already set",k) + -- os.exit() -- \scan_<k> is already in the format -- report_cld("using interface scanner: %s",k) else -- todo: allocate slot here and pass it storedscanners[k] = true -- report_cld("installing interface scanner: %s",k) - context("\\installctxfunction{scan_%s}{interfaces.scanners.%s}",k,k) + context("\\installctxfunction{clf_%s}{interfaces.scanners.%s}",k,k) end rawset(t,k,v) end) diff --git a/tex/context/base/cldf-scn.lua b/tex/context/base/cldf-scn.lua new file mode 100644 index 000000000..a3d8b0d87 --- /dev/null +++ b/tex/context/base/cldf-scn.lua @@ -0,0 +1,100 @@ +if not modules then modules = { } end modules ['cldf-scn'] = { + version = 1.001, + comment = "companion to cldf-ini.mkiv", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +if not tokens.setters then return end + +local load, type = load, type + +local formatters = string.formatters +local char = string.char +local concat = table.concat + +local f_action_f = formatters["action%s(%s)"] +local f_action_s = formatters["local action%s = action[%s]"] +local f_command = formatters["local action = tokens._action\n%\nt\nreturn function(%s) return %s end"] + +local interfaces = interfaces +local commands = commands +local scanners = interfaces.scanners + +local compile = tokens.compile or function() end + +local report = logs.reporter("interfaces","implementor") + +function interfaces.implement(specification) + local actions = specification.actions + local name = specification.name + local arguments = specification.arguments + local scope = specification.scope + if not actions then + if name then + report("error: no actions for %a",name) + else + report("error: no actions and no name") + end + return + end + local scanner = compile(specification) + if not name or name == "" then + return scanner + end + local command = nil + if type(actions) == "function" then + command = actions + elseif actions == context then + command = context + elseif #actions == 1 then + command = actions[1] + else + tokens._action = actions + local f = { } + local a = { } + local args = "" + if arguments then + for i=1,#arguments do + local v = arguments[i] + local t = type(v) + if t == "boolean" then + a[i] = tostring(v) + else + a[i] = char(96+i) + end + end + args = concat(a,",") + end + command = args + for i=1,#actions do + command = f_action_f(i,command) + f[#f+1] = f_action_s(i,i) + end + command = f_command(f,args,command) + command = load(command) + if command then + command = command() + end + tokens._action = nil + end + if scanners[name] then + report("warning: 'scanners.%s' is redefined",name) + end + scanners[name] = scanner + if scope == "private" then + return + end + if commands[name] then + report("warning: 'commands.%s' is redefined",name) + end + commands[name] = command + -- return scanner, command +end + +-- it's convenient to have copies here: + +interfaces.setmacro = tokens.setters.macro +interfaces.setcount = tokens.setters.count +interfaces.setdimen = tokens.setters.dimen diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv index 9891ab046..61bfc0ca9 100644 --- a/tex/context/base/cont-new.mkiv +++ b/tex/context/base/cont-new.mkiv @@ -11,7 +11,7 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -\newcontextversion{2015.03.10 12:09} +\newcontextversion{2015.03.25 22:13} %D This file is loaded at runtime, thereby providing an excellent place for %D hacks, patches, extensions and new features. diff --git a/tex/context/base/context-version.pdf b/tex/context/base/context-version.pdf Binary files differindex 2c2c7b0a5..4ffe51b69 100644 --- a/tex/context/base/context-version.pdf +++ b/tex/context/base/context-version.pdf diff --git a/tex/context/base/context.mkiv b/tex/context/base/context.mkiv index 7d6259737..8252c7b8c 100644 --- a/tex/context/base/context.mkiv +++ b/tex/context/base/context.mkiv @@ -28,7 +28,7 @@ %D up and the dependencies are more consistent. \edef\contextformat {\jobname} -\edef\contextversion{2015.03.10 12:09} +\edef\contextversion{2015.03.25 22:13} \edef\contextkind {beta} %D For those who want to use this: @@ -99,6 +99,9 @@ % From here on we have \unexpanded being \normalprotected, as we already had % \unexpanded long before etex came around. +\loadmarkfile{luat-ini} +\loadmarkfile{toks-ini} + \loadmarkfile{syst-aux} \loadmarkfile{syst-lua} \loadmarkfile{syst-con} @@ -106,6 +109,9 @@ \loadmarkfile{syst-fnt} \loadmarkfile{syst-rtp} +% \loadmarkfile{luat-ini} % moved up +% \loadmarkfile{toks-ini} % moved up + \loadmkvifile{file-ini} \loadmkvifile{file-res} \loadmkvifile{file-lib} @@ -126,9 +132,8 @@ \loadmarkfile{cldf-int} % interface -\loadmarkfile{luat-ini} +% \loadmarkfile{luat-ini} -\loadmarkfile{toks-ini} \loadmarkfile{toks-tra} %loadmarkfile{toks-map} % obsolete, never used @@ -419,7 +424,7 @@ \loadmarkfile{prop-ini} % only for downward compatibility -\loadmarkfile{mlib-ctx} +\loadmarkfile{mlib-ctx} % messy order \loadmarkfile{meta-ini} \loadmarkfile{meta-tex} diff --git a/tex/context/base/file-job.mkvi b/tex/context/base/file-job.mkvi index 243a8d856..171dc1a6a 100644 --- a/tex/context/base/file-job.mkvi +++ b/tex/context/base/file-job.mkvi @@ -241,13 +241,13 @@ \newsystemmode\v!environment \unexpanded\def\startprojectindeed - {\starttext + {%starttext \pushsystemmode\v!project \setsystemmode\v!project} \unexpanded\def\stopprojectindeed {\popsystemmode\v!project - \stoptext + %stoptext \signalendofinput\v!project} \unexpanded\def\startproductindeed diff --git a/tex/context/base/file-res.lua b/tex/context/base/file-res.lua index 458ef7276..78fdc3404 100644 --- a/tex/context/base/file-res.lua +++ b/tex/context/base/file-res.lua @@ -134,7 +134,7 @@ openers.fix = openers.file loaders.fix = loaders.file openers.set = openers.file loaders.set = loaders.file openers.any = openers.file loaders.any = loaders.file -function getreadfilename(scheme,path,name) -- better do a split and then pass table +local function getreadfilename(scheme,path,name) -- better do a split and then pass table local fullname if hasscheme(name) or is_qualified_path(name) then fullname = name diff --git a/tex/context/base/font-chk.lua b/tex/context/base/font-chk.lua index 591d59d65..e5c46dd62 100644 --- a/tex/context/base/font-chk.lua +++ b/tex/context/base/font-chk.lua @@ -17,6 +17,8 @@ local fastcopy = table.fastcopy local report_fonts = logs.reporter("fonts","checking") +local allocate = utilities.storage.allocate + local fonts = fonts fonts.checkers = fonts.checkers or { } @@ -88,7 +90,7 @@ end fonts.loggers.onetimemessage = onetimemessage -local mapping = { -- this is just an experiment to illustrate some principles elsewhere +local mapping = allocate { -- this is just an experiment to illustrate some principles elsewhere lu = "placeholder uppercase red", ll = "placeholder lowercase red", lt = "placeholder uppercase red", @@ -113,9 +115,15 @@ local mapping = { -- this is just an experiment to illustrate some principles el so = "placeholder lowercase yellow", } -table.setmetatableindex(mapping,function(t,k) v = "placeholder unknown gray" t[k] = v return v end) +table.setmetatableindex(mapping, + function(t,k) + v = "placeholder unknown gray" + t[k] = v + return v + end +) -local fakes = { +local fakes = allocate { { name = "lowercase", code = ".025 -.175 m .425 -.175 l .425 .525 l .025 .525 l .025 -.175 l .025 0 l .425 0 l .025 -.175 m h S", @@ -153,7 +161,7 @@ local fakes = { }, } -local variants = { +local variants = allocate { { tag = "gray", r = .6, g = .6, b = .6 }, { tag = "red", r = .6, g = 0, b = 0 }, { tag = "green", r = 0, g = .6, b = 0 }, diff --git a/tex/context/base/font-ctx.lua b/tex/context/base/font-ctx.lua index a7f915023..9f5559290 100644 --- a/tex/context/base/font-ctx.lua +++ b/tex/context/base/font-ctx.lua @@ -955,8 +955,11 @@ do -- else too many locals local ctx_setsomefontsize = context.fntsetsomesize local ctx_letvaluerelax = context.letvaluerelax + local starttiming = statistics.starttiming + local stoptiming = statistics.stoptiming + function commands.definefont_one(str) - statistics.starttiming(fonts) + starttiming(fonts) if trace_defining then report_defining("memory usage before: %s",statistics.memused()) report_defining("start stage one: %s",str) @@ -1186,7 +1189,7 @@ do -- else too many locals lastmathids[mathsize] = lastfontid end -- - statistics.stoptiming(fonts) + stoptiming(fonts) end function definers.define(specification) @@ -1195,7 +1198,7 @@ do -- else too many locals if not name or name == "" then return -1 else - statistics.starttiming(fonts) + starttiming(fonts) -- -- following calls expect a few properties to be set: -- @@ -1251,7 +1254,7 @@ do -- else too many locals constructors.finalize(tfmdata) return id, tfmdata end - statistics.stoptiming(fonts) + stoptiming(fonts) end end diff --git a/tex/context/base/font-map.lua b/tex/context/base/font-map.lua index e26f28e34..449a00f2e 100644 --- a/tex/context/base/font-map.lua +++ b/tex/context/base/font-map.lua @@ -23,6 +23,8 @@ local fonts = fonts or { } local mappings = fonts.mappings or { } fonts.mappings = mappings +local allocate = utilities.storage.allocate + --[[ldx-- <p>Eventually this code will disappear because map files are kind of obsolete. Some code may move to runtime or auxiliary modules.</p> @@ -194,7 +196,7 @@ local namesplitter = Ct(C((1 - ligseparator - varseparator)^1) * (ligseparator * -- to be completed .. for fonts that use unicodes for ligatures which -- is a actually a bad thing and should be avoided in the first place -local overloads = { +local overloads = allocate { IJ = { name = "I_J", unicode = { 0x49, 0x4A }, mess = 0x0132 }, ij = { name = "i_j", unicode = { 0x69, 0x6A }, mess = 0x0133 }, ff = { name = "f_f", unicode = { 0x66, 0x66 }, mess = 0xFB00 }, diff --git a/tex/context/base/grph-inc.lua b/tex/context/base/grph-inc.lua index d795deacf..283d7dc72 100644 --- a/tex/context/base/grph-inc.lua +++ b/tex/context/base/grph-inc.lua @@ -1560,6 +1560,7 @@ local epstopdf = { -dBATCH -dAutoRotatePages=/None -dPDFSETTINGS=/%presets% + -dCompatibilityLevel=%level% -dEPSCrop -sOutputFile="%newname%" "%oldname%" @@ -1605,6 +1606,7 @@ end function epsconverter.pdf(oldname,newname,resolution) -- the resolution interface might change local epstopdf = programs.epstopdf -- can be changed local presets = epstopdf.resolutions[resolution or "high"] or epstopdf.resolutions.high + local level = codeinjections.getformatoption("pdf_level") or "1.3" local tmpname = oldname if cleanups.ai then tmpname = cleaners.ai(oldname) diff --git a/tex/context/base/l-lpeg.lua b/tex/context/base/l-lpeg.lua index 192e32f3c..0c8970609 100644 --- a/tex/context/base/l-lpeg.lua +++ b/tex/context/base/l-lpeg.lua @@ -888,24 +888,155 @@ end -- return make(tree) -- end +local p_false = P(false) +local p_true = P(true) + +-- local function make(t,hash) +-- local p = p_false +-- local keys = sortedkeys(t) +-- for i=1,#keys do +-- local k = keys[i] +-- local v = t[k] +-- local h = hash[v] +-- if h then +-- if next(v) then +-- p = p + P(k) * (make(v,hash) + p_true) +-- else +-- p = p + P(k) * p_true +-- end +-- else +-- if next(v) then +-- p = p + P(k) * make(v,hash) +-- else +-- p = p + P(k) +-- end +-- end +-- end +-- return p +-- end + +-- local function make(t,hash) +-- local p = p_false +-- local keys = sortedkeys(t) +-- local function making(t,w) +-- local p = p_false +-- local keys = sortedkeys(t) +-- for i=1,#keys do +-- local k = keys[i] +-- local v = t[k] +-- if w then +-- if next(v) then +-- p = p + P(k) * (making(v,w) + p_true) +-- else +-- p = p + P(k) * p_true +-- end +-- else +-- if next(v) then +-- p = p + P(k) * making(v,w) +-- else +-- p = p + P(k) +-- end +-- end +-- end +-- return p +-- end +-- for i=1,#keys do +-- local k = keys[i] +-- local v = t[k] +-- local h = hash[v] +-- if h then +-- if next(v) then +-- p = p + P(k) * (making(v,true) + p_true) +-- else +-- p = p + P(k) * p_true +-- end +-- else +-- if next(v) then +-- p = p + P(k) * making(v,false) +-- else +-- p = p + P(k) +-- end +-- end +-- end +-- return p +-- end +-- +-- function lpeg.utfchartabletopattern(list) -- goes to util-lpg +-- local tree = { } +-- local hash = { } +-- local n = #list +-- if n == 0 then +-- for s in next, list do +-- local t = tree +-- for c in gmatch(s,".") do +-- local tc = t[c] +-- if not tc then +-- tc = { } +-- t[c] = tc +-- end +-- t = tc +-- end +-- hash[t] = s +-- end +-- else +-- for i=1,n do +-- local t = tree +-- local s = list[i] +-- for c in gmatch(s,".") do +-- local tc = t[c] +-- if not tc then +-- tc = { } +-- t[c] = tc +-- end +-- t = tc +-- end +-- hash[t] = s +-- end +-- end +-- return make(tree,hash) +-- end + + local function make(t,hash) - local p = P(false) + local p = p_false local keys = sortedkeys(t) + local function making(t,w) + local p = p_false + local keys = sortedkeys(t) + for i=1,#keys do + local k = keys[i] + local v = t[k] + if w then + if v == true then + p = p + P(k) * p_true + else + p = p + P(k) * (making(v,w) + p_true) + end + else + if v == true then + p = p + P(k) + else + p = p + P(k) * making(v,w) + end + end + end + return p + end for i=1,#keys do local k = keys[i] local v = t[k] local h = hash[v] if h then - if next(v) then - p = p + P(k) * (make(v,hash) + P(true)) + if v == true then + p = p + P(k) * p_true else - p = p + P(k) * P(true) + p = p + P(k) * (making(v,true) + p_true) end else - if next(v) then - p = p + P(k) * make(v,hash) - else + if v == true then p = p + P(k) + else + p = p + P(k) * making(v,false) end end end @@ -914,41 +1045,62 @@ end function lpeg.utfchartabletopattern(list) -- goes to util-lpg local tree = { } - local hash = { } +-- local hash = { } + local hash local n = #list if n == 0 then - -- we could always use this branch + hash = list for s in next, list do local t = tree + local p, pk for c in gmatch(s,".") do - local tc = t[c] - if not tc then - tc = { } - t[c] = tc + if t == true then + t = { [c] = true } + p[pk] = t + p = t + t = true + else + local tc = t[c] + if not tc then + tc = true + t[c] = tc + end + p = t + t = tc end - t = tc + pk = c end - hash[t] = s end else + hash = { } for i=1,n do local t = tree local s = list[i] + local p, pk for c in gmatch(s,".") do - local tc = t[c] - if not tc then - tc = { } - t[c] = tc + if t == true then + t = { [c] = true } + p[pk] = t + p = t + t = true + else + local tc = t[c] + if not tc then + tc = true + t[c] = true + end + p = t + t = tc end - t = tc + pk = c end - hash[t] = s + hash[s] = true end end return make(tree,hash) end --- inspect ( lpeg.utfchartabletopattern { +-- lpeg.utfchartabletopattern { -- utfchar(0x00A0), -- nbsp -- utfchar(0x2000), -- enquad -- utfchar(0x2001), -- emquad @@ -964,7 +1116,7 @@ end -- utfchar(0x200B), -- zerowidthspace -- utfchar(0x202F), -- narrownobreakspace -- utfchar(0x205F), -- math thinspace --- } ) +-- } -- a few handy ones: -- diff --git a/tex/context/base/lang-hyp.lua b/tex/context/base/lang-hyp.lua index 60e1699ca..68edcfc85 100644 --- a/tex/context/base/lang-hyp.lua +++ b/tex/context/base/lang-hyp.lua @@ -591,6 +591,7 @@ if context then local glyph_code = nodecodes.glyph local disc_code = nodecodes.disc local math_code = nodecodes.math + local hlist_code = nodecodes.hlist local discretionary_code = disccodes.discretionary local explicit_code = disccodes.explicit @@ -614,6 +615,7 @@ if context then local getnext = nuts.getnext local getprev = nuts.getprev local getsubtype = nuts.getsubtype + local getlist = nuts.getlist local insert_before = nuts.insert_before local insert_after = nuts.insert_after local copy_node = nuts.copy @@ -667,42 +669,48 @@ if context then if specification then local resources = specification.resources if resources then - local patterns = resources.patterns - if patterns then - local data = patterns.data - if data then - -- regular patterns - lpegmatch(p_pattern,data,1,dictionary.patterns,dictionary.specials) - end - local extra = patterns.extra - if extra then - -- special patterns - lpegmatch(p_pattern,extra,1,dictionary.patterns,dictionary.specials) - end - end - local exceptions = resources.exceptions - if exceptions then - local data = exceptions.data - if data and data ~= "" then - lpegmatch(p_exception,data,1,dictionary.exceptions) - end - end - local usedchars = lpegmatch(p_split,patterns.characters) - local characters = { } - local unicodes = { } - for i=1,#usedchars do - local char = usedchars[i] - local code = utfbyte(char) - local upper = uccodes[code] - characters[char] = code - unicodes [code] = char - if type(upper) == "table" then - for i=1,#upper do - local u = upper[i] - unicodes[u] = utfchar(u) + local characters = dictionary.characters or { } + local unicodes = dictionary.unicodes or { } + for i=1,#resources do + local r = resources[i] + if not r.in_dictionary then + r.in_dictionary = true + local patterns = r.patterns + if patterns then + local data = patterns.data + if data then + -- regular patterns + lpegmatch(p_pattern,data,1,dictionary.patterns,dictionary.specials) + end + local extra = patterns.extra + if extra then + -- special patterns + lpegmatch(p_pattern,extra,1,dictionary.patterns,dictionary.specials) + end + end + local exceptions = r.exceptions + if exceptions then + local data = exceptions.data + if data and data ~= "" then + lpegmatch(p_exception,data,1,dictionary.exceptions) + end + end + local usedchars = lpegmatch(p_split,patterns.characters) + for i=1,#usedchars do + local char = usedchars[i] + local code = utfbyte(char) + local upper = uccodes[code] + characters[char] = code + unicodes [code] = char + if type(upper) == "table" then + for i=1,#upper do + local u = upper[i] + unicodes[u] = utfchar(u) + end + else + unicodes[upper] = utfchar(upper) + end end - else - unicodes[upper] = utfchar(upper) end end dictionary.characters = characters @@ -1423,11 +1431,24 @@ if context then return head, done end - function hyphenators.handler(head) + local getcount = tex.getcount + + hyphenators.optimize = false + + function hyphenators.handler(head,groupcode) if usedmethod then - return usedmethod(head) + if groupcode == "hbox" and hyphenators.optimize then + if getcount("hyphenstate") > 0 then + forced = false + return usedmethod(head) + else + return head, false + end + else + return usedmethod(head) + end else - return head, done + return head, false end end @@ -1435,16 +1456,22 @@ if context then methods.original = original methods.expanded = expanded methods.traditional = languages.hyphenators.traditional.hyphenate - methods.none = function(head) return head, false end + methods.none = false -- function(head) return head, false end usedmethod = original local function setmethod(method) - usedmethod = type(method) == "string" and methods[method] or methods.tex + usedmethod = type(method) == "string" and methods[method] + if usedmethod == nil then + usedmethod = methods.tex + end end local function pushmethod(method) insert(stack,usedmethod) - setmethod(method) + usedmethod = type(method) == "string" and methods[method] + if usedmethod == nil then + usedmethod = methods.tex + end end local function popmethod() usedmethod = remove(stack) or methods.tex @@ -1497,6 +1524,17 @@ if context then end end + function nodes.stripdiscretionaries(head) + local h = tonut(head) + for l in traverse_id(hlist_code,h) do + for d in traverse_id(disc_code,getlist(l)) do + remove_node(h,false,true) + end + end + return tonode(h) + end + + else -- traditional.loadpatterns("nl","lang-nl") diff --git a/tex/context/base/lang-ini.lua b/tex/context/base/lang-ini.lua index 0c3d9d80b..27bab6129 100644 --- a/tex/context/base/lang-ini.lua +++ b/tex/context/base/lang-ini.lua @@ -131,7 +131,10 @@ local function loaddefinitions(tag,specification) if trace_patterns then report_initialization("pattern specification for language %a: %s",tag,specification.patterns) end - local dataused, ok = data.used, false + local dataused = data.used + local ok = false + local resources = data.resources or { } + data.resources = resources for i=1,#definitions do local definition = definitions[i] if definition == "" then @@ -153,14 +156,15 @@ local function loaddefinitions(tag,specification) report_initialization("loading definition %a for language %a from %a",definition,tag,fullname) end local suffix, gzipped = gzip.suffix(fullname) - local resources = table.load(fullname,gzipped and gzip.load) - if resources then -- todo: version test + local loaded = table.load(fullname,gzipped and gzip.load) + if loaded then -- todo: version test ok, nofloaded = true, nofloaded + 1 - -- instance:patterns (resources.patterns and resources.patterns .data or "") - -- instance:hyphenation(resources.exceptions and resources.exceptions.data or "") - instance:patterns (validdata(resources.patterns, "patterns", tag) or "") - instance:hyphenation(validdata(resources.exceptions,"exceptions",tag) or "") - data.resources = resources -- so we can use them otherwise + -- instance:patterns (loaded.patterns and resources.patterns .data or "") + -- instance:hyphenation(loaded.exceptions and resources.exceptions.data or "") + instance:patterns (validdata(loaded.patterns, "patterns", tag) or "") + instance:hyphenation(validdata(loaded.exceptions,"exceptions",tag) or "") + resources[#resources+1] = loaded -- so we can use them otherwise + else report_initialization("invalid definition %a for language %a in %a",definition,tag,filename) end diff --git a/tex/context/base/lang-ini.mkiv b/tex/context/base/lang-ini.mkiv index 71b631be9..ddd7a8808 100644 --- a/tex/context/base/lang-ini.mkiv +++ b/tex/context/base/lang-ini.mkiv @@ -438,6 +438,10 @@ \the\everylanguage \relax} +% experimental + +\newcount\hyphenstate + % so far \newcount\hyphenminoffset diff --git a/tex/context/base/lpdf-ano.lua b/tex/context/base/lpdf-ano.lua index ac608baa4..f5e320a00 100644 --- a/tex/context/base/lpdf-ano.lua +++ b/tex/context/base/lpdf-ano.lua @@ -117,7 +117,7 @@ local pdf_border_color = nil local set_border = false local function pdfborder() - border_set = true + set_border = true return pdf_border_style, pdf_border_color end diff --git a/tex/context/base/lpdf-xmp.lua b/tex/context/base/lpdf-xmp.lua index 739b29ef7..695f0224a 100644 --- a/tex/context/base/lpdf-xmp.lua +++ b/tex/context/base/lpdf-xmp.lua @@ -157,7 +157,7 @@ local function flushxmpinfo() local producer = format("LuaTeX-%0.2f.%s",tex.luatexversion/100,tex.luatexrevision) local creator = "LuaTeX + ConTeXt MkIV" local time = lpdf.timestamp() - local fullbanner = tex.pdftexbanner + local fullbanner = status.banner -- local fullbanner = gsub(tex.pdftexbanner,"kpse.*","") pdfaddxmpinfo("DocumentID", documentid) diff --git a/tex/context/base/luat-cnf.lua b/tex/context/base/luat-cnf.lua index cf8a1e7e0..0f6b8598f 100644 --- a/tex/context/base/luat-cnf.lua +++ b/tex/context/base/luat-cnf.lua @@ -64,7 +64,7 @@ function texconfig.init() "string", "table", "coroutine", "debug", "file", "io", "lpeg", "math", "os", "package", "bit32", }, basictex = { -- noad - "callback", "font", "img", "lang", "lua", "node", "pdf", "status", "tex", "texconfig", "texio", "token", + "callback", "font", "img", "lang", "lua", "node", "pdf", "status", "tex", "texconfig", "texio", "token", "newtoken" }, extralua = { "gzip", "zip", "zlib", "lfs", "ltn12", "mime", "socket", "md5", "profiler", "unicode", "utf", @@ -75,6 +75,7 @@ function texconfig.init() obsolete = { "fontforge", -- can be filled by luat-log "kpse", + "token", }, functions = { "assert", "pcall", "xpcall", "error", "collectgarbage", diff --git a/tex/context/base/luat-ini.mkiv b/tex/context/base/luat-ini.mkiv index 168b52095..78a324db2 100644 --- a/tex/context/base/luat-ini.mkiv +++ b/tex/context/base/luat-ini.mkiv @@ -34,7 +34,7 @@ % the \type {\normalexpanded} around \type {\directlua}. Something to discuss % in the team. -\unexpanded\def\startlua % \stoplua +\normalprotected\def\startlua % \stoplua {\begingroup \obeylualines \luat_start_lua_indeed} @@ -42,7 +42,7 @@ \def\luat_start_lua_indeed#1\stoplua {\normalexpanded{\endgroup\noexpand\directlua{#1}}} % \zerocount is default -\unexpanded\def\startluacode % \stopluacode +\normalprotected\def\startluacode % \stopluacode {\begingroup \obeylualines \obeyluatokens @@ -77,7 +77,7 @@ \edef\lua_letter_seven {\string\7} \edef\lua_letter_eight {\string\8} \edef\lua_letter_nine {\string\9} \edef\lua_letter_zero {\string\0} -\appendtoks +\everyluacode {% \appendtoks \let\\\lua_letter_backslash \let\|\lua_letter_bar \let\-\lua_letter_dash \let\(\lua_letter_lparent \let\)\lua_letter_rparent @@ -92,13 +92,12 @@ \let\5\lua_letter_five \let\6\lua_letter_six \let\7\lua_letter_seven \let\8\lua_letter_eight \let\9\lua_letter_nine \let\0\lua_letter_zero -\to \everyluacode +} % \to \everyluacode -\unexpanded\def\obeyluatokens +\normalprotected\def\obeyluatokens {\setcatcodetable\luacatcodes \the\everyluacode} - \edef\luamajorversion{\ctxwrite{_MINORVERSION}} \edef\luaminorversion{\ctxwrite{_MAJORVERSION}} @@ -107,35 +106,30 @@ %D %D We provide an interface for defining instances: -\def\s!lua{lua} \def\v!code{code} \def\!!name{name} \def\s!data{data} +\def\s!lua {lua} +\def\s!code {code} +\def\s!data {data} +\def\s!start{start} +\def\s!stop {stop} %D Beware: because \type {\expanded} is een convert command, the error %D message will show \type{<inserted text>} as part of the message. -\installcorenamespace{luacode} +\installsystemnamespace{luacode} -\unexpanded\def\luat_start_named_lua_code#1% +\normalprotected\def\luat_start_named_lua_code#1% {\begingroup \obeylualines \obeyluatokens \csname\??luacode#1\endcsname} -% \unexpanded\def\definenamedlua[#1]#2[#3]% no optional arg handling here yet / we could use numbers instead (more efficient) -% {\ifcsname\??luacode#1\endcsname \else -% \scratchcounter\ctxlua{lua.registername("#1","#3")}% -% \normalexpanded{\xdef\csname\??luacode#1\endcsname##1\csname\e!stop#1\v!code\endcsname}% -% {\noexpand\normalexpanded{\endgroup\noexpand\directlua\the\scratchcounter{_G=protect("#1\s!data")##1}}}% -% \expandafter\edef\csname\e!start#1\v!code\endcsname {\luat_start_named_lua_code{#1}}% -% \expandafter\edef\csname #1\v!code\endcsname##1{\noexpand\directlua\the\scratchcounter{_G=protect("#1\s!data")##1}}% -% \fi} - -\unexpanded\def\definenamedlua[#1]#2[#3]% no optional arg handling here yet / we could use numbers instead (more efficient) +\normalprotected\def\definenamedlua[#1]#2[#3]% no optional arg handling here yet / we could use numbers instead (more efficient) {\ifcsname\??luacode#1\endcsname \else \expandafter\chardef\csname\??luacode:#1\endcsname\ctxlua{lua.registername("#1","#3")}% - \normalexpanded{\xdef\csname\??luacode#1\endcsname##1\csname\e!stop#1\v!code\endcsname}% + \normalexpanded{\xdef\csname\??luacode#1\endcsname##1\csname\s!stop#1\s!code\endcsname}% {\noexpand\normalexpanded{\endgroup\noexpand\directlua\csname\??luacode:#1\endcsname{_G=protect("#1\s!data")##1}}}% - \expandafter\edef\csname\e!start#1\v!code\endcsname {\luat_start_named_lua_code{#1}}% - \expandafter\edef\csname #1\v!code\endcsname##1{\noexpand\directlua\csname\??luacode:#1\endcsname{_G=protect("#1\s!data")##1}}% + \expandafter\edef\csname\s!start#1\s!code\endcsname {\luat_start_named_lua_code{#1}}% + \expandafter\edef\csname #1\s!code\endcsname##1{\noexpand\directlua\csname\??luacode:#1\endcsname{_G=protect("#1\s!data")##1}}% \fi} %D We predefine a few. @@ -221,7 +215,7 @@ %D Experimental: -\unexpanded\def\startluaparameterset[#1]% +\normalprotected\def\startluaparameterset[#1]% {\begingroup \obeylualines \obeyluatokens @@ -260,7 +254,7 @@ %D \ctxluacode{context("%0.5f",1/3)} %D \stoptyping -\unexpanded\def\ctxluacode +\normalprotected\def\ctxluacode {\begingroup \obeylualines \obeyluatokens @@ -289,7 +283,7 @@ % \dorecurse{10000}{\ctxlua{context(" C3 ")}} \page % \stoptext -\installcorenamespace{ctxfunction} +\installsystemnamespace{ctxfunction} \normalprotected\def\startctxfunctiondefinition #1 % {\begingroup \obeylualines \obeyluatokens \luat_start_lua_function_definition_indeed{#1}} @@ -297,17 +291,17 @@ % \def\luat_start_lua_function_definition_indeed#1#2\stopctxfunctiondefinition % {\endgroup\expandafter\edef\csname#1\endcsname{\noexpand\luafunction\ctxcommand{ctxfunction(\!!bs#2\!!es)}\relax}} -\installcorenamespace{luafunction} +\installsystemnamespace{luafunction} \def\luat_start_lua_function_definition_indeed#1#2\stopctxfunctiondefinition {\endgroup \expandafter\chardef\csname\??luafunction#1\endcsname\ctxcommand{ctxfunction(\!!bs#2\!!es)}\relax \expandafter\edef\csname#1\endcsname{\noexpand\luafunction\csname\??luafunction#1\endcsname}} -% \unexpanded\def\setctxluafunction#1#2% experiment +% \normalprotected\def\setctxluafunction#1#2% experiment % {\expandafter\chardef\csname#1\endcsname#2\relax} -\unexpanded\def\setctxluafunction#1#2% experiment +\normalprotected\def\setctxluafunction#1#2% experiment {\expandafter\chardef\csname\??luafunction#1\endcsname#2\relax \expandafter\edef\csname#1\endcsname{\noexpand\luafunction\csname\??luafunction#1\endcsname}} diff --git a/tex/context/base/lxml-ini.lua b/tex/context/base/lxml-ini.lua new file mode 100644 index 000000000..434814b66 --- /dev/null +++ b/tex/context/base/lxml-ini.lua @@ -0,0 +1,131 @@ +if not modules then modules = { } end modules ['lxml-ini'] = { + version = 1.001, + comment = "this module is the basis for the lxml-* ones", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +local xml = xml +local lxml = lxml + +local scanners = tokens.scanners +local scanstring = scanners.string + +scanners.lxmlid = function() return getid(scanstring()) end + +local implement = interfaces.implement + +-- lxml.id + +implement { name = "xmldoif", actions = lxml.doif, arguments = { "string", "string" } } +implement { name = "xmldoifnot", actions = lxml.doifnot, arguments = { "string", "string" } } +implement { name = "xmldoifelse", actions = lxml.doifelse, arguments = { "string", "string" } } +implement { name = "xmldoiftext", actions = lxml.doiftext, arguments = { "string", "string" } } +implement { name = "xmldoifnottext", actions = lxml.doifnottext, arguments = { "string", "string" } } +implement { name = "xmldoifelsetext", actions = lxml.doifelsetext, arguments = { "string", "string" } } + +implement { name = "xmldoifempty", actions = lxml.doifempty, arguments = { "string", "string" } } +implement { name = "xmldoifnotempty", actions = lxml.doifnotempty, arguments = { "string", "string" } } +implement { name = "xmldoifelseempty", actions = lxml.doifelseempty, arguments = { "string", "string" } } +implement { name = "xmldoifselfempty", actions = lxml.doifempty, arguments = "string" } +implement { name = "xmldoifnotselfempty", actions = lxml.doifnotempty, arguments = "string" } +implement { name = "xmldoifelseselfempty", actions = lxml.doifelseempty, arguments = "string" } + +--------- { name = "xmlcontent", actions = lxml.content, arguments = "string" } +--------- { name = "xmlflushstripped", actions = lxml.strip, arguments = { "string", true } } +implement { name = "xmlall", actions = lxml.all, arguments = { "string", "string" } } +implement { name = "xmlatt", actions = lxml.att, arguments = { "string", "string" } } +implement { name = "xmlattdef", actions = lxml.att, arguments = { "string", "string", "string" } } +implement { name = "xmlattribute", actions = lxml.attribute, arguments = { "string", "string", "string" } } +implement { name = "xmlattributedef", actions = lxml.attribute, arguments = { "string", "string", "string", "string" } } +implement { name = "xmlchainatt", actions = lxml.chainattribute, arguments = { "string", "string", "string" } } +implement { name = "xmlchainattdef", actions = lxml.chainattribute, arguments = { "string", "string", "string", "string" } } +implement { name = "xmlchecknamespace", actions = xml.checknamespace, arguments = { "lxmlid", "string", "string" } } +implement { name = "xmlcommand", actions = lxml.command, arguments = { "string", "string", "string" } } +implement { name = "xmlconcat", actions = lxml.concat, arguments = { "string", "string", "string" } } -- \detokenize{#3} +implement { name = "xmlconcatrange", actions = lxml.concatrange, arguments = { "string", "string", "string", "string", "string" } } -- \detokenize{#5} +implement { name = "xmlcontext", actions = lxml.context, arguments = { "string", "string" } } +implement { name = "xmlcount", actions = lxml.count, arguments = { "string", "string" } } +implement { name = "xmldelete", actions = lxml.delete, arguments = { "string", "string" } } +implement { name = "xmldirect", actions = lxml.direct, arguments = "string" } +implement { name = "xmldirectives", actions = lxml.directives.setup, arguments = "string" } +implement { name = "xmldirectivesafter", actions = lxml.directives.after, arguments = "string" } +implement { name = "xmldirectivesbefore", actions = lxml.directives.before, arguments = "string" } +implement { name = "xmldisplayverbatim", actions = lxml.displayverbatim, arguments = "string" } +implement { name = "xmlelement", actions = lxml.element, arguments = { "string", "integer" } } +implement { name = "xmlfilter", actions = lxml.filter, arguments = { "string", "string" } } +implement { name = "xmlfilterlist", actions = lxml.filterlist, arguments = { "string", "string" } } +implement { name = "xmlfirst", actions = lxml.first, arguments = { "string", "string" } } +implement { name = "xmlflush", actions = lxml.flush, arguments = "string" } +implement { name = "xmlflushcontext", actions = lxml.context, arguments = "string" } +implement { name = "xmlflushlinewise", actions = lxml.flushlinewise, arguments = "string" } +implement { name = "xmlflushspacewise", actions = lxml.flushspacewise, arguments = "string" } +implement { name = "xmlfunction", actions = lxml.applyfunction, arguments = { "string", "string" } } +implement { name = "xmlinclude", actions = lxml.include, arguments = { "string", "string", "string", true } } +implement { name = "xmlincludeoptions", actions = lxml.include, arguments = { "string", "string", "string", "string" } } +implement { name = "xmlinclusion", actions = lxml.inclusion, arguments = "string" } +implement { name = "xmlinclusions", actions = lxml.inclusions, arguments = "string" } +implement { name = "xmlindex", actions = lxml.index, arguments = { "string", "string", "integer" } } +implement { name = "xmlinfo", actions = lxml.info, arguments = "string" } +implement { name = "xmlinlineverbatim", actions = lxml.inlineverbatim, arguments = "string" } +implement { name = "xmllast", actions = lxml.last, arguments = "string" } +implement { name = "xmlload", actions = lxml.load, arguments = { "string", "string", "string", "string" } } +implement { name = "xmlloadbuffer", actions = lxml.loadbuffer, arguments = { "string", "string", "string", "string" } } +implement { name = "xmlloaddata", actions = lxml.loaddata, arguments = { "string", "string", "string", "string" } } +implement { name = "xmlloaddirectives", actions = lxml.directives.load, arguments = "string" } +implement { name = "xmlloadregistered", actions = lxml.loadregistered, arguments = { "string", "string", "string" } } +implement { name = "xmlmain", actions = lxml.main, arguments = "string" } +implement { name = "xmlmatch", actions = lxml.match, arguments = "string" } +implement { name = "xmlname", actions = lxml.name, arguments = "string" } +implement { name = "xmlnamespace", actions = lxml.namespace, arguments = "string" } +implement { name = "xmlnonspace", actions = lxml.nonspace, arguments = { "string", "string" } } +implement { name = "xmlpos", actions = lxml.pos, arguments = "string" } +implement { name = "xmlraw", actions = lxml.raw, arguments = { "string", "string" } } +implement { name = "xmlregisterns", actions = xml.registerns, arguments = { "string", "string" } } +implement { name = "xmlremapname", actions = xml.remapname, arguments = { "lxmlid", "string","string","string" } } +implement { name = "xmlremapnamespace", actions = xml.renamespace, arguments = { "lxmlid", "string", "string" } } +implement { name = "xmlsave", actions = lxml.save, arguments = { "string", "string" } } +implement { name = "xmlsetfunction", actions = lxml.setaction, arguments = { "string", "string", "string" } } +implement { name = "xmlsetsetup", actions = lxml.setsetup, arguments = { "string", "string", "string" } } +implement { name = "xmlsnippet", actions = lxml.snippet, arguments = { "string", "integer" } } +implement { name = "xmlstrip", actions = lxml.strip, arguments = { "string", "string" } } +implement { name = "xmlstripanywhere", actions = lxml.strip, arguments = { "string", "string", true, true } } +implement { name = "xmlstripnolines", actions = lxml.strip, arguments = { "string", "string", true } } +implement { name = "xmlstripped", actions = lxml.stripped, arguments = { "string", "string" } } +implement { name = "xmlstrippednolines", actions = lxml.stripped, arguments = { "string", "string", true } } +implement { name = "xmltag", actions = lxml.tag, arguments = "string" } +implement { name = "xmltext", actions = lxml.text, arguments = { "string", "string" } } +implement { name = "xmltobuffer", actions = lxml.tobuffer, arguments = { "string", "string", "string" } } +implement { name = "xmltobufferverbose", actions = lxml.tobuffer, arguments = { "string", "string", "string", true } } +implement { name = "xmltofile", actions = lxml.tofile, arguments = { "string", "string", "string" } } +implement { name = "xmltoparameters", actions = lxml.toparameters, arguments = "string" } +implement { name = "xmlverbatim", actions = lxml.verbatim, arguments = "string" } + +implement { name = "xmlstartraw", actions = lxml.startraw } +implement { name = "xmlstopraw", actions = lxml.stopraw } + +implement { name = "xmlprependsetup", actions = lxml.installsetup, arguments = { 1, "string", "string" } } -- 2:* +implement { name = "xmlappendsetup", actions = lxml.installsetup, arguments = { 2, "string", "string" } } -- 2:* +implement { name = "xmlbeforesetup", actions = lxml.installsetup, arguments = { 3, "string", "string", "string" } } -- 2:* +implement { name = "xmlaftersetup", actions = lxml.installsetup, arguments = { 4, "string", "string", "string" } } -- 2:* +implement { name = "xmlprependdocumentsetup", actions = lxml.installsetup, arguments = { 1, "string", "string" } } +implement { name = "xmlappenddocumentsetup", actions = lxml.installsetup, arguments = { 2, "string", "string" } } +implement { name = "xmlbeforedocumentsetup", actions = lxml.installsetup, arguments = { 3, "string", "string", "string" } } +implement { name = "xmlafterdocumentsetup", actions = lxml.installsetup, arguments = { 4, "string", "string" } } +implement { name = "xmlremovesetup", actions = lxml.removesetup, arguments = { "string", "string" } } -- 1:* +implement { name = "xmlremovedocumentsetup", actions = lxml.removesetup, arguments = { "string", "string" } } +implement { name = "xmlflushdocumentsetups", actions = lxml.flushsetups, arguments = { "string", "string", "string" } } -- 2:* +implement { name = "xmlresetdocumentsetups", actions = lxml.resetsetups, arguments = "string" } + +implement { name = "xmlgetindex", actions = lxml.getindex, arguments = { "string", "string" } } +implement { name = "xmlwithindex", actions = lxml.withindex, arguments = { "string", "string", "string" } } + +implement { name = "xmlsetentity", actions = xml.registerentity, arguments = { "string", "string" } } +implement { name = "xmltexentity", actions = lxml.registerentity, arguments = { "string", "string" } } + +implement { name = "xmlsetcommandtotext", actions = lxml.setcommandtotext, arguments = "string" } +implement { name = "xmlsetcommandtonone", actions = lxml.setcommandtonone, arguments = "string" } + +implement { name = "xmlstarttiming", actions = function() statistics.starttiming(lxml) end } +implement { name = "xmlstoptiming", actions = function() statistics.stoptiming (lxml) end } diff --git a/tex/context/base/lxml-ini.mkiv b/tex/context/base/lxml-ini.mkiv index a7cdff862..d82023c39 100644 --- a/tex/context/base/lxml-ini.mkiv +++ b/tex/context/base/lxml-ini.mkiv @@ -56,7 +56,6 @@ %def\xmlcontent #1{\ctxlxml{content("#1")}} %def\xmlflushstripped #1{\ctxlxml{strip("#1",true)}} \def\xmldirect #1{\ctxlxml{direct("#1")}} % in loops, not dt but root -\def\xmlidx #1#2#3{\ctxlxml{idx("#1","#2",\number#3)}} % not ok \def\xmlinclude #1#2#3{\ctxlxml{include("#1","#2","#3",true)}} \def\xmlincludeoptions#1#2#3#4{\ctxlxml{include("#1","#2","#3","#4")}} \def\xmlinclusion #1{\ctxlxml{inclusion("#1")}} @@ -78,7 +77,7 @@ \def\xmlremapname #1#2#3#4{\ctxlua{xml.remapname(lxml.id("#1"),"#2","#3","#4")}} % element \def\xmlremapnamespace #1#2#3{\ctxlua{xml.renamespace(lxml.id("#1"),"#2","#3")}} % document \def\xmlchecknamespace #1#2#3{\ctxlua{xml.checknamespace(lxml.id("#1"),"#2","#3")}} % element -\def\xmlsetfunction #1#2#3{\ctxlxml{setaction("#1",\!!bs#2\!!es,#3)}} +\def\xmlsetfunction #1#2#3{\ctxlxml{setaction("#1",\!!bs#2\!!es,"#3")}} \def\xmlsetsetup #1#2#3{\ctxlxml{setsetup("#1",\!!bs#2\!!es,"#3")}} \def\xmlstrip #1#2{\ctxlxml{strip("#1","#2")}} \def\xmlstripnolines #1#2{\ctxlxml{strip("#1","#2",true)}} @@ -345,7 +344,6 @@ %D Experimental: \def\xmlgetindex #1{\ctxlxml{getindex("\xmldocument","#1")}} -\def\xmlrawindex #1{\ctxlxml{rawindex("#1")}} \def\xmlwithindex #1#2{\ctxlxml{withindex("\xmldocument","#1","#2")}} \def\xmlreference #1#2{\string\xmlwithindex{#1}{#2}} diff --git a/tex/context/base/m-hemistich.mkiv b/tex/context/base/m-hemistich.mkiv index 55fde7b92..685b1670f 100644 --- a/tex/context/base/m-hemistich.mkiv +++ b/tex/context/base/m-hemistich.mkiv @@ -41,21 +41,29 @@ {\scratchwidth\availablehsize} {\scratchwidth\hemistichparameter\c!width\relax}% \spaceskip\zeropoint\s!plus\plusone\s!fill\relax + \dostarttagged\t!division\currenthemistich \hbox to \scratchwidth\bgroup \scratchwidth.5\dimexpr\scratchwidth-\hemistichparameter\c!distance\relax \hbox to \scratchwidth\bgroup + \dostarttagged\t!construct\c!lefttext \usehemistichstyleandcolor\c!leftstyle\c!leftcolor#3% + \dostoptagged \egroup \hss \begingroup + \dostarttagged\t!construct\c!separator \usehemistichstyleandcolor\c!separatorstyle\c!separatorcolor \hemistichparameter\c!separator + \dostoptagged \endgroup \hss \hbox to \scratchwidth\bgroup + \dostarttagged\t!construct\c!righttext \usehemistichstyleandcolor\c!rightstyle\c!rightcolor#4% + \dostoptagged \egroup \egroup + \dostoptagged \endgroup} \unexpanded\def\hemistichescaesura#1#2#3% diff --git a/tex/context/base/m-translate.mkiv b/tex/context/base/m-translate.mkiv index f36f9a9fb..2e6cbe950 100644 --- a/tex/context/base/m-translate.mkiv +++ b/tex/context/base/m-translate.mkiv @@ -22,12 +22,34 @@ local compiled, list = nil, nil + -- function translators.register(from,to) + -- local l = lpeg.P(from)/to + -- if not list then + -- list = l + -- else + -- list = list + l + -- end + -- compiled = nil + -- end + -- + -- function translators.translate(s) + -- if list then + -- if not compiled then + -- compiled = lpeg.Cs((list + lpeg.P(1))^0) + -- end + -- return compiled:match(s) + -- else + -- return s + -- end + -- end + + -- local function prepare() + function translators.register(from,to) - local l = lpeg.P(from)/to if not list then - list = l + list = { [from] = to } else - list = list + l + list[from] = to end compiled = nil end @@ -35,7 +57,8 @@ function translators.translate(s) if list then if not compiled then - compiled = lpeg.Cs((list + lpeg.P(1))^0) + local tree = lpeg.utfchartabletopattern(list) + compiled = lpeg.Cs((tree/list + lpeg.patterns.utf8character)^0 * lpeg.P(-1)) -- the P(1) is needed in order to accept non utf end return compiled:match(s) else diff --git a/tex/context/base/mlib-run.lua b/tex/context/base/mlib-run.lua index 61089e7e6..ef4db6941 100644 --- a/tex/context/base/mlib-run.lua +++ b/tex/context/base/mlib-run.lua @@ -44,6 +44,8 @@ local texerrormessage = logs.texerrormessage local starttiming = statistics.starttiming local stoptiming = statistics.stoptiming +local formatters = string.formatters + local mplib = mplib metapost = metapost or { } local metapost = metapost @@ -177,11 +179,11 @@ function metapost.reporterror(result) return true end -local preamble = [[ +local f_preamble = formatters [ [[ boolean mplib ; mplib := true ; let dump = endinput ; input "%s" ; -]] +]] ] local methods = { double = "double", @@ -199,6 +201,20 @@ function metapost.scripterror(str) report_metapost("script error: %s",str) end +-- todo: random_seed + +local f_textext = formatters[ [[rawtextext("%s")]] ] + +function metapost.maketext(s,mode) + if mode and mode == 1 then + -- report_metapost("ignoring verbatimtex: %s",s) + else + -- report_metapost("handling btex ... etex: %s",s) + s = gsub(s,'"','"&ditto&"') + return f_textext(s) + end +end + function metapost.load(name,method) starttiming(mplib) method = method and methods[method] or "scaled" @@ -207,13 +223,15 @@ function metapost.load(name,method) math_mode = method, run_script = metapost.runscript, script_error = metapost.scripterror, + make_text = metapost.maketext, + extensions = 1, } report_metapost("initializing number mode %a",method) local result if not mpx then result = { status = 99, error = "out of memory"} else - result = mpx:execute(format(preamble, file.addsuffix(name,"mp"))) -- addsuffix is redundant + result = mpx:execute(f_preamble(file.addsuffix(name,"mp"))) -- addsuffix is redundant end stoptiming(mplib) metapost.reporterror(result) @@ -317,10 +335,11 @@ function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass, if not mp_inp[mpx] then mp_tag = mp_tag + 1 local jobname = tex.jobname - mp_inp[mpx] = io.open(format("%s-mplib-run-%03i.mp", jobname,mp_tag),"w") - mp_log[mpx] = io.open(format("%s-mplib-run-%03i.log",jobname,mp_tag),"w") + mp_inp[mpx] = io.open(formatters["%s-mplib-run-%03i.mp"] (jobname,mp_tag,"w")) + mp_log[mpx] = io.open(formatters["%s-mplib-run-%03i.log"](jobname,mp_tag,"w")) end - local banner = format("%% begin graphic: n=%s, trialrun=%s, multipass=%s, isextrapass=%s\n\n", metapost.n, tostring(trialrun), tostring(multipass), tostring(isextrapass)) + local banner = formatters["%% begin graphic: n=%s, trialrun=%s, multipass=%s, isextrapass=%s\n\n"]( + metapost.n, tostring(trialrun), tostring(multipass), tostring(isextrapass)) mp_inp[mpx]:write(banner) mp_log[mpx]:write(banner) end @@ -359,9 +378,9 @@ function metapost.process(mpx, data, trialrun, flusher, multipass, isextrapass, -- d = string.gsub(d,"\r","") if d then if trace_graphics then - mp_inp[mpx]:write(format("\n%% begin snippet %s\n",i)) + mp_inp[mpx]:write(formatters["\n%% begin snippet %s\n"](i)) mp_inp[mpx]:write(d) - mp_inp[mpx]:write(format("\n%% end snippet %s\n",i)) + mp_inp[mpx]:write(formatters["\n%% end snippet %s\n"](i)) end starttiming(metapost.exectime) result = mpx:execute(d) @@ -484,7 +503,7 @@ function metapost.directrun(formatname,filename,outputformat,astable,mpdata) else output = figures[v]:svg() -- (3) for prologues end - local outname = format("%s-%s.%s",basename,v,outputformat) + local outname = formatters["%s-%s.%s"](basename,v,outputformat) report_metapost("saving %s bytes in %a",#output,outname) io.savedata(outname,output) end @@ -517,7 +536,7 @@ function metapost.quickanddirty(mpxformat,data) stopfigure = function() end } - local data = format("; beginfig(1) ;\n %s\n ; endfig ;",data) + local data = formatters["; beginfig(1) ;\n %s\n ; endfig ;"](data) metapost.process(mpxformat, { data }, false, flusher, false, false, "all") if code then return { diff --git a/tex/context/base/mult-aux.mkiv b/tex/context/base/mult-aux.mkiv index 1fb951048..2cc1c6399 100644 --- a/tex/context/base/mult-aux.mkiv +++ b/tex/context/base/mult-aux.mkiv @@ -223,14 +223,30 @@ \def#8##1{\csname\ifcsname#1#2:##1\endcsname#1#2:##1\else\s!empty\fi\endcsname}% \def#9##1{\csname#1#2:##1\endcsname}} +% pre-expansion can be a bit faster but handly any effect on a normal run so let's go for +% saving some memory +% +% \unexpanded\def\mult_interfaces_install_parameter_handler#1#2#3#4#5#6#7#8#9% inlining \csname*\endcsname is more efficient (#3 and #6 only) +% {\ifx#2\relax\let#2\empty\fi % it is hardly faster but produces less expansion tracing +% %\def#3##1{\csname#4{#1#2}{##1}\endcsname}% +% \edef#3##1{\noexpand\csname\noexpand\ifcsname#1\noexpand#2:##1\endcsname#1\noexpand#2:##1\noexpand\else\noexpand\expandafter\noexpand#5\noexpand\csname#1\noexpand#2:\s!parent\endcsname{##1}\noexpand\fi\endcsname}% +% \edef#4##1##2{\noexpand\ifcsname##1:##2\endcsname##1:##2\noexpand\else\noexpand\expandafter\noexpand#5\noexpand\csname##1:\s!parent\endcsname{##2}\noexpand\fi}% +% \def #5##1##2{\ifx##1\relax\s!empty\else#4{##1}{##2}\fi}% is {} needed around ##1 ? +% \edef#6##1##2{\noexpand\csname\noexpand\ifcsname#1##1:##2\endcsname#1##1:##2\noexpand\else\noexpand\expandafter\noexpand#5\noexpand\csname#1##1:\s!parent\endcsname{##2}\noexpand\fi\endcsname}% +% \def#7##1{\detokenize\expandafter\expandafter\expandafter{\csname#1#2:##1\endcsname}}% always root, no backtrack +% % \def#7##1{\mult_interfaces_detokenize{\csname#4{#1#2}{##1}\endcsname}}% compact version +% % \def#7##1{\mult_interfaces_detokenize{\csname\ifcsname#1#2:##1\endcsname#1#2:##1\else\expandafter#5\csname#1#2:\s!parent\endcsname{##1}\fi\endcsname}}% +% \edef#8##1{\noexpand\csname\noexpand\ifcsname#1\noexpand#2:##1\endcsname#1\noexpand#2:##1\noexpand\else\s!empty\noexpand\fi\endcsname}% +% \edef#9##1{\noexpand\csname#1#2:##1\endcsname}} + \unexpanded\def\installparameterhandler#1#2% {\normalexpanded {\mult_interfaces_install_parameter_handler {\noexpand#1}% \??aa \expandafter\noexpand\csname current#2\endcsname \expandafter\noexpand\csname #2parameter\endcsname - \expandafter\noexpand\csname do#2parameter\endcsname % or : #2_parameter_hash - \expandafter\noexpand\csname do#2parentparameter\endcsname % or : #2_parent_parameter_hash + \expandafter\noexpand\csname do#2parameter\endcsname % or : #2_parameter + \expandafter\noexpand\csname do#2parentparameter\endcsname % or : #2_parent_parameter \expandafter\noexpand\csname named#2parameter\endcsname \expandafter\noexpand\csname detokenized#2parameter\endcsname \expandafter\noexpand\csname strict#2parameter\endcsname % checked diff --git a/tex/context/base/mult-mps.lua b/tex/context/base/mult-mps.lua index 1275af47b..a6bebc266 100644 --- a/tex/context/base/mult-mps.lua +++ b/tex/context/base/mult-mps.lua @@ -66,7 +66,7 @@ return { "outputformat", "outputtemplate", "filenametemplate", "fontmapfile", "fontmapline", "fontpart", "fontsize", "glyph", "restoreclipcolor", "troffmode", -- - "runscript", + "runscript", "maketext", }, commands = { "upto", "downto", diff --git a/tex/context/base/page-brk.mkiv b/tex/context/base/page-brk.mkiv index cf74a73c3..600819b1b 100644 --- a/tex/context/base/page-brk.mkiv +++ b/tex/context/base/page-brk.mkiv @@ -178,6 +178,8 @@ \global\pageornamentstate\plusone \fi} +% also needed: \page \doifoddpageelse\relax{\page[\v!blank,\v!right] + \installpagebreakmethod \v!no {\ifconditional\c_page_breaks_enabled \dosomebreak\nobreak diff --git a/tex/context/base/publ-dat.lua b/tex/context/base/publ-dat.lua index be5f1eca8..9be765985 100644 --- a/tex/context/base/publ-dat.lua +++ b/tex/context/base/publ-dat.lua @@ -409,21 +409,23 @@ do local space = S(" \t\n\r\f") -- / " " local collapsed = space^1/" " + ----- csletter = R("az","AZ") + local csletter = lpegpatterns.csletter ----- command = P("\\") * Cc("btxcmd{") * (R("az","AZ")^1) * Cc("}") ----- command = P("\\") * (Carg(1) * C(R("az","AZ")^1) / function(list,c) list[c] = (list[c] or 0) + 1 return "btxcmd{" .. c .. "}" end) ----- command = P("\\") * (Carg(1) * C(R("az","AZ")^1) * space^0 / function(list,c) list[c] = (list[c] or 0) + 1 return "btxcmd{" .. c .. "}" end) - local command = P("\\") * (Carg(1) * C(R("az","AZ")^1) * space^0 / function(list,c) list[c] = (list[c] or 0) + 1 return "btxcmd{" .. c .. "}" end) + local command = P("\\") * (Carg(1) * C(csletter^1) * space^0 / function(list,c) list[c] = (list[c] or 0) + 1 return "btxcmd{" .. c .. "}" end) local whatever = P("\\") * P(" ")^1 / " " + P("\\") * ( P("hbox") + P("raise") ) -- bah local somemath = P("$") * ((1-P("$"))^1) * P("$") -- let's not assume nested math ----- character = lpegpatterns.utf8character local any = P(1) local done = P(-1) - local one_l = P("{") / "" - local one_r = P("}") / "" - local two_l = P("{{") / "" - local two_r = P("}}") / "" + -- local one_l = P("{") / "" + -- local one_r = P("}") / "" + -- local two_l = P("{{") / "" + -- local two_r = P("}}") / "" local zero_l_r = P("{}") / "" * #P(1) local special = P("#") / "\\letterhash " @@ -460,13 +462,16 @@ do local function do_definition(category,tag,tab,dataset) publicationsstats.nofdefinitions = publicationsstats.nofdefinitions + 1 + if tag == "" then + tag = "no-tag-set" + end local fields = dataset.fields local luadata = dataset.luadata local hashtag = tag if luadata[tag] then local t = tags[tag] local d = dataset.name - local n = (t[n] or 0) + 1 + local n = (t[d] or 0) + 1 t[d] = n hashtag = tag .. "-" .. n if trace_duplicates then @@ -561,23 +566,27 @@ do [2] = left * V(1) * right, } - local unbalanced = P { - [1] = left * V(2) * right, - [2] = ((escape * (left+right)) + (collapsed + 1 - (left+right))^1 + V(1))^0, - } + -- local unbalanced = P { + -- [1] = left * V(2) * right, + -- [2] = ((escape * (left+right)) + (collapsed + 1 - (left+right))^1 + V(1))^0, + -- } + + local unbalanced = (left/"") * balanced * (right/"") * P(-1) local keyword = C((R("az","AZ","09") + S("@_:-"))^1) local key = C((1-space-equal)^1) - local tag = C((1-space-comma)^1) + local tag = C((1-space-comma)^0) local reference = keyword local category = C((1-space-left)^1) local s_quoted = ((escape*single) + collapsed + (1-single))^0 local d_quoted = ((escape*double) + collapsed + (1-double))^0 local b_value = p_left * balanced * p_right - local u_value = p_left * unbalanced * p_right -- get rid of outer { } - local s_value = (single/"") * (u_value + s_quoted) * (single/"") - local d_value = (double/"") * (u_value + d_quoted) * (double/"") + -- local u_value = p_left * unbalanced * p_right -- get rid of outer { } + -- local s_value = (single/"") * (u_value + s_quoted) * (single/"") + -- local d_value = (double/"") * (u_value + d_quoted) * (double/"") + local s_value = (single/"") * (unbalanced + s_quoted) * (single/"") + local d_value = (double/"") * (unbalanced + d_quoted) * (double/"") local r_value = reference * Carg(1) /resolve local somevalue = d_value + b_value + s_value + r_value @@ -647,9 +656,9 @@ do local compact = false -- can be a directive but then we also need to deal with newlines ... not now - function publications.converttoxml(dataset,nice,dontstore,usedonly) -- we have fields ! + function publications.converttoxml(dataset,nice,dontstore,usedonly,subset) -- we have fields ! local current = datasets[dataset] - local luadata = current and current.luadata + local luadata = subset or (current and current.luadata) if luadata then statistics.starttiming(publications) -- @@ -1011,73 +1020,86 @@ do ]] - function savers.bib(dataset,filename,usedonly) - local current = datasets[dataset] - local luadata = current.luadata or { } - local usedonly = usedonly and publications.usedentries() - local f_start = formatters["@%s{%s,\n"] - local f_field = formatters[" %s = {%s},\n"] - local s_stop = "}\n\n" - local result = { s_preamble } + function savers.bib(dataset,filename,tobesaved) + local f_start = formatters["@%s{%s,\n"] + local f_field = formatters[" %s = {%s},\n"] + local s_stop = "}\n\n" + local result = { s_preamble } local n, r = 0, 1 - for tag, data in sortedhash(luadata) do - if not usedonly or usedonly[tag] then - r = r + 1 ; result[r] = f_start(data.category or "article",tag) - for key, value in sortedhash(data) do - if not privates[key] then - r = r + 1 ; result[r] = f_field(key,value) - end + for tag, data in sortedhash(tobesaved) do + r = r + 1 ; result[r] = f_start(data.category or "article",tag) + for key, value in sortedhash(data) do + if not privates[key] then + r = r + 1 ; result[r] = f_field(key,value) end - r = r + 1 ; result[r] = s_stop - n = n + 1 end + r = r + 1 ; result[r] = s_stop + n = n + 1 end report("%s entries from dataset %a saved in %a",n,dataset,filename) io.savedata(filename,concat(result)) end - function savers.lua(dataset,filename,usedonly) - local current = datasets[dataset] - local luadata = current.luadata or { } - local usedonly = usedonly and publications.usedentries() - if usedonly then - local list = { } - if usedonly then - for key, value in next, luadata do - if not privates[key] and usedonly[key] then - list[key] = value - end - end - else - for key, value in next, luadata do - if not privates[key] then - list[key] = value - end + function savers.lua(dataset,filename,tobesaved) + local list = { } + local n = 0 + for tag, data in next, tobesaved do + local t = { } + for key, value in next, data do + if not privates[key] then + d[key] = value end end - luadata = list + list[tag] = t + n = n + 1 end - report("%s entries from dataset %a saved in %a",table.count(luadata),dataset,filename) - table.save(filename,luadata) + report("%s entries from dataset %a saved in %a",n,dataset,filename) + table.save(filename,list) end - function savers.xml(dataset,filename,usedonly) - local result, n = publications.converttoxml(dataset,true,true,usedonly) -- maybe also private? but then we need to have tag as attr + function savers.xml(dataset,filename,tobesaved) + local result, n = publications.converttoxml(dataset,true,true,false,tobesaved) report("%s entries from dataset %a saved in %a",n,dataset,filename) io.savedata(filename,result) end - function publications.save(dataset,filename,kind,usedonly) + function publications.save(specification) + local dataset = specification.dataset + local filename = specification.filename + local filetype = specification.filetype + local criterium = specification.criterium statistics.starttiming(publications) - if not kind or kind == "" then - kind = file.suffix(filename) + if not filename or filename == "" then + report("no filename for saving given") + return + end + if not filetype or filetype == "" then + filetype = file.suffix(filename) + end + if not criterium or criterium == "" then + criterium = v_all end - local saver = savers[kind] + local saver = savers[filetype] if saver then - usedonly = usedonly ~= v_all - saver(dataset,filename,usedonly) + local current = datasets[dataset] + local luadata = current.luadata or { } + local tobesaved = { } + local result = structures.lists.filter({criterium = criterium, names = "btx"}) or { } + for i=1,#result do + local userdata = result[i].userdata + if userdata then + local set = userdata.btxset or v_default + if set == dataset then + local tag = userdata.btxref + if tag then + tobesaved[tag] = luadata[tag] + end + end + end + end + saver(dataset,filename,tobesaved) else - report("unknown format %a for saving %a",kind,dataset) + report("unknown format %a for saving %a",filetype,dataset) end statistics.stoptiming(publications) return dataset diff --git a/tex/context/base/publ-fnd.lua b/tex/context/base/publ-fnd.lua index 2457709ff..65c025f22 100644 --- a/tex/context/base/publ-fnd.lua +++ b/tex/context/base/publ-fnd.lua @@ -19,7 +19,7 @@ local publications = publications local tonumber, next, type = tonumber, next, type local find = string.find -local P, R, S, C, Cs, Cp, Cc, Carg, V = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Cp, lpeg.Cc, lpeg.Carg, lpeg.V +local P, R, S, C, Cs, Cp, Cc, Carg, Ct, V = lpeg.P, lpeg.R, lpeg.S, lpeg.C, lpeg.Cs, lpeg.Cp, lpeg.Cc, lpeg.Carg, lpeg.Ct, lpeg.V local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns local concat = table.concat @@ -143,10 +143,10 @@ local percent = P("-") / "%%" local word = Cs(lpegpatterns.unquoted + lpegpatterns.argument + valid) local range = P("<") * space^0 * C((1-space)^1) * space^1 * C((1-space- P(">"))^1) * space^0 * P(">") -local f_key_fld = formatters[" local kf_%s = get(entry,%q) \n if kf_%s then kf_%s = lower(kf_%s) end"] -local f_key_set = formatters[" local ks_%s = get(entry,%q,categories)\n if ks_%s then ks_%s = lower(ks_%s) end"] -local f_number_fld = formatters[" local nf_%s = tonumber(get(entry,%q))"] -local f_number_set = formatters[" local ns_%s = tonumber(get(entry,%q,categories))"] +local f_key_fld = formatters[" local kf_%s = get(entry,%q) \n if kf_%s then kf_%s = lower(kf_%s) end"] +local f_key_set = formatters[" local ks_%s = get(entry,%q,categories)\n if ks_%s then ks_%s = lower(ks_%s) end"] +local f_number_fld = formatters[" local nf_%s = tonumber(get(entry,%q))"] +local f_number_set = formatters[" local ns_%s = tonumber(get(entry,%q,categories))"] local f_fld_exact = formatters["(kf_%s == %q)"] local f_set_exact = formatters["(ks_%s == %q)"] @@ -161,7 +161,7 @@ local function test_key_value(keys,where,key,first,last) if not key or key == "" then return "(false)" elseif key == "*" then - last = "^.*" .. topattern(lowercase(last)) .. ".*$" + last = "^.*" .. topattern(lowercase(last)) .. ".*$" -- todo: make an lpeg return f_all_match(last) elseif first == false then -- exact @@ -197,7 +197,7 @@ end local p_compare = P { "all", all = (V("one") + V("operator") + V("nested") + C(" "))^1, - nested = C("(") * V("all") * C(")"), + nested = C("(") * V("all") * C(")"), -- C really needed? operator = C("and") + C("or") + C("not"), @@ -216,11 +216,27 @@ local p_compare = P { "all", range = range, } -local p_combine = space^0 - * (P(",")/" or ") - * space^0 - -local pattern = Cs((P("match")/"" * space^0 * p_compare + p_combine)^1) +-- local p_combine = space^0 * (P(",")/" or ") * space^0 + +-- local pattern = Cs((P("match")/"" * space^0 * p_compare + p_combine)^1) + +local comma = P(",") +local p_spaces = space^0 +local p_combine = p_spaces * comma * p_spaces / " or " +local p_expression = P("match")/"" * Cs(p_compare) + + Carg(1) + * Cc("") + * Cc("tag") + * Cc(false) + * ( + P("tag") * p_spaces * P("(") * Cs((1-S(")")-space)^1) * p_spaces * P(")") + + p_spaces * Cs((1-space-comma)^1) * p_spaces + ) / test_key_value + +local pattern = Cs { + [1] = V(2) * (p_combine * V(2))^0, + [2] = p_expression, +} -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- @@ -233,6 +249,14 @@ function publications.anywhere(entry,str) -- helpers end end +-- todo: use an environment instead of + +-- table={ +-- { "match", "((kf_editor and find(kf_editor,\"^.*braslau.*$\")))" }, +-- { "hash", "foo1234" }, +-- { "tag", "bar5678" }, +-- } + local f_template = string.formatters[ [[ local find = string.find local lower = characters.lower @@ -246,46 +270,6 @@ return function(entry) end ]] ] ------ function compile(expr,start) --- local function compile(dataset,expr) --- local keys = { } --- -- local expression = lpegmatch(pattern,expr,start,keys) --- local expression = lpegmatch(pattern,expr,1,keys) --- if trace_match then --- report("compiling expression: %s",expr) --- end --- local definitions = { } --- local anywhere = false --- for k, v in next, keys do --- if k == "anywhere" then --- anywhere = true --- else --- definitions[#definitions+1] = v --- end --- end --- if not anywhere or #definitions == 0 then --- report("invalid expression: %s",expr) --- elseif trace_match then --- for i=1,#definitions do --- report("% 3i : %s",i,definitions[i]) --- end --- end --- definitions = concat(definitions,"\n") --- local code = f_template(definitions,expression) --- if trace_match then --- report("generated code: %s",code) --- end --- code = loadstring(code) --- if type(code) == "function" then --- code = code() --- if type(code) == "function" then --- return code --- end --- end --- report("invalid expression: %s",expr) --- return false --- end - local function compile(dataset,expr) local keys = { } -- local expression = lpegmatch(pattern,expr,start,keys) @@ -309,11 +293,11 @@ local function compile(dataset,expr) if trace_match then report("generated code: %s",code) end - code = loadstring(code) - if type(code) == "function" then - code = code() - if type(code) == "function" then - return code + local finder = loadstring(code) -- use an environment + if type(finder) == "function" then + finder = finder() + if type(finder) == "function" then + return finder, code end end report("invalid expression: %s",expr) @@ -344,7 +328,8 @@ end -- test("match(*:foo)") -- test("match(*:*)") -local check = P("match") -- * space^0 * Cp() +local trigger = (P("match") + P("tag")) * p_spaces * P("(") +local check = (1-trigger)^0 * trigger local function finder(dataset,expression) local found = lpegmatch(check,expression) and compile(dataset,expression) or false @@ -373,7 +358,11 @@ function publications.search(dataset,expression) for i=1,#ordered do local entry = ordered[i] if find(entry) then - target[entry.tag] = entry + local tag = entry.tag + if not target[tag] then + -- we always take the first + target[tag] = entry + end end end return target diff --git a/tex/context/base/publ-imp-apa.lua b/tex/context/base/publ-imp-apa.lua index 5182e016d..18360d527 100644 --- a/tex/context/base/publ-imp-apa.lua +++ b/tex/context/base/publ-imp-apa.lua @@ -359,7 +359,8 @@ categories.manual = { "address", "subtitle", "file", "editionset", "month", "year", - "doi", "note", "isbn" + "doi", "note", "isbn", +-- "abstract", }, } diff --git a/tex/context/base/publ-imp-apa.mkvi b/tex/context/base/publ-imp-apa.mkvi index 256636325..87a9c522b 100644 --- a/tex/context/base/publ-imp-apa.mkvi +++ b/tex/context/base/publ-imp-apa.mkvi @@ -29,12 +29,6 @@ % The APA style sorts the unnumbered rendered list by authoryear -% Hans: should we be using or not using \c!, \s! and \v! ?? - -% Sure: not using \c! and v! would mean that only the english interface is -% supported and \s! saves some bytes (only within the setups). I'll deal with -% that in the end. - \definebtxrendering [apa] [\c!specification=apa, @@ -48,55 +42,14 @@ \c!distance=.5\emwidth, \c!margin=3\emwidth] -% The sameauthor feature may not be APA compliant -% (there is nothing in the manual cited above). -% It can be removed using the command: -% \resetsetups [apa:list:sameauthor] - -% Or texdefinition? - -\startsetups [apa:list:sameauthor] - \fastsetup{apa:list:sameauthor:rule} -\stopsetups - -\startsetups [apa:list:sameauthor:rule] - \blackrule - [\c!width=\dimexpr\listparameter\c!margin-\interwordspace\relax, - \c!height=1.5\linewidth]% are you sure you want to inconsistent with the rest? happens nowhere! -\stopsetups - -\startsetups [apa:list:sameauthor:\v!empty]% it's not a space - \kern\dimexpr\listparameter\c!margin-\interwordspace\relax -\stopsetups - -\startsetups [apa:list:sameauthor:ditto] % horrible ! - \inframed - [\c!width=\dimexpr\listparameter\c!margin-\interwordspace\relax, - \c!frame=\v!off, - \c!align=\v!middle] - {\doubleprime} -\stopsetups - % set ALL specific APA compliant values -% Note that fallback is apa, default, then root \definebtx [apa] - [\c!default=, % no fallback on default rendering - \c!namesep={,\space}, - \c!lastnamesep={,\nobreakspace\textampersand\space}, % comma separated list - \c!finalnamesep={\nobreakspace\textampersand\space}, % last of two, no comma! - \c!firstnamesep=\space, + [\c!default=default, \c!otherstext={\space\btxlabeltext{apa:others}}, - \c!juniorsep={\space}, - \c!vonsep={\space}, - \c!initialsep={\space}, - \c!surnamesep={,\space}, - \c!surnameinitialsep={,\space}, - \c!surnamefirstnamesep={,\space}, - \c!pubsep={,\space}, - \c!lastpubsep={,\space\btxlabeltext{apa:and}\space},% not btxcomma? - \c!finalpubsep={\space\btxlabeltext{apa:and}\space}] + %c!journalconversion=\v!normal, + \c!monthconversion=\v!month] \definebtx [apa:list] @@ -104,9 +57,10 @@ [\c!otherstext={,\nobreakspace\textellipsis\space}, \c!etallimit=7, \c!etaldisplay=6, - %c!journalconversion=\v!normal, - \c!monthconversion=\v!month, - \c!authorconversion=invertedshort] + \c!authorconversion=invertedshort, + \c!separator:names:2={,\space}, % aka namesep - in this namespace + \c!separator:names:3={,\nobreakspace\textampersand\space}, % comma separated list + \c!separator:names:4= {\nobreakspace\textampersand\space}] % last of two, no comma! % The following are similar to default, but inherit from apa:list @@ -282,18 +236,13 @@ \c!etaldisplay=1, % TODO: when 2-4, show all first time, etaldisplay subsequently... \c!authorconversion=\v!name, \c!sorttype=authoryear, - \c!compress=\v!no, - \c!inbetween=\space, - \c!range=\endash, - \c!left=, - \c!middle=, - \c!right=] + \c!separator:names:2={,\space}, + \c!separator:names:3={,\space\btxlabeltext{apa:and}\space}, % not \textampersand + \c!separator:names:4= {\space\btxlabeltext{apa:and}\space}] % not \textampersand \definebtx [apa:cite:author] [apa:cite] - [\c!lastnamesep={,\space\btxlabeltext{apa:and}\space}, % not \textampersand - \c!finalnamesep={\space\btxlabeltext{apa:and}\space}] % not \textampersand % The following are similar to default, but inherit from apa:cite @@ -303,20 +252,18 @@ [\c!compress=\v!yes, \c!left={(}, \c!right={)}, - \c!inbetween={,\space}, - \c!pubsep={;\space}, - \c!lastpubsep={;\space}, - \c!finalpubsep={;\space}] + \c!inbetween={,\space}] + +\definebtx + [apa:cite:default] + [apa:cite:authoryear] \definebtx [apa:cite:authoryears] [apa:cite:authoryear] [\c!left=, \c!right=, - \c!inbetween={\space}, - \c!pubsep={;\space}, - \c!lastpubsep={;\space}, - \c!finalpubsep={;\space}] + \c!inbetween={\space}] \definebtx [apa:cite:authornum] @@ -351,18 +298,18 @@ \definebtx [apa:cite:year] [apa:cite] - [\c!pubsep={,\space}, - \c!lastpubsep={,\space\btxlabeltext{apa:and}\space}, % not \textampersand - \c!finalpubsep={\space\btxlabeltext{apa:and}\space}, % not \textampersand + [\c!separator:2={,\space}, % :0 and :1 - between items of a list + \c!separator:3={,\space\btxlabeltext{apa:and}\space}, % not \textampersand + \c!separator:4= {\space\btxlabeltext{apa:and}\space}, % not \textampersand \c!compress=\v!yes, \c!sorttype=\v!default] \definebtx [apa:cite:title] [apa:cite] - [\c!pubsep={,\space}, - \c!lastpubsep={,\space\btxlabeltext{apa:and}\space}, % not \textampersand - \c!finalpubsep={\space\btxlabeltext{apa:and}\space}, % not \textampersand + [\c!separator:2={,\space}, % :0 and :1 - between items of a list + \c!separator:3={,\space\btxlabeltext{apa:and}\space}, % not \textampersand + \c!separator:4= {\space\btxlabeltext{apa:and}\space}, % not \textampersand \c!command={\language[\currentbtxlanguage]}, % BAH \c!style=\v!italic] @@ -391,9 +338,9 @@ [apa:cite] [\c!left=, \c!right=, - \c!pubsep={,\space}, - \c!lastpubsep={,\space\btxlabeltext{apa:and}\space}, % not \textampersand - \c!finalpubsep={\space\btxlabeltext{apa:and}\space}] % not \textampersand + [\c!separator:2={,\space}, % :0 and :1 - between items of a list + \c!separator:3={,\space\btxlabeltext{apa:and}\space}, % not \textampersand + \c!separator:4= {\space\btxlabeltext{apa:and}\space}] % not \textampersand \definebtx [apa:cite:pages] @@ -441,18 +388,28 @@ [\c!compress=\v!yes, \c!left={[}, \c!right={]}, - \c!pubsep={,}, - \c!lastpubsep={,}, - \c!finalpubsep={,}] + \c!separator:2={,}, % no space + \c!separator:3=\btxparameter{\c!separator:2}, + \c!separator:4=\btxparameter{\c!separator:2}] \definebtx [apa:cite:textnum] [apa:cite:num] [\c!left={Ref.\nbsp}, \c!right=, - \c!pubsep={,}, - \c!lastpubsep={\space\btxlabeltext{apa:and}\space}, - \c!finalpubsep={\space\btxlabeltext{apa:and}\space}] + \c!separator:2={,\space}, + \c!separator:3={\space\btxlabeltext{apa:and}\space}, + \c!separator:4={\space\btxlabeltext{apa:and}\space}] + +\definebtx + [apa:cite:entry] + [apa:cite] + [\c!left=, + \c!right=, + \c!inbetween={\space}, + \c!separator:2={;\space}, + \c!separator:3=\btxparameter{\c!separator:2}, + \c!separator:4=\btxparameter{\c!separator:2}] %D Sometimes we have verbose injections in an entry and these can be language %D dependent, so we use labels. @@ -476,10 +433,10 @@ apa:mastersthesis={Master's thesis}, apa:phdthesis={Doctoral dissertation}, apa:technicalreport={Tech. Rep.}, % Technical report - apa:supplement={Suppl.}, % Supplement + apa:supplement={Suppl.}, % Supplement (not used?) apa:patent=Patent, apa:Author=Author, - apa:Translator={Trans.}, % Translator(s) + apa:Translator={Trans.}, % Translator(s) (not used?) apa:Advanced={Advanced online publication}, apa:Retrieved={Available from}, % {Retrieved from}, apa:In=In] @@ -611,46 +568,6 @@ % cite setups -% as we don't fallback on default (no sane person will render the titles -% differently so it's a bit over the top): - -\startsetups btx:apa:cite:empty - \fastsetup{\s!btx:\s!cite:\s!empty} -\stopsetups -\startsetups btx:apa:cite:unknown - \fastsetup{\s!btx:\s!cite:\s!unknown} -\stopsetups -\startsetups btx:apa:cite:author - \fastsetup{\s!btx:\s!cite:author} -\stopsetups -\startsetups btx:apa:cite:authoryear - \fastsetup{\s!btx:\s!cite:author} -\stopsetups -\startsetups btx:apa:cite:authoryears - \fastsetup{\s!btx:\s!cite:author} -\stopsetups -\startsetups btx:apa:cite:authornum - \fastsetup{\s!btx:\s!cite:author} -\stopsetups -\startsetups btx:apa:cite:title - \fastsetup{\s!btx:\s!cite:\s!normal} -\stopsetups -\startsetups btx:apa:cite:booktitle - \fastsetup{btx:apa:cite:title} -\stopsetups -\startsetups btx:apa:cite:entry - \fastsetup{\s!btx:\s!cite:\s!normal} -\stopsetups -\startsetups btx:apa:cite:num - \fastsetup{\s!btx:\s!cite:range} -\stopsetups -\startsetups btx:apa:cite:textnum - \fastsetup{\s!btx:\s!cite:range} -\stopsetups -\startsetups btx:apa:cite:year - \fastsetup{\s!btx:\s!cite:range} -\stopsetups - \startsetups btx:apa:cite:author:year \texdefinition{\s!btx:\s!cite:concat} \ifx\currentbtxfirst\empty @@ -709,6 +626,35 @@ \fi \stopsetups +% The sameauthor feature may not be APA compliant +% (there is nothing in the manual cited above). +% It can be removed using the command: +% \resetsetups [apa:list:sameauthor] + +% Or texdefinition? + +\startsetups [apa:list:sameauthor] + \fastsetup{apa:list:sameauthor:rule} +\stopsetups + +\startsetups [apa:list:sameauthor:rule] + \blackrule + [\c!width=\dimexpr\listparameter\c!margin-\interwordspace\relax, + \c!height=1.5\linewidth]% are you sure you want to inconsistent with the rest? happens nowhere! +\stopsetups + +\startsetups [apa:list:sameauthor:\v!empty]% it's not a space + \kern\dimexpr\listparameter\c!margin-\interwordspace\relax +\stopsetups + +\startsetups [apa:list:sameauthor:ditto] % horrible ! + \inframed + [\c!width=\dimexpr\listparameter\c!margin-\interwordspace\relax, + \c!frame=\v!off, + \c!align=\v!middle] + {\doubleprime} +\stopsetups + %D Instead of texdefinitions without arguments, we could have used setups but in my %D editor (hh, scite) the commands stand out better. It also saves an additional %D component in the name (e.g. common:) because commands and setups have a different @@ -853,7 +799,7 @@ \texdefinition{btx:apa:author-or-editor} {editor} } \btxspace - \btxstartstyleandcolor[apa:list:title] % NOT :\currentbtxcategory ! + \btxstartstyleandcolor[apa:list:title] \texdefinition{btx:apa:composed-title} {booktitle} \btxstopstyleandcolor \btxperiod @@ -917,8 +863,9 @@ } \stoptexdefinition + % this could be simplified! + \starttexdefinition btx:apa:journal-volume-number-pages - % this could be simplified! \btxdoif {journal} { \btxspace \btxstartstyleandcolor[apa:list:journal] @@ -1020,8 +967,9 @@ \definebreakpoint [doi][-][nleft=3,type=1] \definebreakpoint [doi][.][nleft=3,type=1] +% use \btxentry here? + \starttexdefinition btx:apa:url - % use \btxentry here? \btxspace \btxlabeltext{apa:Retrieved} \btxspace @@ -1039,8 +987,9 @@ \endgroup \stoptexdefinition +% use \btxentry here? + \starttexdefinition btx:apa:doi - % use \btxentry here? \btxspace \begingroup \setbreakpoints[doi] @@ -1056,8 +1005,9 @@ \endgroup \stoptexdefinition +% also issn - see publ-imp-apa.lua + \starttexdefinition btx:apa:isbn - % also issn - see publ-imp-apa.lua \btxdoif {isbn} { \btxleftparenthesis \WORD{\btxfoundname{isbn}}:\btxspace @@ -1121,8 +1071,10 @@ % Required fields: title, year % Optional fields: editor, publisher, subtitle, series, volume, number, month, organization, doi, url, issn, note +% needs to be tuned... + \startsetups btx:apa:list:periodical - \fastsetup{btx:apa:list:article} % needs to be tuned... + \fastsetup{btx:apa:list:article} \stopsetups % National and international standards issued by a standards body diff --git a/tex/context/base/publ-imp-aps.lua b/tex/context/base/publ-imp-aps.lua index 1530bc09d..c143e648b 100644 --- a/tex/context/base/publ-imp-aps.lua +++ b/tex/context/base/publ-imp-aps.lua @@ -30,43 +30,27 @@ local specification = { -- vons Last, Jrs, First -- Vons, Last, Jrs, First -- - author = "author", + author = "author", -- interpreted as name(s) editor = "author", artist = "author", interpreter = "author", composer = "author", producer = "author", - doi = "url", - url = "url", - page = "pagenumber", + doi = "url", -- an external link + url = "url", + page = "pagenumber", -- number or range: f--t pages = "pagenumber", - keywords = "keyword", + volume = "range", + number = "range", + keywords = "keyword", -- comma|-|separated list + year = "number", }, -- -- categories with their specific fields -- categories = { -- - -- the following fields are for documentation and testing purposes - -- - ["demo-a"] = { - sets = { - author = { "author", "institution", "organization" }, - doi = { "doi", "url" }, - }, - required = { "author", "title", "year", "note", "doi" }, - optional = { "subtitle", "file" }, - }, - ["demo-b"] = { - sets = { - authors = { "author", "institution", "organization" }, - doi = { "doi", "url" }, - }, - required = { "authors", "title", "year", "note", "doi" }, - optional = { "subtitle", "file" }, - }, - -- - -- more categories are added below + -- categories are added below -- }, } @@ -78,7 +62,8 @@ local generic = { -- allows the substitution of an alternate field. -- -- note that anything can get assigned a doi or be available online. - doi = { "doi", "url" }, + doi = { "doi", "url" }, + editionset = { "edition", "volume", "number", "pages" }, } -- Note that the APS specification allows an additional field "collaboration" @@ -90,7 +75,7 @@ local generic = { -- all other fields will be ignored. -- Sets contain either/or in order of precedence. --- +-- -- For a category *not* defined here yet present in the dataset, *all* fields -- are taken as optional. This allows for flexibility in the addition of new -- categories. @@ -130,7 +115,7 @@ categories.magazine = { optional = { "collaboration", "subtitle", "type", "file", - "volume", + "number", "month", "day", "doi", "note", "isbn" }, @@ -182,16 +167,16 @@ categories.standard = { categories.book = { sets = { - author = { "author", "editor", "publisher", "title" }, - edition = { "edition", "volume", "number", "pages" }, - doi = generic.doi, + author = { "author", "editor", "publisher", "title" }, + editionset = generic.editionset, + doi = generic.doi, }, required = { "author" }, optional = { "collaboration", "year", "month", "day", "subtitle", "type", "file", - "edition", "series", + "editionset", "series", "address", "doi", "note", "isbn" }, @@ -201,9 +186,9 @@ categories.book = { categories.inbook = { sets = { - author = { "author", "editor", "publisher", "title", "chapter" }, - edition = { "edition", "volume", "number", "pages" }, - doi = generic.doi, + author = { "author", "editor", "publisher", "title", }, + editionset = generic.editionset, + doi = generic.doi, }, required = { "author", @@ -212,64 +197,69 @@ categories.inbook = { optional = { "collaboration", "subtitle", "type", "file", - "edition", "series", + "booktitle", + -- "chapter", + "editionset", "series", "month", "address", "doi", "note", "isbn" }, } --- a work that is printed and bound, but without a named publisher or sponsoring institution. +-- a book having its own title as part of a collection. +-- (like inbook, but we here make booktitle required) -categories.booklet = { +categories.incollection = { sets = { - author = { "author", "title" }, - doi = generic.doi, + author = { "author", "editor", "publisher", "title", }, + editionset = generic.editionset, + doi = generic.doi, }, required = { - "author" + "author", + "booktitle", + "year", }, optional = { "collaboration", - "year", "month", "subtitle", "type", "file", + "editionset", "series", + "chapter", + "month", "address", - "howpublished", "doi", "note", "isbn" - }, + }, } --- a part of a book having its own title. +-- a work that is printed and bound, but without a named publisher or sponsoring institution. -categories.incollection = { +categories.booklet = { sets = { - author = { "author", "editor", "publisher", "title" }, - edition = { "edition", "volume", "number", "pages" }, - doi = generic.doi, + author = { "author", "title", }, + publisher = { "howpublished" }, -- no "publisher"! + doi = generic.doi, }, required = { - "author", - "booktitle", - "year", + "author" }, optional = { + "publisher", "collaboration", + "year", "month", "subtitle", "type", "file", - "month", - "edition", "series", - "chapter", "address", "doi", "note", "isbn" - }, + }, } -- the proceedings of a conference. categories.proceedings = { sets = { - author = { "editor", "publisher", "title" }, - edition = { "edition", "volume", "number", "pages" }, - doi = generic.doi, + author = { "editor", "organization", "publisher", "title" }, -- no "author"! + publisher = { "publisher", "organization" }, + editionset = generic.editionset, + doi = generic.doi, }, required = { "author", @@ -277,10 +267,11 @@ categories.proceedings = { }, optional = { "collaboration", + "publisher", "subtitle", "file", - "edition", "series", + "editionset", "series", "month", - "address", "organization", + "address", "doi", "note", "isbn" }, } @@ -347,9 +338,10 @@ categories.phdthesis = categories.mastersthesis categories.techreport = { sets = { - -- no "edition"! - edition = { "type", "volume", "number", "pages" }, - doi = generic.doi, + author = { "author", "institution", "publisher", "title" }, + publisher = { "publisher", "institution", }, + editionset = { "type", "volume", "number", "pages" }, -- no "edition"! + doi = generic.doi, }, required = { "author", @@ -359,10 +351,11 @@ categories.techreport = { }, optional = { "collaboration", + "publisher", + "address", "subtitle", "file", - "edition", -- set, not field! + "editionset", "month", - "address", "doi", "note", "isbn" }, } @@ -371,18 +364,21 @@ categories.techreport = { categories.manual = { sets = { - edition = { "edition", "volume", "number", "pages" }, - doi = generic.doi, + author = { "author", "organization", "publisher", "title" }, + publisher = { "publisher", "organization", }, + editionset = generic.editionset, + doi = generic.doi, }, required = { "title" }, optional = { + "author", "publisher", "collaboration", + "address", "subtitle", "file", - "author", "address", "organization", - "edition", "month", "year", - "doi", "note", "isbn" + "editionset", "month", "year", + "doi", "note", "isbn", }, } @@ -390,21 +386,26 @@ categories.manual = { categories.patent = { sets = { + author = { "author", "assignee", }, + publisher = { "publisher", "assignee", }, + year = { "year", "yearfiled", }, + month = { "month", "monthfiled", }, + day = { "day", "dayfiled", }, doi = generic.doi, }, required = { "nationality", "number", - "year", "yearfiled" + "year", }, optional = { "type", --check this: "language", + "author", "publisher", "collaboration", - "author", "assignee", "title", "subtitle", "file", "address", - "day", "dayfiled", "month", "monthfiled", + "day", "month", "doi", "note" }, } diff --git a/tex/context/base/publ-imp-aps.mkvi b/tex/context/base/publ-imp-aps.mkvi index dde6a289a..996f78592 100644 --- a/tex/context/base/publ-imp-aps.mkvi +++ b/tex/context/base/publ-imp-aps.mkvi @@ -1,10 +1,6 @@ -\endinput - -% todo - %D \module %D [ file=publ-imp-aps, -%D version=2013.12.12, +%D version=2015.03.22, %D title=APS bibliography style, %D subtitle=Publications, %D author=Alan Braslau and Hans Hagen, @@ -31,105 +27,73 @@ %D } %D \stopTEX -% set all APS compliant values (may be redundant but we do not count on defaults.) +\definebtxrendering + [aps] + [\c!specification=aps] + +\setupbtxlist + [aps] + [alternative=paragraph, + width=auto, + distance=0pt] -\setupbtxrendering - [sorttype=, % num ? - numbering=yes] +% set ALL specific APS compliant values -\definebtxlistvariant +\definebtx [aps] - [\c!namesep={,\space}, - \c!lastnamesep={,\space and\space}, - \c!finalnamesep={,\space and\space}, - \c!firstnamesep=\space, - \c!otherstext={\space\btxlabeltext{\currentbtxspecification:others}}, - \c!juniorsep=\space, - \c!vonsep=\space, - \c!initialsep=\space, % between initials and lastname - %\c!initialssep=\space, % between multiple initials % todo - %\c!initialsterminator={.}, % todo - \c!surnamesep={,\space}, - \c!surnameinitialsep={,\space}, - \c!surnamefirstnamesep={,\space}, + [\c!default=default, + \c!otherstext={\space\btxlabeltext{aps:others}}, \c!etallimit=10, - \c!etaldisplay=\btxlistvariantparameter\c!etallimit, - %\c!journalconversion=\v!normal, + \c!etaldisplay=\btxparameter\c!etallimit, + %c!journalconversion=\v!normal, \c!monthconversion=\v!month, - \c!authorconversion=normalshort] - -\definebtxlistvariant - [author] - -\definebtxlistvariant - [editor] - [author] - -% like \setupbtxlistvariant above but not exactly... - -\setupbtxcitevariant - [\c!alternative=num, - \c!namesep=\btxlistvariantparameter\c!namesep, - \c!lastnamesep=\btxlistvariantparameter\c!lastnamesep, - \c!finalnamesep={\nobreakspace\textampersand\space}, % no comma! - \c!firstnamesep=\btxlistvariantparameter\c!firstnamesep, - \c!otherstext=\btxlistvariantparameter\c!otherstext, - \c!juniorsep=\btxlistvariantparameter\c!juniorsep, - \c!vonsep=\btxlistvariantparameter\c!vonsep, - \c!initialsep=\btxlistvariantparameter\c!initialsep, - %\c!initialssep=\btxlistvariantparameter\c!initialssep, - %\c!initialsterminator=\btxlistvariantparameter\c!initialsterminator, - \c!surnamesep=\btxlistvariantparameter\c!surnamesep, - \c!surnameinitialsep=\btxlistvariantparameter\c!surnameinitialsep, - \c!surnamefirstnamesep=\btxlistvariantparameter\c!surnamefirstnamesep, - \c!etallimit=\btxlistvariantparameter\c!etallimit, - \c!etaldisplay=\btxlistvariantparameter\c!etaldisplay, - % \c!monthconversion=\btxlistvariantparameter\c!monthconversion, - \c!authorconversion=\btxlistvariantparameter\c!authorconversion, - \c!interaction=\v!start, - % \c!setups=btx:cite:initialize, - \c!pubsep={,\space}, - \c!lastpubsep={\space\btxlabeltext{\currentbtxspecification:and}\space}, - \c!finalpubsep={\space\btxlabeltext{\currentbtxspecification:and}\space}, - \c!sorttype=, - \c!compress=\v!no, - \c!inbetween=\space, - \c!range=\endash, - \c!left={[}, - \c!middle=, - \c!right={]}] + \c!separator:names:2={,\space}, + \c!separator:names:3={,\space\btxlabeltext{aps:and}\space}, % not \textampersand + \c!separator:names:4= {\space\btxlabeltext{aps:and}\space}] % not \textampersand + +\definebtx + [aps:list] + [aps] + [\c!authorconversion=normalshort, + placetitle=\v!yes] % can be set to no for journal, for example. + % this does not work - see below? (would title=yes be acceptable?) + +% The following are similar to default, but inherit from aps:list -\definebtxcitevariant - [author] - [\c!lastnamesep={,\nobreakspace\textampersand\space}, - \c!finalnamesep={\nobreakspace\textampersand\space}, % no comma! - \c!authorconversion=\v!name] - -\definebtxcitevariant - [authoryear] - [\c!compress=\v!yes, - \c!inbetween={,\space}, - \c!left={(}, - \c!right={)}, - \c!pubsep={;\space}, - \c!lastpubsep={;\space}, - \c!finalpubsep={;\space}, - \c!lastnamesep={,\space\btxlabeltext{\currentbtxspecification:and}\space}, - \c!finalnamesep={\space\btxlabeltext{\currentbtxspecification:and}\space}, % no comma! - \c!authorconversion=\v!name] - -\definebtxcitevariant - [authoryears] - [authoryear] - [\c!left=, - \c!inbetween={\space(}, - \c!pubsep={);\space}, - \c!lastpubsep={);\space}, - \c!finalpubsep={);\space}, - \c!lastnamesep={,\space\btxlabeltext{\currentbtxspecification:and}\space}, - \c!finalnamesep={\space\btxlabeltext{\currentbtxspecification:and}\space}, % no comma! - \c!authorconversion=\v!name] +\definebtx + [aps:list:author] + [aps:list] +\definebtx + [aps:list:editor] + [aps:list:author] + +\definebtx + [aps:list:suffix] + [aps:list] + +\definebtx + [aps:list:url] + [aps:list] + +\definebtx + [aps:list:doi] + [aps:list] + +\definebtx + [aps:list:invertedshort] + [aps:list] + +\definebtx + [aps:list:short] + [aps:list] + +% This is for numbering=yes +\definebtx + [aps:list:yes] + [aps:list] + [\c!command={\high}, % also, left, right, stopper, style, color... + \c!align=flushright] %D In order to be able to get journals expanded (or normalized or abbreviated) you need %D to load a list: @@ -138,6 +102,303 @@ %D \btxloadjournallist[journals.txt] % the jabref list %D \stoptyping +% TODO + +\definebtx + [aps:list:journal] + [\c!style=\v!italic] + %command=\btxexpandedjournal] % btxabbreviatedjournal + +\definebtx + [aps:list:title] + [\c!style=\v!italic, + \c!command=\Word] + +\definebtx + [aps:list:title:article] + [aps:list:title] + [\c!style=] % journal is set in italics + +\definebtx + [aps:list:title:magazine] + [aps:list:title] + +\definebtx + [aps:list:title:newspaper] + [aps:list:title] + +\definebtx + [aps:list:title:periodical] + [aps:list:title] + +\definebtx + [aps:list:title:standard] + [aps:list:title] + +\definebtx + [aps:list:title:book] + [aps:list:title] + +\definebtx + [aps:list:title:inbook] + [aps:list:title] + +\definebtx + [aps:list:title:incollection] + [aps:list:title] + [\c!style=] % booktitle is set in italics + +\definebtx + [aps:list:title:proceedings] + [aps:list:title] + +\definebtx + [aps:list:title:inproceedings] + [aps:list:title] + [\c!style=] % booktitle is set in italics + +\definebtx + [aps:list:title:conference] + [aps:list:title] + [\c!style=] % booktitle is set in italics + +\definebtx + [aps:list:title:thesis] + [aps:list:title] + +\definebtx + [aps:list:title:phdthesis] + [aps:list:title] + +\definebtx + [aps:list:title:mastersthesis] + [aps:list:title] + +\definebtx + [aps:list:title:booklet] + [aps:list:title] + +\definebtx + [aps:list:title:manual] + [aps:list:title] + +\definebtx + [aps:list:title:techreport] + [aps:list:title] + +\definebtx + [aps:list:title:unpublished] + [aps:list:title] + +\definebtx + [aps:list:title:patent] + [aps:list:title] + +\definebtx + [aps:list:title:electronic] + [aps:list:title] + +\definebtx + [aps:list:title:other] + [aps:list:title] + +\definebtx + [aps:list:title:misc] + [aps:list:title] + +\definebtx + [aps:list:title:literal] + [aps:list:title] + +\definebtx + [aps:list:type] + [\c!command=\Word] + +% We define [page] settings in the aps namespace, inheriting the root +% settings, in order to eventually allow for modifications without touching +% root. + +\definebtx + [aps:page] + [\s!page] + +\definebtx + [aps:page:list] + [aps:page] + [\c!command={\wordright}] + +\definebtx + [aps:cite] + [aps:list] + [\c!authorconversion=\v!name] + +\definebtx + [aps:cite:author] + [aps:cite] + +% The following are similar to default, but inherit from aps:cite + +\definebtx + [aps:cite:authoryear] + [aps:cite:author] + [\c!compress=\v!yes, + \c!left={(}, + \c!right={)}, + \c!inbetween={,\space}] + +\definebtx + [aps:cite:authoryears] + [aps:cite:authoryear] + [\c!left=, + \c!right=, + \c!inbetween={\space}] + +\definebtx + [aps:cite:authornum] + [aps:cite:author] + [\c!left={(}, + \c!right={)}, + \c!sorttype=authornum] + +\definebtx + [aps:cite:authorref] + [aps:cite:authornum] + +\definebtx + [aps:cite:author:num] % todo + [aps:cite:authornum] + [\c!left={[}, + \c!right={]}] + +\definebtx + [aps:cite:author:year] % todo + [aps:cite:authoryear] + [\c!left=, + \c!right=] + +\definebtx + [aps:cite:author:years] % todo + [aps:cite:authoryears] + [\c!inbetween=, + \c!left=(, + \c!right=)] + +\definebtx + [aps:cite:year] + [aps:cite] + [\c!compress=\v!yes] + +\definebtx + [aps:cite:title] + [aps:cite] + [\c!command={\language[\currentbtxlanguage]}, % BAH + \c!style=\v!italic] + +\definebtx + [aps:cite:booktitle] + [aps:cite:title] + +\definebtx + [aps:cite:tag] + [aps:cite] + [\c!left={[}, + \c!right={]}] + +\definebtx + [aps:cite:key] + [aps:cite:tag] + +\definebtx + [aps:cite:serial] + [aps:cite] + [\c!left={[}, + \c!right={]}] + +\definebtx + [aps:cite:page] + [aps:cite] + [\c!left=, + \c!right=, + [\c!separator:2={,\space}, % :0 and :1 - between items of a list + \c!separator:3={,\space\btxlabeltext{aps:and}\space}, % not \textampersand + \c!separator:4= {\space\btxlabeltext{aps:and}\space}] % not \textampersand + +\definebtx + [aps:cite:pages] + [aps:cite:page] + +\definebtx + [aps:cite:keywords] + [aps:cite] + [\c!left={(}, + \c!right={)}] + +\definebtx + [aps:cite:invertedshort] + [aps:cite] + +\definebtx + [aps:cite:short] + [aps:cite] + [\c!left={[}, + \c!right={]}] + +\definebtx + [aps:cite:category] + [aps:cite] + [\c!left={[}, + \c!right={]}] + +\definebtx + [aps:cite:type] + [aps:cite:category] + +\definebtx + [aps:cite:url] + [aps:cite] + [\c!left={[}, + \c!right={]}] + +\definebtx + [aps:cite:doi] + [aps:cite:url] + +\definebtx + [aps:cite:num] + [aps:cite] + [\c!compress=\v!yes, + \c!left={[}, + \c!right={]}, + %\c!left=, % TODO: PRB uses superscript references... + %\c!right=, % and after punctuation, PRA, C, D, E, and L are before! + %\c!command={\high}, + \c!separator:2={,}, % no space + \c!separator:3=\btxparameter{\c!separator:2}, + \c!separator:4=\btxparameter{\c!separator:2}] + +\definebtx + [aps:cite:default] + [aps:cite:num] + +\definebtx + [aps:cite:textnum] + [aps:cite:num] + [\c!left={Ref.\nbsp}, + \c!command=, + \c!separator:2={,\space}, + \c!separator:3={\space\btxlabeltext{aps:and}\space}, + \c!separator:4={\space\btxlabeltext{aps:and}\space}] + +\definebtx + [aps:cite:entry] + [aps:cite] + [\c!left=, + \c!right=, + \c!inbetween={\space}, + \c!separator:2={;\space}, + \c!separator:3=\btxparameter{\c!separator:2}, + \c!separator:4=\btxparameter{\c!separator:2}] + %D Sometimes we have verbose injections in an entry and these can be language %D dependent, so we use labels. %D @@ -146,222 +407,332 @@ \setupbtxlabeltext [en] - [aps:mastersthesis={Master's thesis}, - aps:phdthesis={PhD thesis}, + [aps:and=and, + aps:number={no.}, + aps:edition={ed.}, + aps:Editor={Ed.}, + aps:Editors={Eds.}, + aps:Volume={Vol.}, + aps:Volumes={Vols.}, + aps:others={et al.}, + aps:page={p.}, + aps:pages={pp.}, + aps:mastersthesis={Master's thesis}, + aps:phdthesis={Doctoral dissertation}, aps:technicalreport={Tech. Rep.}, % Technical report - aps:supplement={Suppl.}, % Supplement + aps:supplement={Suppl.}, % Supplement (not used?) aps:patent=Patent, - aps:Translator={Trans.}, % Translator(s) - aps:Editor={Ed.}, % Editor - aps:Editors={Eds.}, % Editors - aps:edition={ed.}, % edition - aps:volume=volume, % used? - aps:Volume={Vol.}, % Volume - aps:Volumes={Vols.}, % Volumes - aps:number=number, - aps:Number={No.}, % Number - aps:nd={n.d.}, % no date - aps:in=in, - aps:of=of, - aps:In=In, - aps:Part={Pt.}, % Part - aps:p={p.}, - aps:pp={pp.}, - aps:pages=pages, - aps:and=and, - aps:period={. }, aps:Author=Author, - aps:Reference={Ref.}, - aps:References={Refs.}, - aps:Advanced={to be published}, + aps:Translator={Trans.}, % Translator(s) (not used?) + aps:inpress={in press}, + aps:tobe={to be published}, + aps:unpublished={unpublished}, + aps:Advanced={Advanced online publication}, aps:Retrieved={Available from}, % {Retrieved from}, - aps:others={\it et al.}] + aps:In=In] + +% Check this (google translate!!): + +\setupbtxlabeltext + [nl] + [aps:and=en, + aps:number={nr.}, + aps:edition={ed.}, % editie + aps:Editor=Editor, % Ed./Eds. + aps:Editors=Editors, + aps:Volume={Vol.}, + aps:Volumes={Vols.}, + aps:others={et al.}, + aps:page={p.}, + aps:pages={pp.}, + aps:mastersthesis=Masterproef, + aps:phdthesis=Proefschrift, + aps:technicalreport={Technisch rapport}, % Technical report + aps:supplement=Supplement, + aps:patent=Octrooi, + aps:Author=Auteur, + aps:Translator=Vertaler, + aps:inpress={in press}, % CHECK THESE! + aps:tobe={worden gepubliceerd}, + aps:unpublished={onuitgegeven}, + aps:Advanced={Geavanceerde online publicatie}, + aps:Retrieved={Beschikbaar vanaf}, % {Ontvangen van}, + aps:In=In] \setupbtxlabeltext [fr] - [aps:mastersthesis={Thèse de master (DEA, DESS, master)}, - aps:phdthesis={Thèse de doctorat}, - aps:technicalreport={Rapport technique}, - aps:supplement=Supplément, - aps:patent=Brevet, - aps:Translator=Traducteur, + [aps:and=et, + aps:others={et al.}, + aps:number={n\high{o}}, + aps:edition={édition}, aps:Editor=Éditeur, aps:Editors=Éditeurs, - aps:edition=édition, - aps:volume=volume, aps:Volume=Volume, aps:Volumes=Volumes, - aps:number=numéro, - aps:Number=Numéro, - aps:nd={s.d.} % sans date - aps:in=dans, - aps:of=de, - aps:In=Dans, - aps:Part=Partie, - aps:p={p.}, - aps:pp={pp.}, - aps:pages=pages, - aps:and=et, - aps:period={. }, + aps:others={et al.}, + aps:page={p.}, + aps:pages={pp.}, + aps:mastersthesis={Thèse de master (DEA, DESS, master)}, + aps:phdthesis={Thèse de doctorat}, + aps:technicalreport={Rapport technique}, + aps:supplement=Supplément, + aps:patent=Brevet, aps:Author=Auteur, - aps:Reference={Réf.}, - aps:References={Réfs.}, - aps:Advanced={à être publié}, + aps:Translator=Traducteur, + aps:inpress={sous impression}, + aps:tobe={à paraître}, + aps:unpublished={inédit}, % pour un livre + aps:Advanced={Publication en ligne anticipée}, aps:Retrieved={Disponible à}, % {Téléchargé de}, - aps:others={\it et al.}] + aps:In=Dans] \setupbtxlabeltext [de] - [aps:mastersthesis={Masterarbeit}, + [aps:and=und, + aps:number={nr.}, + aps:edition=Auf\/lage, + aps:Editor=Herausgeber, % Hrsg./Hg. + aps:Editors=Herausgeber, + aps:Volume=Band, % Bd. + aps:Volumes={Bände}, + aps:others={et al.}, + aps:page={S.}, + aps:pages={S.}, + aps:mastersthesis={Masterarbeit}, aps:phdthesis={Dissertation}, aps:technicalreport={Technischer Bericht}, aps:supplement={Beilage}, % Supplement aps:patent=Patent, - aps:Translator={Übersetzer}, % Übers. - aps:Editor=Herausgeber, % Hrsg./Hg. - aps:Editors=Herausgeber, - aps:edition=Auf\/lage, - aps:volume=Band, % Bd. - aps:Volume=Band, - aps:Volumes={Bände}, - aps:number=Nummer, - aps:Number={Nr.}, - aps:nd={o.D.}, % ohne Datum (mostly: o.J. / ohne Jahr) - aps:in=in, - aps:of=von, - aps:In=In, - aps:Part=Teil, - aps:p={S.}, - aps:pp={S.}, - aps:pages=Seiten, - aps:and=und, - aps:period={. }, aps:Author=Autor, - aps:Reference={Ref.}, - aps:References={Ref.}, - aps:Advanced={veröffentlicht werden}, + aps:Translator={Übersetzer}, % Übers. + aps:inpress={in der Presse}, % CHECK THESE! + aps:tobe={veröffentlicht werden}, + aps:unpublished={unveröffentlicht}, + aps:Advanced={Erweiterte Online-Publikation}, aps:Retrieved={heruntergeladen von}, - aps:others={\it et al.}] + aps:In=In] % thanks: Andrea Valle \setupbtxlabeltext [it] - [aps:mastersthesis={Tesi di laurea}, + [aps:and=e, + aps:number={nº}, + aps:edition={ed.}, % edizione + aps:Editor={A cura di}, + aps:Editors={A cura di}, + aps:Volume={Vol.}, % Volume + aps:Volumes={Vol.}, % Volumi + aps:others={et al.}, + aps:page={p.}, + aps:pages={pp.}, + aps:mastersthesis={Tesi di laurea}, aps:phdthesis={Tesi di dottorato}, aps:technicalreport={Relazione tecnica}, aps:supplement={Supplemento}, aps:patent=Brevetto, - aps:Translator={Trad.}, % Translator(s) - aps:Editor={A cura di}, - aps:Editors={A cura di}, - aps:edition={ed.}, - aps:volume=volume, - aps:Volume={Vol.}, - aps:Volumes={Vol.}, - aps:number=numero, - aps:Number=Numero, - aps:nd={s.d.}, - aps:in=in, - aps:of=di, - aps:In=In, - aps:Part=Parte, - aps:p={p.}, - aps:pp={pp.}, - aps:pages=pagine, - aps:and=e, - aps:period={. }, aps:Author=Autore, - aps:Reference={Rif.}, - aps:References={Rif.}, - aps:Advanced={da pubblicare}, + aps:Translator={Trad.}, % Translator(s) + aps:inpress={in press}, % CHECK THESE! + aps:tobe={da pubblicare}, + aps:unpublished={inedito}, + aps:Advanced={Pre-pubblicazione on line}, aps:Retrieved={Accessible online}, - aps:others={\it et al.}] + aps:In=In] -%D Instead of texdefinitions without arguments, we could have used setups but in my -%D editor (hh, scite) the commands stand out better. It also saves an additional -%D component in the name (e.g. common:) because commands and setups have a different -%D namespace, so similar calls don't clash. Performance of definitions is somewhat -%D better. +\setupbtxlabeltext + [es] + [aps:and=y, + aps:number={nº}, + aps:edition={ed.}, % edición + aps:Editor=Editor, % Ed./Eds. + aps:Editors=Editores, + aps:Volume={Vol.}, % Volumen + aps:Volumes={Vols.}, % Volúmenes + aps:others={et al.}, + aps:page={p.}, + aps:pages={pp.}, + aps:mastersthesis={Tesis de maestría}, + aps:phdthesis={Tesis doctoral}, + aps:technicalreport={Informe técnico}, + aps:supplement=Suplemento, + aps:patent=Patente, + aps:Author=Autor, + aps:Translator=Traductor, + aps:inpress={en prensa}, % CHECK THESE! + aps:tobe={que se publicará}, + aps:unpublished={inédito}, + aps:Advanced={Publicación en línea avanzada}, + aps:Retrieved={Disponible desde}, % {Obtenido de}, + aps:In=En] + +% cite setups + +\startsetups btx:aps:nd + \doifelse {\currentbtxcategory} {journal} { + \btxlabeltext{aps:tobe} + } { + \doifelse {\currentbtxcategory} {book} { + \btxlabeltext{aps:inpress} + } { + \btxlabeltext{aps:unpublished} + } + } +\stopsetups -%D \btxdoif... and \btxflush rely on the definitions in publ-imp-aps.lua: -%D fields that are not listed as required nor optional are IGNORED. +\startsetups btx:aps:cite:author:year + \texdefinition{\s!btx:\s!cite:concat} + \ifx\currentbtxfirst\empty + \fastsetup{btx:aps:nd} + \else + \texdefinition {\s!btx:\s!cite:inject} { + \btxcitereference + \currentbtxfirst + } + \ifx\currentbtxsecond\empty \else + \btxparameter\v!inbetween + \texdefinition {\s!btx:\s!cite:inject} { + \currentbtxsecond + } + \fi + \ifx\currentbtxthird\empty \else + \texdefinition {\s!btx:\s!cite:inject} { + \currentbtxthird + } + \fi + \fi +\stopsetups -% First some helpers: +\startsetups btx:aps:cite:author:years + \fastsetup{btx:aps:cite:author:year} +\stopsetups -\starttexdefinition btx:aps:inject #link #content +\startsetups [btx:aps:page:list] + \fastsetup{\s!btx:\s!page:concat} + \ifx\currentbtxlastpage\empty + \btxlabeltext{aps:page} + \else + \btxlabeltext{aps:pages} + \fi + \btxnbsp \ifconditional\btxinteractive - \ifx\currentbtxinternal\empty - #content - \else + \goto { + \currentbtxfirstpage + } [ + internal(\currentbtxfirstinternal) + ] + \ifx\currentbtxlastpage\empty \else + \btxparameter\c!pageconnector \goto { - #content + \currentbtxlastpage } [ - #link + internal(\currentbtxlastinternal) ] \fi \else - #content + \currentbtxfirstpage + \ifx\currentbtxlastpage\empty \else + \btxparameter\c!pageconnector + \currentbtxlastpage + \fi \fi -\stoptexdefinition +\stopsetups -\starttexdefinition btx:aps:title - \btxdoif {file} { - % we make the title active, opening file - \texdefinition{btx:aps:inject} {url(file:\btxflush{file})} - } - { - \begingroup - \it - \btxflush{Word -> title} - \btxdoif {subtitle} { +%D Instead of texdefinitions without arguments, we could have used setups but in my +%D editor (hh, scite) the commands stand out better. It also saves an additional +%D component in the name (e.g. common:) because commands and setups have a different +%D namespace, so similar calls don't clash. Performance of definitions is somewhat +%D better. + +%D We use "texdefinitions" (with eventual arguments) for helpers that are used +%D in the rendering "setups" defined for each category below. + +%D Note that \btxdoif... and \btxflush rely on the definitions in +%D publ-imp-aps.lua: fields that are not listed as required nor optional are +%D IGNORED. We also make heavy use of the notion of sets - comma-separated lists +%D of alternative fields to be used in hierarchal order. For example: +%D author = { "author", "editor", "publisher", "title" }, will return the +%D author field if it exists; if not, the editor field will be returned, if it +%D exists; if not, the publisher field will be returned, if it exists; if not, +%D the title field will be returned, it it exists; if not, nothing will be +%D returned. In lua syntax, it can be understood as +%D author or editor or publisher or title or "" + +\starttexdefinition btx:aps:composed-title #title + \begingroup + \language[\currentbtxlanguage] + \btxusecommand[aps:list:title:\currentbtxcategory] { + \btxflush{#title} + \btxdoif {sub#title} { \btxcolon - \btxflush{Word -> subtitle} - } - \italiccorrection - \endgroup - \doifnot {\currentbtxcategory} {techreport} { - \doifnotmode {btx:aps:thesis} { - \btxdoif{type} { - \btxleftbracket - \btxflush{Word -> type} - \btxrightbracket - } + \btxflush{sub#title} } } - } + \endgroup \stoptexdefinition -% need for a global option to activate or inhibit.... +\starttexdefinition btx:aps:title + \setmode{btx:aps:title-placed} + % we make the title active, opening file + \btxdoifelse {file} { + \texdefinition{btx:format:inject} + {url(file:\btxflush{file})} + { + \btxstartstyleandcolor [aps:list:title:\currentbtxcategory] + \texdefinition{btx:aps:composed-title}{title} + \btxstopstyleandcolor + } + } { + \btxstartstyleandcolor [aps:list:title:\currentbtxcategory] + \texdefinition{btx:aps:composed-title}{title} + \btxstopstyleandcolor + } +\stoptexdefinition -\starttexdefinition btx:aps:optional-title - \btxdoif {title} { - \btxdoif {file} { - % we make the title active, opening file - \texdefinition{btx:aps:inject} {url(file:\btxflush{file})} - } - { - \quotation{% - \btxflush{Word -> title} - \btxdoif {subtitle} { - \btxcolon - \btxflush{Word -> subtitle} - } +\starttexdefinition btx:aps:title-if-not-placed + \doifmodeelse {btx:aps:title-placed} { + \resetmode{btx:aps:title-placed} + } { + %does not work (need to check the setting) + %\doifelse{\btxparameter{placetitle}}\v!yes { + \btxdoif {title} { + \texdefinition {btx:aps:title} + \btxcomma } - \btxcomma - } + %} } \stoptexdefinition -\starttexdefinition btx:aps:editor - \btxflush{editor} - \btxleftparenthesis - \btxsingularorplural {editor} { - \btxlabeltext{aps:Editor} +\starttexdefinition btx:aps:year + \btxdoifelse {year} { + \btxflush{year} } { - \btxlabeltext{aps:Editors} + \fastsetup{btx:aps:nd} + } +\stoptexdefinition + +%\starttexdefinition btx:aps:suffixedyear +% \btxdoifelse {year} { +% \btxflush{year} +% \btxflush{suffix} +% } { +% \fastsetup{btx:aps:nd} +% } +%\stoptexdefinition + +\starttexdefinition btx:aps:author-or-editor #author + \btxdoif {#author} { + \btxflush{#author} + \doif {\btxfoundname{#author}} {editor} { + \btxleftparenthesis + \btxsingularorplural {editor} { + \btxlabeltext{aps:Editor} + } { + \btxlabeltext{aps:Editors} + } + \btxrightparenthesisperiod + } } - \btxrightparenthesisperiod \stoptexdefinition \starttexdefinition btx:aps:author @@ -375,98 +746,137 @@ } \stoptexdefinition -\starttexdefinition btx:aps:italic #field - \begingroup - \it - \btxflush{#field} - \italiccorrection - \endgroup -\stoptexdefinition - -\starttexdefinition btx:aps:bold #field - \begingroup - \bf - \btxflush{#field} - \endgroup -\stoptexdefinition - -\starttexdefinition btx:aps:editor-in- #title - \btxdoifelse {editor} { +\starttexdefinition btx:aps:editor-in + \btxdoif {booktitle} { \btxlabeltext{aps:In} - \btxspace - \texdefinition{btx:aps:editor} - \btxdoif {#title} { - \texdefinition{btx:aps:italic}{Word -> #title} - } - } { - \btxdoif {#title} { - \btxlabeltext{aps:In} + \doifnot {\btxfoundname{author}} {editor} { \btxspace - \texdefinition{btx:aps:italic}{Word -> #title} + \texdefinition{btx:aps:author-or-editor} {editor} } + \btxspace + \btxstartstyleandcolor[aps:list:title] + \texdefinition{btx:aps:composed-title} {booktitle} + \btxstopstyleandcolor + \btxcomma } \stoptexdefinition \starttexdefinition btx:aps:editionset - \btxdoifelse {edition} { - \btxspace - \doif {\currentbtxcategory} {techreport} { - \btxdoifelse {type} { - \btxflush{Word -> type} - } { - \btxlabeltext{aps:technicalreport} - } - \setmode{btx:aps:comma} - } - \doif {\btxfoundname{edition}} {edition} { - \doifmode {btx:aps:comma} - {\btxcomma} - \btxflush{edition} - \btxspace - \btxlabeltext{aps:edition} - \setmode{btx:aps:comma} - } - \btxdoif {volume} { - \doifmode {btx:aps:comma} - {\btxcomma} - \btxoneorrange {volume} { - \btxlabeltext{aps:Volume} - } { - \btxlabeltext{aps:Volumes} + \doif {\currentbtxcategory} {techreport} { + \btxdoifelse {type} { + \btxusecommand[aps:list:type] { + \btxflush{type} } - \btxspace - \btxflush{volume} - \setmode{btx:aps:comma} - } - \btxdoif {number} { - \doifmode {btx:aps:comma} - {\btxcomma} - \btxlabeltext{aps:Number} - \btxspace - \btxflush{number} - \setmode{btx:aps:comma} + } { + \btxlabeltext{aps:technicalreport} } - \btxdoif {pages} { - \doifmode {btx:aps:comma} - {\btxcomma} - \btxoneorrange {pages} { - \btxlabeltext{aps:p} - } { - \btxlabeltext{aps:pp} - } - \btxspace - \btxflush{pages} + \btxcomma + } + \btxdoif {volume} { + \btxoneorrange {volume} { + \btxlabeltext{aps:Volume} + } { + \btxlabeltext{aps:Volumes} } - \btxperiod - } { - \doif {\currentbtxcategory} {techreport} { - \btxleftparenthesis - \btxlabeltext{aps:technicalreport} - \btxrightparenthesisperiod + \btxspace + \btxflush{volume} + \btxcomma + } + \btxdoif {number} { + \btxlabeltext{aps:number} + \btxspace + \btxflush{number} + \btxcomma + } + \btxdoif {edition} { + \btxflush{edition} + \btxspace + \btxlabeltext{aps:edition} + \btxcomma + } + \btxdoif {pages} { + \btxoneorrange {pages} { + \btxlabeltext{aps:page} + } { + \btxlabeltext{aps:pages} } + \btxnbsp + \btxflush{pages} + \btxcomma } \stoptexdefinition +%% this could be simplified! +%\starttexdefinition btx:aps:journal-volume-number-pages +% \btxdoif {journal} { +% \btxspace +% \btxstartstyleandcolor[aps:list:journal] +% \btxusecommand[aps:list:journal] { +% \btxflush{journal} +% } +% \btxstopstyleandcolor +% \btxdoif {volume} { +% \btxcomma +% \btxstartstyleandcolor[aps:list:journal] +% \btxflush{volume} +% \btxstopstyleandcolor +% \btxdoifnot {number} { +% \btxdoifelse {pages} +% {\btxcomma} +% {\btxperiod} +% } +% } +% \btxdoif {number} { +% \btxdoifelse {volume} { +% \removeunwantedspaces( +% } { +% \btxcomma +% \btxleftparenthesis +% } +% \btxflush{number} +% \btxdoifelse {pages} +% {\btxrightparenthesiscomma} +% {\btxrightparenthesisperiod} +% } +% \btxdoif {pages} { +% \btxdoifnot {volume} { +% \btxdoifnot {number} { +% \btxcomma +% } +% } +% \doif {\currentbtxcategory} {newspaper} { +% \btxoneorrange {pages} { +% \btxlabeltext{aps:page} +% } { +% \btxlabeltext{aps:pages} +% } +% \btxnbsp +% } +% \btxflush{pages} +% \btxperiod +% } +% \doifnot {\currentbtxcategory} {newspaper} { +% \btxdoifnot {volume} { +% \btxdoifnot {number} { +% \btxdoifnot {pages} { +% \btxdoifelse {doi} { +% \btxperiod +% \btxlabeltext{aps:Advanced} +% \btxperiod +% } { +% \btxdoif {url} { +% \btxperiod +% \btxlabeltext{aps:Advanced} +% \btxperiod +% } +% } +% } +% } +% } +% } +% } +%\stoptexdefinition + \starttexdefinition btx:aps:journal-volumeset-year \btxdoif {journal} { % expandedjournal abbreviatedjournal @@ -492,24 +902,44 @@ \btxflush{pages} } \btxleftparenthesis - \btxdoifelse {year} { - \btxflush{year} - } { - \btxlabeltext{aps:Advanced} - } + \fastsetup{btx:aps:year} \btxrightparenthesis \btxperiod } \stoptexdefinition +\starttexdefinition btx:aps:publisher-wherefrom-year + \removeunwantedspaces + \removepunctuation + \btxleftparenthesis + \btxflush{publisher} + \btxdoifelse {address} { + \btxdoif {publisher} { + \btxcomma + } + \btxflush{address} + \btxdoif {country} { + \btxcomma + \btxflush{country} + } + \btxcomma + } { + \btxdoif {publisher} { + \btxcomma + } + } + \fastsetup{btx:aps:year} + \btxrightparenthesis +\stoptexdefinition + \definebreakpoints[doi] \definebreakpoint [doi][:][nleft=3,type=1] \definebreakpoint [doi][/][nleft=3,type=1] \definebreakpoint [doi][-][nleft=3,type=1] \definebreakpoint [doi][.][nleft=3,type=1] +% use \btxentry here? \starttexdefinition btx:aps:url - % use \btxentry here? \btxspace \btxlabeltext{aps:Retrieved} \btxspace @@ -527,8 +957,8 @@ \endgroup \stoptexdefinition +% use \btxentry here? \starttexdefinition btx:aps:doi - % use \btxentry here? \btxspace \begingroup \setbreakpoints[doi] @@ -544,143 +974,128 @@ \endgroup \stoptexdefinition +% also issn - see publ-imp-aps.lua \starttexdefinition btx:aps:isbn - % also issn - see publ-imp-aps.lua \btxdoif {isbn} { \btxleftparenthesis \WORD{\btxfoundname{isbn}}:\btxspace + \setbreakpoints[doi] \btxflush{isbn} \btxrightparenthesis } \stoptexdefinition \starttexdefinition btx:aps:note - % grouping could indeed be useful for note. \btxdoif {note} { - \btxspace - {\btxflush{note}} + \btxleftparenthesis + \btxflush{note} + \btxrightparenthesis } \stoptexdefinition -\starttexdefinition btx:aps:url-note-doi +\starttexdefinition btx:aps:url-doi-note \doif {\btxfoundname{doi}} {url} { \texdefinition{btx:aps:url} } \texdefinition{btx:aps:isbn} - \texdefinition{btx:aps:note} \doif {\btxfoundname{doi}} {doi} { \texdefinition{btx:aps:doi} } + \texdefinition{btx:aps:note} \removeunwantedspaces \stoptexdefinition -\starttexdefinition btx:aps:publisher-wherefrom-year - \btxleftparenthesis - \btxflush{publisher} - \btxdoifelse {address} { - \btxdoif {publisher} { - \btxcomma - } - \btxflush{address} - \btxdoif {country} { - \btxcomma - \btxflush{country} - } - \btxcomma - } { - \btxdoif {publisher} { - \btxcomma - } - } - \btxdoifelse {year} { - \btxflush{year} - } { - \btxlabeltext{aps:Advanced} - } - \btxrightparenthesis -\stoptexdefinition - -% Then by category +% Then setups, by category % An article from a journal % Required fields: author or editor or title, journal, (year). % Optional fields: volume, number, pages, type, doi, url, note. % Note that bibtex (and tools) do not include editor (e.g. special issue or section) -\startsetups btx:aps:article +\startsetups btx:aps:list:article \texdefinition{btx:aps:author} - \texdefinition{btx:aps:optional-title} + \texdefinition{btx:aps:title-if-not-placed} \texdefinition{btx:aps:journal-volumeset-year} \texdefinition{btx:aps:url-note-doi} \stopsetups % An article from a magazine. % Required fields: author or title, journal, (year). -% Optional fields: volume, number, pages, type, month, day, doi, url, note. +% Optional fields: number, pages, type, month, day, doi, url, note. -\startsetups btx:aps:magazine - \texdefinition{btx:aps:author} - \texdefinition{btx:aps:optional-title} - \texdefinition{btx:aps:journal-volumeset-year} - \texdefinition{btx:aps:url-note-doi} +\startsetups btx:aps:list:magazine + \fastsetup{btx:aps:list:article} \stopsetups % An article from a newspaper. % Required fields: author or title, journal, (year). % Optional fields: volume, number, pages, type, month, day, doi, url, note. -\startsetups btx:aps:newspaper +\startsetups btx:aps:list:newspaper + \fastsetup{btx:aps:list:article} +\stopsetups + +% A complete issue of a periodical, such as a special issue of a journal. +% Required fields: title, year +% Optional fields: editor, publisher, subtitle, series, volume, number, month, organization, doi, url, issn, note + +% needs to be tuned... +\startsetups btx:aps:list:periodical + \fastsetup{btx:aps:list:article} +\stopsetups + +% National and international standards issued by a standards body +% Required fields: author, institution, or organization, year, title +% Optional fields: subtitle, doi, url, note + +\startsetups btx:aps:list:standard \texdefinition{btx:aps:author} - \texdefinition{btx:aps:optional-title} - \texdefinition{btx:aps:journal-volumeset-year} - \texdefinition{btx:aps:url-note-doi} + \texdefinition{btx:aps:title-if-not-placed} + \texdefinition{btx:aps:url-doi-note} \stopsetups +% year? % A book with an explicit publisher. % Required fields: author or editor or publisher, title, (year). % Optional fields: volume or number, series, address, edition, month, day, note. +% APS? ignores: month, day % todo: series? -\startsetups btx:aps:book +\startsetups btx:aps:list:book \texdefinition{btx:aps:author} - \texdefinition{btx:aps:title} - \texdefinition{btx:aps:publisher-wherefrom-year} + \texdefinition{btx:aps:title-if-not-placed} \texdefinition{btx:aps:editionset} - \texdefinition{btx:aps:url-note-doi} + \texdefinition{btx:aps:publisher-wherefrom-year} + \texdefinition{btx:aps:url-doi-note} \stopsetups +% There is some debate about how inbook should differ from incollection + % A part of a book, which may be a chapter (or section or whatever) and/or a range of pages. +% (note that inbook is handled differently by bibtex and biblatex) % Required fields: author or editor, title, chapter and/or pages, publisher, year. % Optional fields: volume or number, series, type, address, edition, month, note. +% We add optional: booktitle. +% APS? ignores: chapter, month -% todo: series? - -\startsetups btx:aps:inbook +\startsetups btx:aps:list:inbook \texdefinition{btx:aps:author} - \btxdoif {chapter} { - \btxflush{Word -> chapter} - \btxspace - } - \texdefinition{btx:aps:editor-in-}{title} - \texdefinition{btx:aps:publisher-wherefrom-year} + \texdefinition{btx:aps:title-if-not-placed} + \texdefinition{btx:aps:editor-in} \texdefinition{btx:aps:editionset} - \texdefinition{btx:aps:url-note-doi} + \texdefinition{btx:aps:publisher-wherefrom-year} + \texdefinition{btx:aps:url-doi-note} \stopsetups +% chapter? % A part of a book having its own title. % Required fields: author, title, booktitle, publisher, year. % Optional fields: editor, volume or number, series, type, chapter, pages, address, edition, month, note. +% APS? ignores: chapter, month -% todo: series? - -\startsetups btx:aps:incollection - \texdefinition{btx:aps:author} - \texdefinition{btx:aps:title} - \texdefinition{btx:aps:editor-in-}{booktitle} - \texdefinition{btx:aps:publisher-wherefrom-year} - \texdefinition{btx:aps:editionset} - \texdefinition{btx:aps:url-note-doi} +\startsetups btx:aps:list:incollection + \fastsetup{btx:aps:list:inbook} \stopsetups % The proceedings of a conference. @@ -688,57 +1103,46 @@ % Optional fields: editor, volume or number, series, address, month, organization, publisher, note. % todo: series? -\startsetups btx:aps:proceedings - \texdefinition{btx:aps:author} - \texdefinition{btx:aps:title} - \btxdoif {editor} { - \btxdoif {organization} { - \btxspace - \btxflush{organization} - \btxcomma - } - } - \texdefinition{btx:aps:publisher-wherefrom-year} - \texdefinition{btx:aps:editionset} - \texdefinition{btx:aps:url-note-doi} +\startsetups btx:aps:list:proceedings + \fastsetup{btx:aps:list:book} \stopsetups % An article in a conference proceedings. % Required fields: author, title, booktitle, year. % Optional fields: editor, volume or number, series, pages, address, month, organization, publisher, note. -% todo: series? -\startsetups btx:aps:inproceedings +\startsetups btx:aps:list:inproceedings \texdefinition{btx:aps:author} - \texdefinition{btx:aps:title} - \texdefinition{btx:aps:editor-in-}{booktitle} + \texdefinition{btx:aps:title-if-not-placed} + \texdefinition{btx:aps:editor-in} + \texdefinition{btx:aps:editionset} \btxdoif {organization} { \btxspace \btxflush{organization} \btxcomma } \texdefinition{btx:aps:publisher-wherefrom-year} - \texdefinition{btx:aps:editionset} - \texdefinition{btx:aps:url-note-doi} + \texdefinition{btx:aps:url-doi-note} \stopsetups -\startsetups btx:aps:conference - \fastsetup{btx:aps:inproceedings} +\startsetups btx:aps:list:conference + \fastsetup{btx:aps:list:inproceedings} \stopsetups % A thesis. % Required fields: author, title, school, year. % Optional fields: type, address, month, note. -\startsetups btx:aps:thesis - \setmode{btx:aps:thesis} +\startsetups btx:aps:list:thesis \texdefinition{btx:aps:author} - \texdefinition{btx:aps:title} + \texdefinition{btx:aps:title-if-not-placed} \btxleftparenthesis \btxdoifelse {type} { - \btxflush{Word -> type} + \btxusecommand[aps:list:type] { + \btxflush{type} + } } { - \Word{\btxlabeltext{aps:\currentbtxcategory}} + \btxlabeltext{aps:\currentbtxcategory} } \btxrightparenthesis \btxdoif {school} { @@ -758,60 +1162,47 @@ } } \btxperiod - \texdefinition{btx:aps:url-note-doi} + \texdefinition{btx:aps:url-doi-note} \stopsetups -\startsetups btx:aps:phdthesis - \fastsetup{btx:aps:thesis} +\startsetups btx:aps:list:phdthesis + \fastsetup{btx:aps:list:thesis} \stopsetups -\startsetups btx:aps:mastersthesis - \fastsetup{btx:aps:thesis} +\startsetups btx:aps:list:mastersthesis + \fastsetup{btx:aps:list:thesis} \stopsetups % A work that is printed and bound, but without a named publisher or sponsoring institution. % Required field: title. % Optional fields: author, howpublished, address, month, year, note. -\startsetups btx:aps:booklet - \texdefinition{btx:aps:author} - \texdefinition{btx:aps:title} - \texdefinition{btx:aps:publisher-wherefrom-year} - \texdefinition{btx:aps:url-note-doi} +\startsetups btx:aps:list:booklet + \fastsetup{btx:aps:list:book} \stopsetups % Technical documentation. % Required field: title. % Optional fields: author, organization, address, edition, month, year, note. -\startsetups btx:aps:manual - \texdefinition{btx:aps:author} - \texdefinition{btx:aps:title} - \texdefinition{btx:aps:publisher-wherefrom-year} - \texdefinition{btx:aps:editionset} - \texdefinition{btx:aps:url-note-doi} +\startsetups btx:aps:list:manual + \fastsetup{btx:aps:list:book} \stopsetups % A report published by a school or other institution, usually numbered within a series. % Required fields: author, title, institution, year. % Optional fields: type, number, address, month, note. -\startsetups btx:aps:techreport - \texdefinition{btx:aps:author} - \texdefinition{btx:aps:title} - \texdefinition{btx:aps:publisher-wherefrom-year} - \texdefinition{btx:aps:editionset} - \texdefinition{btx:aps:url-note-doi} +\startsetups btx:aps:list:techreport + \fastsetup{btx:aps:list:book} \stopsetups % A document having an author and title, but not formally published. % Required fields: author, title, note. % Optional fields: month, year. -\startsetups btx:aps:unpublished - \texdefinition{btx:aps:author} - \texdefinition{btx:aps:title} - \texdefinition{btx:aps:url-note-doi} +\startsetups btx:aps:list:unpublished + \fastsetup{btx:aps:list:book} \stopsetups % A patent. Note that this category was not defined with BIBTEX. Below from JabRef: @@ -821,9 +1212,9 @@ % todo: yearfiled, monthfiled, dayfiled -\startsetups btx:aps:patent +\startsetups btx:aps:list:patent \texdefinition{btx:aps:author} - \texdefinition{btx:aps:title} + \texdefinition{btx:aps:title-if-not-placed} \begingroup \it \btxdoif {nationality} { @@ -834,41 +1225,14 @@ \btxlabeltext{aps:patent} \btxdoif {number} { \btxspace - \btxlabeltext{aps:Number} + \btxlabeltext{aps:number} \btxspace \btxflush{number} } \btxperiod \italiccorrection \endgroup - \btxdoifelse {author} { - \btxdoifelse {country} { - \btxspace - \btxdoif {address} { - \btxflush{address} - \btxcomma - } - \btxflush{country} - \btxdoifelse {assignee} - {\btxcolon} {\btxperiod} - } { - \btxdoifelse {address} { - \btxspace - \btxflush{address} - \btxdoifelse {assignee} - {\btxcolon} {\btxperiod} - } { - \btxdoifelse {assignee} - {\btxspace} {} - } - } - \btxdoif {assignee} { - \btxflush{assignee} - \btxperiod - } - } { - \texdefinition{btx:aps:publisher-wherefrom-year} - } + \texdefinition{btx:aps:publisher-wherefrom-year} \texdefinition{btx:aps:url} \texdefinition{btx:aps:note} \stopsetups @@ -880,9 +1244,9 @@ % Like Misc below but includes organization. -\startsetups btx:aps:electronic +\startsetups btx:aps:list:electronic \texdefinition{btx:aps:author} - \texdefinition{btx:aps:title} + \texdefinition{btx:aps:title-if-not-placed} \btxdoif {organization} { \btxspace \btxflush{organization} @@ -893,50 +1257,42 @@ \btxflush{howpublished} \btxperiod } - \texdefinition{btx:aps:url-note-doi} + \texdefinition{btx:aps:url-doi-note} \stopsetups % Other. Note that this category was not defined with BIBTEX. Below from JabRef: % Required fields: author or title, year % Optional fields: note, doi, url -\startsetups btx:aps:other - \texdefinition{btx:aps:author} - \texdefinition{btx:aps:title} - \texdefinition{btx:aps:url-note-doi} +\startsetups btx:aps:list:other + \fastsetup{btx:aps:list:book} \stopsetups % Use this type when nothing else fits. % Required fields: none. % Optional fields: author, title, howpublished, month, year, note. -\startsetups btx:aps:misc +\startsetups btx:aps:list:misc \texdefinition{btx:aps:author} - \texdefinition{btx:aps:title} + \texdefinition{btx:aps:title-if-not-placed} \btxdoif {howpublished} { \btxspace \btxflush{howpublished} \btxperiod } - \texdefinition{btx:aps:url-note-doi} + \texdefinition{btx:aps:url-doi-note} \stopsetups % If all else fails to match: -\startsetups btx:aps:literal +\startsetups btx:aps:list:literal + %\btxleftparenthesis + \removeunwantedspaces( + \btxflush{key} + \btxrightparenthesis \btxdoif {text} { \btxflush{text} } \stopsetups -%D Experiment: - -\startsetups btx:aps:lefttext - \currentbtxlefttext -\stopsetups - -\startsetups btx:aps:righttext - \currentbtxrighttext -\stopsetups - \stopbtxrenderingdefinitions diff --git a/tex/context/base/publ-imp-author.mkvi b/tex/context/base/publ-imp-author.mkvi index 6547573cf..534d8ce0b 100644 --- a/tex/context/base/publ-imp-author.mkvi +++ b/tex/context/base/publ-imp-author.mkvi @@ -31,15 +31,9 @@ \startsetups \s!btx:\s!cite:\s!author:concat \ifcase\currentbtxoverflow - \ifcase\currentbtxconcat \or \or - \btxparameter\c!namesep - \or - \btxparameter\c!lastnamesep - \or - \btxparameter\c!finalnamesep - \fi + \btxparameter{\c!separator:names:\number\currentbtxconcat} \else - % \btxparameter\c!namesep + %\btxparameter{\c!separator:names:2} \fi \stopsetups @@ -53,18 +47,18 @@ \fastsetup{\s!btx:\s!cite:\s!author:concat} \ifx\currentbtxfirstnames\empty \else \currentbtxfirstnames - \btxparameter\c!firstnamesep + \btxparameter{\c!separator:firstnames} \fi \ifx\currentbtxvons\empty \else \currentbtxvons \ifx\currentbtxsurnames\empty \else - \btxparameter\c!vonsep + \btxparameter{\c!separator:vons} \fi \fi \ifx\currentbtxsurnames\empty \else \currentbtxsurnames \ifx\currentbtxjuniors\empty \else - \btxparameter\c!juniorsep + \btxparameter{\c!separator:juniors} \currentbtxjuniors \fi \fi @@ -75,18 +69,18 @@ \fastsetup{\s!btx:\s!cite:\s!author:concat} \ifx\currentbtxinitials\empty \else \currentbtxinitials - \btxparameter\c!initialsep + \btxparameter{\c!separator:initials} \fi \ifx\currentbtxvons\empty \else \currentbtxvons \ifx\currentbtxsurnames\empty \else - \btxparameter\c!vonsep + \btxparameter{\c!separator:vons} \fi \fi \ifx\currentbtxsurnames\empty \else \currentbtxsurnames \ifx\currentbtxjuniors\empty \else - \btxparameter\c!juniorsep + \btxparameter{\c!separator:juniors} \currentbtxjuniors \fi \fi @@ -99,25 +93,25 @@ \texdefinition{\s!btx:\s!cite:\s!author:\s!de} \doifmode {\s!btx:\s!de} { \currentbtxvons - \btxparameter\c!vonsep + \btxparameter{\c!separator:vons} } \fi \ifx\currentbtxsurnames\empty \else \currentbtxsurnames \ifx\currentbtxjuniors\empty \else - \btxparameter\c!juniorsep + \btxparameter{\c!separator:juniors} \currentbtxjuniors \fi \fi \ifx\currentbtxfirstnames\empty % firstnames are optional \else - \btxparameter\c!surnamefirstnamesep + \btxparameter{\c!separator:invertedfirstnames} \currentbtxfirstnames \fi \ifx\currentbtxvons\empty \else \doifnotmode {\s!btx:\s!de} { - \btxparameter\c!vonsep + \btxparameter{\c!separator:vons} \currentbtxvons } \fi @@ -130,25 +124,25 @@ \texdefinition{\s!btx:\s!cite:\s!author:\s!de} \doifnotmode {\s!btx:\s!de} { \currentbtxvons - \btxparameter\c!vonsep + \btxparameter{\c!separator:vons} } \fi \ifx\currentbtxsurnames\empty \else \currentbtxsurnames \ifx\currentbtxjuniors\empty \else - \btxparameter\c!juniorsep + \btxparameter{\c!separator:juniors} \currentbtxjuniors \fi \fi \ifx\currentbtxinitials\empty % initials are optional \else - \btxparameter\c!surnameinitialsep + \btxparameter{\c!separator:invertedinitials} \currentbtxinitials \fi \ifx\currentbtxvons\empty \else \doifmode {\s!btx:\s!de} { - \btxparameter\c!vonsep + \btxparameter{\c!separator:vons} \currentbtxvons } \fi @@ -160,13 +154,13 @@ % is this treated differently in german? \ifx\currentbtxvons\empty \else \currentbtxvons - \btxparameter\c!vonsep + \btxparameter{\c!separator:vons} \fi \currentbtxsurnames \ifcase\currentbtxauthorstate \else % potential clash of names so we force initials \ifx\currentbtxinitials\empty \else - \btxparameter\c!surnameinitialsep + \btxparameter{\c!separator:invertedinitials} \currentbtxinitials \fi \fi @@ -177,15 +171,9 @@ \startsetups \s!btx:\s!list:\s!author:concat \ifcase\currentbtxoverflow - \ifcase\currentbtxconcat \or \or - \btxparameter\c!namesep - \or - \btxparameter\c!lastnamesep - \or - \btxparameter\c!finalnamesep - \fi + \btxparameter{\c!separator:names:\number\currentbtxconcat} \else - \btxparameter\c!namesep + \btxparameter{\c!separator:names:2} \fi \stopsetups @@ -199,18 +187,18 @@ \fastsetup{\s!btx:\s!list:\s!author:concat} \ifx\currentbtxfirstnames\empty \else \currentbtxfirstnames - \btxparameter\c!firstnamesep + \btxparameter{\c!separator:firstnames} \fi \ifx\currentbtxvons\empty \else \currentbtxvons \ifx\currentbtxsurnames\empty \else - \btxparameter\c!vonsep + \btxparameter{\c!separator:vons} \fi \fi \ifx\currentbtxsurnames\empty \else \currentbtxsurnames \ifx\currentbtxjuniors\empty \else - \btxparameter\c!juniorsep + \btxparameter{\c!separator:juniors} \currentbtxjuniors \fi \fi @@ -221,18 +209,18 @@ \fastsetup{\s!btx:\s!list:\s!author:concat} \ifx\currentbtxinitials\empty \else \currentbtxinitials - \btxparameter\c!initialsep + \btxparameter{\c!separator:initials} \fi \ifx\currentbtxvons\empty \else \currentbtxvons \ifx\currentbtxsurnames\empty \else - \btxparameter\c!vonsep + \btxparameter{\c!separator:vons} \fi \fi \ifx\currentbtxsurnames\empty \else \currentbtxsurnames \ifx\currentbtxjuniors\empty \else - \btxparameter\c!juniorsep + \btxparameter{\c!separator:juniors} \currentbtxjuniors \fi \fi @@ -245,25 +233,25 @@ \texdefinition{\s!btx:\s!cite:\s!author:\s!de} \doifnotmode {\s!btx:\s!de} { \currentbtxvons - \btxparameter\c!vonsep + \btxparameter{\c!separator:vons} } \fi \ifx\currentbtxsurnames\empty \else \currentbtxsurnames \ifx\currentbtxjuniors\empty \else - \btxparameter\c!juniorsep + \btxparameter{\c!separator:juniors} \currentbtxjuniors \fi \fi \ifx\currentbtxfirstnames\empty % firstnames are optional \else - \btxparameter\c!surnamefirstnamesep + \btxparameter{\c!separator:invertedfirstnames} \currentbtxfirstnames \fi \ifx\currentbtxvons\empty \else \doifmode {\s!btx:\s!de} { - \btxparameter\c!vonsep + \btxparameter{\c!separator:vons} \currentbtxvons } \fi @@ -276,25 +264,25 @@ \texdefinition{\s!btx:\s!cite:\s!author:\s!de} \doifnotmode {\s!btx:\s!de} { \currentbtxvons - \btxparameter\c!vonsep + \btxparameter{\c!separator:vons} } \fi \ifx\currentbtxsurnames\empty \else \currentbtxsurnames \ifx\currentbtxjuniors\empty \else - \btxparameter\c!juniorsep + \btxparameter{\c!separator:juniors} \currentbtxjuniors \fi \fi \ifx\currentbtxinitials\empty % initials are optional \else - \btxparameter\c!surnameinitialsep + \btxparameter{\c!separator:invertedinitials} \currentbtxinitials \fi \ifx\currentbtxvons\empty \else \doifmode {\s!btx:\s!de} { - \btxparameter\c!vonsep + \btxparameter{\c!separator:vons} \currentbtxvons } \fi @@ -306,7 +294,7 @@ % is this treated differently in german? \ifx\currentbtxvons\empty \else \currentbtxvons - \btxparameter\c!vonsep + \btxparameter{\c!separator:vons} \fi \currentbtxsurnames \fastsetup{\s!btx:\s!list:\s!author:others} diff --git a/tex/context/base/publ-imp-cite.mkvi b/tex/context/base/publ-imp-cite.mkvi index f743a7212..ca4f2a970 100644 --- a/tex/context/base/publ-imp-cite.mkvi +++ b/tex/context/base/publ-imp-cite.mkvi @@ -51,13 +51,18 @@ \startsetups btx:cite:unknown \begingroup \btxcitereference - \currentbtxfirst + unknown: \currentbtxfirst \endgroup \stopsetups -\startsetups btx:cite:invalid +\startsetups btx:cite:empty \btxcitereference - <\currentbtxreference> + <empty> +\stopsetups + +\startsetups btx:cite:invalid + \btxcitereference + {\tt <\currentbtxreference>} \stopsetups % \startsetups btx:cite:normal @@ -101,13 +106,7 @@ %\stopsetups \starttexdefinition btx:cite:concat - \ifcase\currentbtxconcat \or \or - \btxparameter\c!pubsep - \or - \btxparameter\c!lastpubsep - \or - \btxparameter\c!finalpubsep - \fi + \btxparameter{\c!separator:\number\currentbtxconcat} \stoptexdefinition \startsetups btx:cite:normal @@ -117,21 +116,21 @@ \else \texdefinition {\s!btx:\s!cite:inject} { \btxcitereference - \btxusecommand[\currentbtxspecification:cite:\currentbtxcitevariant] { + \btxusecommand[\currentbtxspecification:cite:\currentbtxcitealternative] { \currentbtxfirst } } \ifx\currentbtxsecond\empty \else \btxparameter\v!inbetween \texdefinition {\s!btx:\s!cite:inject} { - \btxusecommand[\currentbtxspecification:cite:\currentbtxcitevariant] { + \btxusecommand[\currentbtxspecification:cite:\currentbtxcitealternative] { \currentbtxsecond } } \fi \ifx\currentbtxthird\empty \else \texdefinition {\s!btx:\s!cite:inject} { - \btxusecommand[\currentbtxspecification:cite:\currentbtxvariant] { + \btxusecommand[\currentbtxspecification:cite:\currentbtxcitealternative] { \currentbtxthird } } @@ -194,6 +193,11 @@ \fi \stopsetups +\startsetups \s!btx:\s!cite:entry + \texdefinition{\s!btx:\s!cite:concat} + \btxhandleciteentry +\stopsetups + % these three are goodies to get something bit are not set up as it makes no % sense to have something root for combinations like this (esp not because one % gets default anyway @@ -219,6 +223,12 @@ \startsetups btx:cite:num \fastsetup{btx:cite:range} \stopsetups +\startsetups btx:cite:default + \fastsetup{btx:cite:num} +\stopsetups +\startsetups btx:cite:textnum + \fastsetup{btx:cite:num} +\stopsetups \startsetups btx:cite:year \fastsetup{btx:cite:range} \stopsetups @@ -231,13 +241,13 @@ \else\ifconditional\btxinteractive \goto { \btxcitereference - \hyphenatedurl{\doif{\currentbtxcitevariant}{doi}{doi:}\currentbtxfirst} + \hyphenatedurl{\doif{\currentbtxcitealternative}{doi}{doi:}\currentbtxfirst} } [ - url(\doif{\currentbtxcitevariant}{doi}{http://dx.doi.org/}\currentbtxfirst) + url(\doif{\currentbtxcitealternative}{doi}{http://dx.doi.org/}\currentbtxfirst) ] \else \btxcitereference - \hyphenatedurl{\doif{\currentbtxcitevariant}{doi}{doi:}\currentbtxfirst} + \hyphenatedurl{\doif{\currentbtxcitealternative}{doi}{doi:}\currentbtxfirst} \fi\fi \stopsetups diff --git a/tex/context/base/publ-imp-default.mkvi b/tex/context/base/publ-imp-default.mkvi index e3e032d12..c6657ffa9 100644 --- a/tex/context/base/publ-imp-default.mkvi +++ b/tex/context/base/publ-imp-default.mkvi @@ -22,46 +22,30 @@ % \definebtx [\s!default:\s!list ] [\s!list] % \definebtx [\s!default:\s!author] [\s!author] -\definebtxrendering % no need to set \c!default ! ... also confusing +\definebtxrendering [\s!default] [\c!specification=\s!default] \definebtx [\s!default] - [\c!namesep={,\space}, - \c!lastnamesep={\space\btxlabeltext{default:and}\space}, - \c!finalnamesep={\space\btxlabeltext{default:and}\space}, - \c!firstnamesep=\space, + [\c!default=, % we do not want to fall|-|back on ourself. \c!otherstext={\space\btxlabeltext{default:others}}, - \c!juniorsep=\space, - \c!vonsep=\space, - \c!initialsep=\space, - \c!surnamesep={,\space}, - \c!surnameinitialsep={,\space}, - \c!surnamefirstnamesep={,\space}, - \c!pubsep={,\space}, - \c!lastpubsep={,\space\btxlabeltext{default:and}\space}, - \c!finalpubsep={\space\btxlabeltext{default:and}\space}] + %c!journalconversion=\v!normal, + \c!monthconversion=\v!number, + \c!separator:names:2={,\space}, + \c!separator:names:3={\space\btxlabeltext{default:and}\space}, + \c!separator:names:4={\space\btxlabeltext{default:and}\space}] \definebtx [\s!default:\s!list] [\s!default] - [%c!journalconversion=\v!normal, - \c!monthconversion=\v!number, - \c!authorconversion=normalshort] + [\c!authorconversion=normalshort] \definebtx [\s!default:\s!cite] [\s!default:\s!list] [\c!alternative=num, - \c!authorconversion=\v!name, - \c!sorttype=, - \c!compress=\v!no, - \c!inbetween=\space, - \c!range=\endash, - \c!left=, - \c!middle=, - \c!right=] + \c!authorconversion=\v!name] % We define [page] settings in the default namespace, inheriting the root % settings, in order to eventually allow for modifications without touching @@ -71,6 +55,10 @@ [\s!default:\s!page] [\s!page] +\definebtx + [\s!default:\s!page:list] + [\s!default:\s!page] + % List variants, some having specific settings: \definebtx @@ -130,10 +118,7 @@ [\s!default:\s!cite:authornum] [\s!default:\s!cite:author] [\c!left={(}, - \c!right={)}, - \c!pubsep={;\space}, - \c!lastpubsep={;\space}, - \c!finalpubsep={;\space}] + \c!right={)}] \definebtx [\s!default:\s!cite:authoryear] @@ -141,10 +126,7 @@ [\c!compress=\v!yes, \c!left={(}, \c!right={)}, - \c!inbetween={,\space}, - \c!pubsep={;\space}, - \c!lastpubsep={;\space}, - \c!finalpubsep={;\space}] + \c!inbetween={,\space}] \definebtx [\s!default:\s!cite:authorref] @@ -253,18 +235,28 @@ [\c!compress=\v!yes, \c!left={[}, \c!right={]}, - \c!pubsep={,}, - \c!lastpubsep={,}, - \c!finalpubsep={,}] + \c!separator:2={,}, % no space + \c!separator:3=\btxparameter{\c!separator:2}, + \c!separator:4=\btxparameter{\c!separator:2}] + +\definebtx + [\s!default:\s!cite:default] + [\s!default:\s!cite:num] \definebtx [\s!default:\s!cite:textnum] [\s!default:\s!cite:num] [\c!left=, % in apa: {Ref.\nbsp} or so \c!right=, - \c!pubsep={,}, - \c!lastpubsep={,\space\btxlabeltext{default:and}\space}, - \c!finalpubsep={\space\btxlabeltext{default:and}\space}] + \c!separator:2={,\space}, + \c!separator:3={,\space\btxlabeltext{default:and}\space}, + \c!separator:4= {\space\btxlabeltext{default:and}\space}] + +\definebtx + [\s!default:\s!cite:entry] + [\s!default:\s!cite] + [\c!left={(}, + \c!right={)}] % Multilingual text strings @@ -509,6 +501,9 @@ \startsetups \s!btx:\s!default:\s!cite:authornum \fastsetup{\s!btx:\s!cite:author} \stopsetups +\startsetups \s!btx:\s!default:\s!cite:authorref + \fastsetup{\s!btx:\s!cite:authorref} +\stopsetups \startsetups \s!btx:\s!default:\s!cite:author:num \fastsetup{\s!btx:\s!cite:range} @@ -548,8 +543,11 @@ \startsetups \s!btx:\s!default:\s!cite:num \fastsetup{\s!btx:\s!cite:range} \stopsetups +\startsetups \s!btx:\s!default:\s!cite:default + \fastsetup{\s!btx:\s!default:\s!cite:num} +\stopsetups \startsetups \s!btx:\s!default:\s!cite:textnum - \fastsetup{\s!btx:\s!cite:range} + \fastsetup{\s!btx:\s!default:\s!cite:num} \stopsetups \startsetups \s!btx:\s!default:\s!cite:title \fastsetup{\s!btx:\s!cite:normal} @@ -566,9 +564,12 @@ \startsetups \s!btx:\s!default:\s!cite:url \fastsetup{\s!btx:\s!cite:url} \stopsetups +\startsetups \s!btx:\s!default:\s!cite:nocite + \fastsetup{\s!btx:\s!cite:nocite} +\stopsetups -\startsetups \s!btx:\s!default:\s!cite:unknown - \fastsetup{\s!btx:\s!cite:unknown} +\startsetups \s!btx:\s!default:\s!cite:entry + \fastsetup{\s!btx:\s!cite:entry} \stopsetups \startsetups \s!btx:\s!default:\s!cite:none \fastsetup{\s!btx:\s!cite:none} diff --git a/tex/context/base/publ-imp-list.mkvi b/tex/context/base/publ-imp-list.mkvi index 815bb2038..77c009911 100644 --- a/tex/context/base/publ-imp-list.mkvi +++ b/tex/context/base/publ-imp-list.mkvi @@ -51,9 +51,16 @@ \stopsetups \startsetups \s!btx:\s!list:yes - \texdefinition {\s!btx:\s!list:inject} { - \currentbtxfirst - } + \btxstartstyleandcolor [\currentbtxspecification:list:yes] + \btxusecommand[\currentbtxspecification:list:yes] { + %\btxparameter\c!left + \texdefinition {\s!btx:\s!list:inject} { + \currentbtxfirst + \btxparameter\c!stopper + } + %\btxparameter\c!right + } + \btxstopstyleandcolor \stopsetups \startsetups \s!btx:\s!list:num \texdefinition {\s!btx:\s!list:inject} { diff --git a/tex/context/base/publ-ini.lua b/tex/context/base/publ-ini.lua index f20bf5102..789b772fe 100644 --- a/tex/context/base/publ-ini.lua +++ b/tex/context/base/publ-ini.lua @@ -93,85 +93,72 @@ manipulatormethods.WORD = converters.WORD manipulatormethods.Words = converters.Words manipulatormethods.WORDS = converters.WORDS -local context = context -local commands = commands - -local ctx_doifelse = commands.doifelse -local ctx_doif = commands.doif -local ctx_doifnot = commands.doifnot - -local ctx_firstoftwoarguments = context.firstoftwoarguments -local ctx_secondoftwoarguments = context.secondoftwoarguments -local ctx_firstofoneargument = context.firstofoneargument - -local ctx_gobbleoneargument = context.gobbleoneargument -local ctx_gobbletwoarguments = context.gobbletwoarguments - -local ctx_btxdirectlink = context.btxdirectlink -local ctx_btxhandlelistentry = context.btxhandlelistentry -local ctx_btxhandlelisttextentry = context.btxhandlelisttextentry -local ctx_btxchecklistentry = context.btxchecklistentry -local ctx_btxchecklistcombi = context.btxchecklistcombi ------ ctx_btxsetcitereference = context.btxsetcitereference ------ ctx_btxsetlistreference = context.btxsetlistreference - -local ctx_btxsetdataset = context.btxsetdataset -local ctx_btxsettag = context.btxsettag -local ctx_btxsetnumber = context.btxsetnumber -local ctx_btxsetlanguage = context.btxsetlanguage -local ctx_btxsetcombis = context.btxsetcombis -local ctx_btxsetcategory = context.btxsetcategory -local ctx_btxcitesetup = context.btxcitesetup -local ctx_btxpagesetup = context.btxpagesetup -local ctx_btxsetfirst = context.btxsetfirst -local ctx_btxsetsecond = context.btxsetsecond -local ctx_btxsetthird = context.btxsetthird -local ctx_btxsetinternal = context.btxsetinternal -local ctx_btxsetlefttext = context.btxsetlefttext -local ctx_btxsetrighttext = context.btxsetrighttext -local ctx_btxsetbefore = context.btxsetbefore -local ctx_btxsetafter = context.btxsetafter -local ctx_btxsetbacklink = context.btxsetbacklink -local ctx_btxsetbacktrace = context.btxsetbacktrace -local ctx_btxsetcount = context.btxsetcount -local ctx_btxsetconcat = context.btxsetconcat -local ctx_btxsetoveflow = context.btxsetoverflow -local ctx_btxsetfirstpage = context.btxsetfirstpage -local ctx_btxsetlastpage = context.btxsetlastpage -local ctx_btxsetfirstinternal = context.btxsetfirstinternal -local ctx_btxsetlastinternal = context.btxsetlastinternal -local ctx_btxstartcite = context.btxstartcite -local ctx_btxstopcite = context.btxstopcite -local ctx_btxstartciteauthor = context.btxstartciteauthor -local ctx_btxstopciteauthor = context.btxstopciteauthor -local ctx_btxstartsubcite = context.btxstartsubcite -local ctx_btxstopsubcite = context.btxstopsubcite -local ctx_btxstartlistentry = context.btxstartlistentry -local ctx_btxstoplistentry = context.btxstoplistentry -local ctx_btxlistsetup = context.btxlistsetup -local ctx_btxflushauthor = context.btxflushauthor -local ctx_btxsetnoflistentries = context.btxsetnoflistentries -local ctx_btxsetcurrentlistentry = context.btxsetcurrentlistentry -local ctx_btxsetcurrentlistindex = context.btxsetcurrentlistindex - -local ctx_setmacro = tokens.setters and tokens.setters.macro - -languages.data = languages.data or { } -local data = languages.data - --- local registeredcitevariants = publications.registeredcitevariants or { } --- local registeredlistvariants = publications.registeredlistvariants or { } --- --- storage.register("publications/registeredcitevariants", registeredcitevariants,"publications.registeredcitevariants") --- storage.register("publications/registeredlistvariants", registeredlistvariants,"publications.registeredlistvariants") --- --- function commands.registerbtxcitevariant(name,parent) --- registeredcitevariants[name] = parent or "" --- end --- --- function commands.registerbtxlistvariant(name,parent) --- registeredlistvariants[name] = parent or "" --- end +local context = context +local commands = commands + +local ctx_doifelse = commands.doifelse +local ctx_doif = commands.doif +local ctx_doifnot = commands.doifnot + +local ctx_firstoftwoarguments = context.firstoftwoarguments +local ctx_secondoftwoarguments = context.secondoftwoarguments +local ctx_firstofoneargument = context.firstofoneargument + +local ctx_gobbleoneargument = context.gobbleoneargument +local ctx_gobbletwoarguments = context.gobbletwoarguments + +local ctx_btxdirectlink = context.btxdirectlink +local ctx_btxhandlelistentry = context.btxhandlelistentry +local ctx_btxhandlelisttextentry = context.btxhandlelisttextentry +local ctx_btxchecklistentry = context.btxchecklistentry +local ctx_btxchecklistcombi = context.btxchecklistcombi +----- ctx_btxsetcitereference = context.btxsetcitereference +----- ctx_btxsetlistreference = context.btxsetlistreference + +local ctx_btxsetdataset = context.btxsetdataset +local ctx_btxsettag = context.btxsettag +local ctx_btxsetnumber = context.btxsetnumber +local ctx_btxsetlanguage = context.btxsetlanguage +local ctx_btxsetcombis = context.btxsetcombis +local ctx_btxsetcategory = context.btxsetcategory +local ctx_btxcitesetup = context.btxcitesetup +local ctx_btxpagesetup = context.btxpagesetup +local ctx_btxsetfirst = context.btxsetfirst +local ctx_btxsetsecond = context.btxsetsecond +local ctx_btxsetthird = context.btxsetthird +local ctx_btxsetinternal = context.btxsetinternal +local ctx_btxsetlefttext = context.btxsetlefttext +local ctx_btxsetrighttext = context.btxsetrighttext +local ctx_btxsetbefore = context.btxsetbefore +local ctx_btxsetafter = context.btxsetafter +local ctx_btxsetbacklink = context.btxsetbacklink +local ctx_btxsetbacktrace = context.btxsetbacktrace +local ctx_btxsetcount = context.btxsetcount +local ctx_btxsetconcat = context.btxsetconcat +local ctx_btxsetoveflow = context.btxsetoverflow +local ctx_btxsetfirstpage = context.btxsetfirstpage +local ctx_btxsetlastpage = context.btxsetlastpage +local ctx_btxsetfirstinternal = context.btxsetfirstinternal +local ctx_btxsetlastinternal = context.btxsetlastinternal +local ctx_btxstartcite = context.btxstartcite +local ctx_btxstopcite = context.btxstopcite +local ctx_btxstartciteauthor = context.btxstartciteauthor +local ctx_btxstopciteauthor = context.btxstopciteauthor +local ctx_btxstartsubcite = context.btxstartsubcite +local ctx_btxstopsubcite = context.btxstopsubcite +local ctx_btxstartlistentry = context.btxstartlistentry +local ctx_btxstoplistentry = context.btxstoplistentry +local ctx_btxlistsetup = context.btxlistsetup +local ctx_btxflushauthor = context.btxflushauthor +local ctx_btxsetnoflistentries = context.btxsetnoflistentries +local ctx_btxsetcurrentlistentry = context.btxsetcurrentlistentry +local ctx_btxsetcurrentlistindex = context.btxsetcurrentlistindex + +local implement = interfaces.implement +local ctx_setmacro = interfaces.setmacro + +languages.data = languages.data or { } +local data = languages.data local specifications = publications.specifications local currentspecification = specifications[false] @@ -1269,12 +1256,7 @@ do publications.found = found publications.get = get - function commands.btxfieldname(name,tag,field) context(get(name,tag,field,false,false)) end - function commands.btxfieldtype(name,tag,field) context(get(name,tag,field,true, false)) end - function commands.btxfoundname(name,tag,field) context(get(name,tag,field,false,true )) end - function commands.btxfoundtype(name,tag,field) context(get(name,tag,field,true, true )) end - - function commands.btxflush(name,tag,field) + local function btxflush(name,tag,field) local dataset = rawget(datasets,name) if dataset then local fields = dataset.luadata[tag] @@ -1300,7 +1282,7 @@ do end end - function commands.btxfield(name,tag,field) + local function btxfield(name,tag,field) local dataset = rawget(datasets,name) if dataset then local fields = dataset.luadata[tag] @@ -1325,7 +1307,7 @@ do end end - function commands.btxdetail(name,tag,field) + local function btxdetail(name,tag,field) local dataset = rawget(datasets,name) if dataset then local fields = dataset.luadata[tag] @@ -1355,6 +1337,26 @@ do end end + local function btxdirect(name,tag,field) + local dataset = rawget(datasets,name) + if dataset then + local fields = dataset.luadata[tag] + if fields then + local manipulator, field = splitmanipulation(field) + local value = fields[field] + if value then + context(typesetters.default(field,value,manipulator)) + elseif trace_detail then + report("field %a of tag %a in dataset %a has no value",field,tag,name) + end + else + report("unknown tag %a in dataset %a",tag,name) + end + else + report("unknown dataset %a",name) + end + end + local function okay(name,tag,field) local dataset = rawget(datasets,name) if dataset then @@ -1372,9 +1374,41 @@ do publications.okay = okay - function commands.btxdoifelse(name,tag,field) ctx_doifelse(okay(name,tag,field)) end - function commands.btxdoif (name,tag,field) ctx_doif (okay(name,tag,field)) end - function commands.btxdoifnot (name,tag,field) ctx_doifnot (okay(name,tag,field)) end + if implement then + + implement { name = "btxfield", actions = btxfield, arguments = { "string", "string", "string" } } + implement { name = "btxdetail", actions = btxdetail, arguments = { "string", "string", "string" } } + implement { name = "btxflush", actions = btxflush, arguments = { "string", "string", "string" } } + implement { name = "btxdirect", actions = btxdirect, arguments = { "string", "string", "string" } } + + implement { name = "btxfieldname", actions = { get, context }, arguments = { "string", "string", "string", false, false } } + implement { name = "btxfieldtype", actions = { get, context }, arguments = { "string", "string", "string", true, false } } + implement { name = "btxfoundname", actions = { get, context }, arguments = { "string", "string", "string", false, true } } + implement { name = "btxfoundtype", actions = { get, context }, arguments = { "string", "string", "string", true, true } } + + implement { name = "btxdoifelse", actions = { okay, ctx_btxdoifelse }, arguments = { "string", "string", "string" } } + implement { name = "btxdoif", actions = { okay, ctx_btxdoif }, arguments = { "string", "string", "string" } } + implement { name = "btxdoifnot", actions = { okay, ctx_btxdoifnot }, arguments = { "string", "string", "string" } } + + + else + + commands.btxflush = btxflush + commands.btxfield = btxfield + commands.btxdetail = btxdetail + commands.btxdirect = btxdirect + + function commands.btxfieldname(name,tag,field) context(get(name,tag,field,false,false)) end + function commands.btxfieldtype(name,tag,field) context(get(name,tag,field,true, false)) end + function commands.btxfoundname(name,tag,field) context(get(name,tag,field,false,true )) end + function commands.btxfoundtype(name,tag,field) context(get(name,tag,field,true, true )) end + + function commands.btxdoifelse (name,tag,field) ctx_doifelse(okay(name,tag,field)) end + function commands.btxdoif (name,tag,field) ctx_doif (okay(name,tag,field)) end + function commands.btxdoifnot (name,tag,field) ctx_doifnot (okay(name,tag,field)) end + + end + end @@ -1468,39 +1502,6 @@ do -- helper - -- local function sortedtags(dataset,list,sorttype) - -- local luadata = datasets[dataset].luadata - -- local valid = { } - -- for i=1,#list do - -- local tag = list[i] - -- local entry = luadata[tag] - -- if entry then - -- local key = entry[sorttype] - -- if key then - -- valid[#valid+1] = { - -- tag = tag, - -- split = sortsplitter(sortstripper(key)) - -- } - -- end - -- end - -- end - -- if #valid == 0 or #valid ~= #list then - -- return list - -- else - -- sorters.sort(valid,basicsorter) - -- for i=1,#valid do - -- valid[i] = valid[i].tag - -- end - -- return valid - -- end - -- end - -- - -- if sorttype and sorttype ~= "" then - -- tags = sortedtags(dataset,tags,sorttype) - -- end - - -- why shorts vs tags: only for sorting - function lists.register(dataset,tag,short) -- needs checking now that we split local r = renderings[dataset] if not short or short == "" then @@ -1560,6 +1561,8 @@ do end end + -- todo: names = { "btx" } + methods[v_force] = function (dataset,rendering,keyword) -- only for checking, can have duplicates, todo: collapse page numbers, although -- we then also needs deferred writes @@ -1601,7 +1604,9 @@ do local pages = { } local current = datasets[dataset] local luadata = current.luadata -rendering.result = result + -- handy for tracing : + rendering.result = result + -- for listindex=1,#result do local r = result[listindex] local u = r.userdata @@ -2094,13 +2099,6 @@ do end end - -- function commands.btxcitevariant(dataset,block,tags,variant) -- uses? specification ? - -- local action = citevariants[variant] - -- if action then - -- action(dataset,tags,variant) - -- end - -- end - -- sorter local keysorter = function(a,b) @@ -2119,41 +2117,6 @@ do end end - -- local suffix = 0 - -- local function setsuffix(entry,suffix,sortfld) - -- entry.suffix = suffix - -- local dataset = datasets[entry.dataset] - -- if dataset then - -- local suffixes = dataset.suffixes[entry.tag] - -- if suffixes then - -- suffixes[sortfld] = suffix - -- else - -- dataset.suffixes[entry.tag] = { [sortfld] = suffix } - -- end - -- end - -- end - -- for i=1,#source do - -- local entry = source[i] - -- local sortfld = entry.sortfld - -- if sortfld then - -- local value = entry.sortkey - -- if value == oldvalue then - -- if suffix == 0 then - -- suffix = 1 - -- local entry = source[i-1] - -- setsuffix(entry,suffix,sortfld) - -- end - -- suffix = suffix + 1 - -- setsuffix(entry,suffix,sortfld) - -- else - -- oldvalue = value - -- suffix = 0 - -- end - -- else - -- break - -- end - -- end - local function compresslist(source) for i=1,#source do local t = type(source[i].sortkey) @@ -2321,10 +2284,10 @@ do ctx_btxsetrighttext(righttext[i] or "") end if before then - ctx_btxsetbefore(before[i] or #before == 1 and before[1] or "") + ctx_btxsetbefore(before[i] or (#before == 1 and before[1]) or "") end if after then - ctx_btxsetafter(after[i] or #after == 1 and after[1] or "") + ctx_btxsetafter(after[i] or (#after == 1 and after[1]) or "") end -- ctx_btxsetbacklink(currentcitation) diff --git a/tex/context/base/publ-ini.mkiv b/tex/context/base/publ-ini.mkiv index e0e0489ab..f376d3e7e 100644 --- a/tex/context/base/publ-ini.mkiv +++ b/tex/context/base/publ-ini.mkiv @@ -11,6 +11,10 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. + +% TODO: s! vs v! for default and neutral key/values +% todo: too many refs in list + % todo: tagging % todo: we cannot use 'default' as this wipes metadata names (maybe no longer do that) % todo: \v!cite => \s!cite @@ -182,10 +186,7 @@ \installcommandhandler \??btxregister {btxregister} \??btxregister \installcommandhandler \??btxrendering {btxrendering} \??btxrendering -% named: check all listvariant and citevariant - -\let\currentbtxcitevariant\empty -\let\currentbtxlistvariant\empty +\let\currentbtxcitealternative\empty \let\currentbtxspecificationfallback\empty @@ -257,11 +258,12 @@ % [default] % [mybibs.bib] +\let\startpublication\relax +\let\stoppublication \relax + \unexpanded\def\startpublication {\dodoubleempty\publ_set_publication} -\let\stoppublication\relax - \def\publ_set_publication[#1][#2]% {\begingroup \catcode\commentasciicode\othercatcode @@ -343,17 +345,39 @@ % \btxfield : current % \btxspecificfield : dataset,tag,key -\def\btxfield #1{\ctxcommand{btxfield("\currentbtxdataset","\currentbtxtag","#1")}} -\def\btxdetail #1{\ctxcommand{btxdetail("\currentbtxdataset","\currentbtxtag","#1")}} -\def\btxflush #1{\ctxcommand{btxflush("\currentbtxdataset","\currentbtxtag","#1")}} -\def\btxfieldname #1{\ctxcommand{btxfieldname("\currentbtxdataset","\currentbtxtag","#1")}} -\def\btxfieldtype #1{\ctxcommand{btxfieldtype("\currentbtxdataset","\currentbtxtag","#1")}} -\def\btxfoundname #1{\ctxcommand{btxfoundname("\currentbtxdataset","\currentbtxtag","#1")}} -\def\btxfoundtype #1{\ctxcommand{btxfoundtype("\currentbtxdataset","\currentbtxtag","#1")}} +\ifdefined\clf_btxfield % {#1} will go + + \def\btxfield #1{\clf_btxfield {\currentbtxdataset}{\currentbtxtag}{#1}} + \def\btxdetail #1{\clf_btxdetail {\currentbtxdataset}{\currentbtxtag}{#1}} + \def\btxflush #1{\clf_btxflush {\currentbtxdataset}{\currentbtxtag}{#1}} + \def\btxdirect #1{\clf_btxdirect {\currentbtxdataset}{\currentbtxtag}{#1}} + \def\btxfieldname #1{\clf_btxfieldname {\currentbtxdataset}{\currentbtxtag}{#1}} + \def\btxfieldtype #1{\clf_btxfieldtype {\currentbtxdataset}{\currentbtxtag}{#1}} + \def\btxfoundname #1{\clf_btxfoundname {\currentbtxdataset}{\currentbtxtag}{#1}} + \def\btxfoundtype #1{\clf_btxfoundtype {\currentbtxdataset}{\currentbtxtag}{#1}} + % \def\btxauthorfield#1{\clf_btxauthorfield\currentbtxauthorindex{#1}} + \def\btxdoifelse #1{\clf_btxdoifelse {\currentbtxdataset}{\currentbtxtag}{#1}} + \def\btxdoif #1{\clf_btxdoif {\currentbtxdataset}{\currentbtxtag}{#1}} + \def\btxdoifnot #1{\clf_btxdoifnot {\currentbtxdataset}{\currentbtxtag}{#1}} + +\else + + \def\btxfield #1{\ctxcommand{btxfield("\currentbtxdataset","\currentbtxtag","#1")}} + \def\btxdetail #1{\ctxcommand{btxdetail("\currentbtxdataset","\currentbtxtag","#1")}} + \def\btxflush #1{\ctxcommand{btxflush("\currentbtxdataset","\currentbtxtag","#1")}} + \def\btxdirect #1{\ctxcommand{btxdirect("\currentbtxdataset","\currentbtxtag","#1")}} + \def\btxfieldname #1{\ctxcommand{btxfieldname("\currentbtxdataset","\currentbtxtag","#1")}} + \def\btxfieldtype #1{\ctxcommand{btxfieldtype("\currentbtxdataset","\currentbtxtag","#1")}} + \def\btxfoundname #1{\ctxcommand{btxfoundname("\currentbtxdataset","\currentbtxtag","#1")}} + \def\btxfoundtype #1{\ctxcommand{btxfoundtype("\currentbtxdataset","\currentbtxtag","#1")}} + % \def\btxauthorfield#1{\ctxcommand{btxauthorfield(\number\currentbtxauthorindex,"#1")}} + \def\btxdoifelse #1{\ctxcommand{btxdoifelse("\currentbtxdataset","\currentbtxtag","#1")}} + \def\btxdoif #1{\ctxcommand{btxdoif("\currentbtxdataset","\currentbtxtag","#1")}} + \def\btxdoifnot #1{\ctxcommand{btxdoifnot("\currentbtxdataset","\currentbtxtag","#1")}} + +\fi + \def\btxauthorfield#1{\ctxcommand{btxauthorfield(\number\currentbtxauthorindex,"#1")}} -\def\btxdoifelse #1{\ctxcommand{btxdoifelse("\currentbtxdataset","\currentbtxtag","#1")}} -\def\btxdoif #1{\ctxcommand{btxdoif("\currentbtxdataset","\currentbtxtag","#1")}} -\def\btxdoifnot #1{\ctxcommand{btxdoifnot("\currentbtxdataset","\currentbtxtag","#1")}} \let\btxsetup\fastsetup @@ -500,9 +524,6 @@ \newtoks \everysetupbtxlistplacement % name will change \newtoks \everysetupbtxciteplacement % name will change -% \def\publ_list_processor % bibref -> btx (old method, keep as reference) -% {\ctxcommand{btxaddtolist("\currentbtxrendering",\currentlistindex,"btxref")}} - \definelist % only used for selecting [\s!btx] @@ -604,9 +625,10 @@ \fi \begingroup \usebtxstyleandcolor\c!style\c!color + \ignorespaces \fastbtxsetup\s!list\currentbtxcategory - \endgroup \removeunwantedspaces + \endgroup \ifconditional\c_btx_list_pages \btx_entry_inject_pages \fi @@ -821,7 +843,7 @@ \unexpanded\def\btx_reference_indeed {\begingroup - \let\currentbtxlistvariant\currentbtxnumbering + %let\currentbtxlistvariant\currentbtxnumbering \setbtxparameterset\c!list\currentbtxnumbering \ifx\currentbtxnumbering\empty % nothing @@ -869,19 +891,25 @@ {\ifx\currentbtxdataset\v!default\else\s!btxset="\currentbtxdataset",\fi% \s!btxref="\currentbtxtag",% \s!btxspc="\currentbtxspecification",% - \ifx\currentbtxbefore\empty\else\s!btxbtx={\currentbtxbefore},\fi% - \ifx\currentbtxafter \empty\else\s!btxatx={\currentbtxafter },\fi% + \ifx\currentbtxbefore\empty\else\s!btxbtx=\!!bs\currentbtxbefore\!!es,\fi% + \ifx\currentbtxafter \empty\else\s!btxatx=\!!bs\currentbtxafter \!!es,\fi% \ifx\currentbtxbacklink\currentbtxbacktrace\s!btxint="\currentbtxbacklink"\else\s!btxbck="\currentbtxbacktrace"\fi}% {\s!btx::\v!list::\number\c_btx_list_reference}% {\currentbtxnumber}} +\newconditional\c_btx_cite_reference_injected + \unexpanded\def\btx_cite_reference_inject - {\dontleavehmode - \iftrialtypesetting \else - \ifx\currentbtxbacklink\empty - % can be made empty when combining author / year - \else - \btx_cite_reference_inject_indeed + {\ifconditional\c_btx_cite_reference_injected + \else + \dontleavehmode + \iftrialtypesetting \else + \ifx\currentbtxbacklink\empty + % can be made empty when combining author / year + \else + \btx_cite_reference_inject_indeed + \settrue\c_btx_cite_reference_injected + \fi \fi \fi} @@ -894,8 +922,8 @@ [\s!btx]% [\ifx\currentbtxdataset\v!default\else\s!btxset=\currentbtxdataset,\fi% \s!btxref=\currentbtxtag,% - \ifx\currentbtxbefore\empty\else\s!btxbtx={\currentbtxbefore},\fi% - \ifx\currentbtxafter \empty\else\s!btxatx={\currentbtxafter },\fi% + \ifx\currentbtxbefore\empty\else\s!btxbtx=\!!bs\currentbtxbefore\!!es,\fi% + \ifx\currentbtxafter \empty\else\s!btxatx=\!!bs\currentbtxafter \!!es,\fi% \s!btxint=\number\currentbtxbacklink \ifx\currentbtxciteuservariables\empty\else,\currentbtxciteuservariables\fi]}} @@ -936,12 +964,13 @@ {\begingroup \edef\currentbtxfield{#2}% \setbtxparameterset\s!list\currentbtxfield - \let\currentbtxlistvariant\currentbtxfield + %let\currentbtxlistvariant\currentbtxfield \ctxcommand{btxauthor("\currentbtxdataset","\currentbtxtag","\currentbtxfield",{ combiner = "#1", kind = "list", etallimit = "\btxparameter\c!etallimit", etaldisplay = "\btxparameter\c!etaldisplay", + symbol = "\btxparameter{\c!stopper:initials}", })}% \endgroup} @@ -961,6 +990,7 @@ kind = "cite", etallimit = "\btxparameter\c!etallimit", etaldisplay = "\btxparameter\c!etaldisplay", + symbol = "\btxparameter{\c!stopper:initials}", })}% \endgroup} @@ -1086,8 +1116,8 @@ \unexpanded\def\publ_cite_tags_indeed#1% {\letinteractionparameter\c!style\empty \setbtxparametersetroot\s!cite % we need to get the default - \edef\currentbtxcitevariant{\btxparameter\c!alternative}% - \setbtxparameterset\s!cite\currentbtxcitevariant + \edef\currentbtxcitealternative{\btxparameter\c!alternative}% + \setbtxparameterset\s!cite\currentbtxcitealternative \edef\currentbtxcitetag{#1}% \the\everysetupbtxciteplacement \publ_cite_variant @@ -1116,11 +1146,11 @@ \edef\p_alternative{\dummyparameter\c!alternative}% \ifx\p_alternative\empty \setbtxparametersetroot\s!cite - \edef\currentbtxcitevariant{\btxparameter\c!alternative}% + \edef\currentbtxcitealternative{\btxparameter\c!alternative}% \else - \let\currentbtxcitevariant\p_alternative + \let\currentbtxcitealternative\p_alternative \fi - \setbtxparameterset\s!cite\currentbtxcitevariant + \setbtxparameterset\s!cite\currentbtxcitealternative \setupcurrentbtx[#1]% % \edef\p_publ_cite_before {\dummyparameter\c!before}% @@ -1134,9 +1164,9 @@ \def\publ_cite_tags_variants_indeed#1[#2]% {\letinteractionparameter\c!style\empty - \edef\currentbtxcitevariant{#1}% + \edef\currentbtxcitealternative{#1}% \edef\currentbtxcitetag{#2}% - \setbtxparameterset\s!cite\currentbtxcitevariant + \setbtxparameterset\s!cite\currentbtxcitealternative \the\everysetupbtxciteplacement \publ_cite_variant \endgroup} @@ -1151,22 +1181,18 @@ \unexpanded\def\publ_cite_handle_variant#1% {\begingroup - \edef\currentbtxcitevariant{#1}% - \setbtxparameterset\s!cite\currentbtxcitevariant + \edef\currentbtxcitealternative{#1}% + \setbtxparameterset\s!cite\currentbtxcitealternative \the\everysetupbtxciteplacement \dosingleargument\publ_cite_handle_variant_indeed} -\def\publ_cite_handle_variant_indeed[#1]% - {\letbtxparameter\c!alternative\currentbtxcitevariant - \usebtxstyleandcolor\c!style\c!color - \uselanguageparameter\btxdatasetparameter % new - \btxparameter\v!left - \edef\currentbtxreference{#1}% +\unexpanded\def\publ_cite_handle_variant_blob + {\btxparameter\v!left \ctxcommand{btxhandlecite{% dataset = "\currentbtxdataset",% reference = \!!bs\currentbtxreference\!!es,% markentry = \iftrialtypesetting false\else true\fi,% - variant = "\currentbtxcitevariant",% + variant = "\currentbtxcitealternative",% sorttype = "\btxparameter\c!sorttype",% compress = "\btxparameter\c!compress",% author = "\btxparameter\c!author",% @@ -1175,8 +1201,15 @@ before = \!!bs\p_publ_cite_before\!!es,% after = \!!bs\p_publ_cite_after\!!es,% }}% - \btxparameter\v!right - \ctxcommand{flushmarked()}% + \ctxcommand{flushmarked()}% maybe: \iftrialtypesetting\else ... \fi + \btxparameter\v!right} + +\def\publ_cite_handle_variant_indeed[#1]% + {\letbtxparameter\c!alternative\currentbtxcitealternative + \edef\currentbtxreference{#1}% + \usebtxstyleandcolor\c!style\c!color + \uselanguageparameter\btxdatasetparameter % new + \btxparameter\c!command{\publ_cite_handle_variant_blob}% \endgroup} \unexpanded\def\btxcitation @@ -1327,6 +1360,10 @@ \newtoks\everybtxciteentry +\prependtoks + \setfalse\c_btx_cite_reference_injected +\to \everybtxciteentry + \unexpanded\def\btxcitesetup#1% {\the\everybtxciteentry \everybtxciteentry\emptytoks % tricky maybe not when subcites @@ -1341,8 +1378,8 @@ \unexpanded\def\btxstartsubcite#1% {\begingroup \btxcitereset % todo: limited set - \def\currentbtxcitevariant{#1}% - \setbtxparameterset\s!cite\currentbtxcitevariant + \def\currentbtxcitealternative{#1}% + \setbtxparameterset\s!cite\currentbtxcitealternative \usebtxstyleandcolor\c!style\c!color \btxparameter\c!left \relax} @@ -1354,8 +1391,8 @@ \unexpanded\def\btxstartciterendering[#1]% {\begingroup - \edef\currentbtxcitevariant{#1}% - \setbtxparameterset\s!cite\currentbtxcitevariant + \edef\currentbtxcitealternative{#1}% + \setbtxparameterset\s!cite\currentbtxcitealternative \usebtxstyleandcolor\c!style\c!color \btxparameter\c!left \relax} @@ -1408,9 +1445,34 @@ {\dotripleargument\publ_save_dataset} \unexpanded\def\publ_save_dataset[#1][#2][#3]% + {\ifthirdargument + \publ_save_dataset_indeed[#1][#2][#3]% + \else\ifsecondargument + \doifassignmentelse{#2}% + {\publ_save_dataset_indeed[\s!default][#1][#2]}% + {\publ_save_dataset_indeed[#1][#2][]}% + \else\iffirstargument + \doifassignmentelse{#1}% + {\publ_save_dataset_indeed[\s!default][\jobname-saved.bib][#1]}% + {\publ_save_dataset_indeed[\s!default][#1][]}% + % \else + % % bad news + \fi\fi\fi} + +\unexpanded\def\publ_save_dataset_indeed[#1][#2][#3]% {\begingroup - \getdummyparameters[\c!criterium=\v!all,\c!alternative=,#3]% % all or used - \ctxcommand{btxsavedataset("#1","#2","\dummyparameter\c!alternative","\dummyparameter\c!criterium")}% + \getdummyparameters + [\c!criterium=\v!all,% + \c!type=,% + \c!dataset=#1,% + \c!file=#2,% + #3]% % all or used + \ctxcommand{btxsavedataset{ + dataset = "\dummyparameter\c!dataset", + filename = "\dummyparameter\c!file", + filetype = "\dummyparameter\c!type", + criterium = "\dummyparameter\c!criterium" + }}% \endgroup} % \savebtxdataset[default][e:/tmp/foo.bib] @@ -1419,28 +1481,17 @@ %D In-text entries: -% \definebtxcitevariant -% [entry] - \unexpanded\def\placecitation{\citation[entry]} % [#1] \unexpanded\def\btxhandleciteentry {\dontleavehmode \begingroup - \def\currentbtxcitevariant{entry}% - \setbtxparameterset\s!cite\currentbtxcitevariant % needs checking + \def\currentbtxcitealternative{entry}% + \setbtxparameterset\s!cite\currentbtxcitealternative % needs checking \btxcitereference \btx_entry_inject \endgroup} -\startsetups \s!btx:\s!cite:entry - \ifx\currentbtxfirst\empty - \fastbtxsetup\s!cite\s!unknown - \else - \btxhandleciteentry - \fi -\stopsetups - %D Registers % \setupbtxregister @@ -1484,19 +1535,19 @@ \unexpanded\def\btxindexedauthor#1#2#3#4#5#6% alternative von last first junior {\begingroup - \def\currentbtxcitevariant{#1}% - \ifx\currentbtxcitevariant\empty - \edef\currentbtxcitevariant{invertedshort}% + \def\currentbtxcitealternative{#1}% + \ifx\currentbtxcitealternative\empty + \edef\currentbtxcitealternative{invertedshort}% maybe we need some default here too? \fi - \let\currentbtxlistvariant\currentbtxcitevariant % we inherit + %let\currentbtxlistvariant\currentbtxcitealternative % we inherit \the\everysetupbtxciteplacement \def\currentbtxvons {#2}% \def\currentbtxsurnames {#3}% \def\currentbtxinitials {#4}% \def\currentbtxfirstnames {#5}% \def\currentbtxjuniors {#6}% - \setbtxparameterset\s!cite\currentbtxcitevariant - \fastsetup{\s!btx:\s!cite:\s!author:\currentbtxcitevariant}% + \setbtxparameterset\s!cite\currentbtxcitealternative + \fastsetup{\s!btx:\s!cite:\s!author:\currentbtxcitealternative}% \endgroup} %D We hook some setters in the definition sets: @@ -1562,15 +1613,33 @@ \c!separator={;\space}, \c!distance=1.5\emwidth] -% Quite some interpunction and labels are the same of at least consistent witin +% Quite some interpunction and labels are the same of at least consistent within % a standard when citations and list entries are involved. We assume that each -% standard defines its own set but it can fall back on the defaults. +% standard defines its own set but it can fall back on these defaults. \setupbtx - [\c!alternative=\v!num, % default cite - \c!interaction=\v!start, + [\c!interaction=\v!start, + \c!alternative=num, % default cite form + \c!inbetween=\space, + \c!range=\endash, % separator:range? + \c!compress=\v!no, \c!etallimit=3, - \c!etaldisplay=\btxparameter\c!etallimit] + \c!etaldisplay=\btxparameter\c!etallimit, + \c!otherstext={\space et al.}, + \c!separator:firstnames={\space}, + \c!separator:juniors={\space}, + \c!separator:vons={\space}, + \c!separator:initials={\space}, + \c!stopper:initials={.}, + %\c!surnamesep={,\space}, % is this used anywhere? + \c!separator:invertedinitials={,\space}, + \c!separator:invertedfirstnames={,\space}, + \c!separator:names:2={,\space}, % separates multiple names + \c!separator:names:3=\btxparameter{\c!separator:2}, % before last name in a list + \c!separator:names:4=\btxparameter{\c!separator:2}, % between only two names + \c!separator:2={;\space}, % aka pubsep - separates multiple objects + \c!separator:3=\btxparameter{separator:2}, % before last object in a list + \c!separator:4=\btxparameter{separator:2}] % between only two objects % Do we want these in the format? Loading them delayed is somewhat messy. @@ -1592,7 +1661,7 @@ \setupbtx [\c!specification=\s!default, \c!dataset=\v!default, - \c!default=] + \c!default=\v!default] \loadbtxdefinitionfile [\s!default] diff --git a/tex/context/base/publ-reg.lua b/tex/context/base/publ-reg.lua index 531c4dcf0..0a0815eeb 100644 --- a/tex/context/base/publ-reg.lua +++ b/tex/context/base/publ-reg.lua @@ -47,29 +47,32 @@ function commands.setbtxregister(specification) s = { } registrations[register] = s end - local d = s[dataset] - if not d then - d = { } - s[dataset] = d - end - -- - -- check all - -- local processors = name ~= register and name or "" if processor == "" then processor = nil elseif processor then processor = "btx:r:" .. processor end - -- - d.active = specification.state ~= v_stop - d.once = specification.method == v_once or false - d.field = field - d.processor = processor - d.alternative = d.alternative or specification.alternative - d.register = register - d.dataset = dataset - d.done = d.done or { } + local datasets = utilities.parsers.settings_to_array(dataset) + for i=1,#datasets do + local dataset = datasets[i] + local d = s[dataset] + if not d then + d = { } + s[dataset] = d + end + -- + -- check all + -- + d.active = specification.state ~= v_stop + d.once = specification.method == v_once or false + d.field = field + d.processor = processor + d.alternative = d.alternative or specification.alternative + d.register = register + d.dataset = dataset + d.done = d.done or { } + end -- sequence = { } for register, s in sortedhash(registrations) do diff --git a/tex/context/base/s-inf-03.mkiv b/tex/context/base/s-inf-03.mkiv index 48449d690..7699c46d4 100644 --- a/tex/context/base/s-inf-03.mkiv +++ b/tex/context/base/s-inf-03.mkiv @@ -159,16 +159,16 @@ local skipglobal = table.tohash { "_G", "_M", "_ENV", "", "context", "modules", "global", "arg", "utf", 1, "_ptbs_", "_pcol_", "_plib_", "_clib_", "_tlib_", - "kpse", + "kpse", "commands", } local skipkeys = table.tohash { "_pcol_", "_plib_", "_clib_", "_tlib_", "_bpnf_", "_ptbs_", - "_cldf_", "_cldn_", + "_cldf_", "_cldn_", "_cldo_", "_clmb_", "_clme_", "_clmm_", "_clmn_", "_clma_", "_clmh_", "_G", "_M", "_ENV", "", + -- "global", "shortcuts", "_VERSION", "_COPYRIGHT", "_DESCRIPTION", "_NAME", "_PACKAGE", "__unload", - } local sameglobal = { @@ -196,6 +196,8 @@ local variant = 1 -- all parents local variant = 2 -- parent name too local variant = 3 -- no parents +local done = { } + local function childtables(key,tab,handler,depth) depth = depth or 1 local keys = sortedkeys(tab) -- no sorted_pairs @@ -214,6 +216,10 @@ local function childtables(key,tab,handler,depth) t = "data" handler(s,t,depth) else +if done[v] then + -- logs.report("inf-03","key %a in %a already done",k,v) +else + done[v] = true handler(s,t,depth) if variant == 3 then childtables(false,v,handler,depth+1) @@ -223,6 +229,7 @@ local function childtables(key,tab,handler,depth) childtables(s,v,handler,depth+1) end end +end else handler(s,t,depth) end @@ -245,6 +252,7 @@ end local function show(title,subtitle,alias,builtin,t,lib,libcolor,glo,glocolor,mark,obsolete) -- todo: table as argument +-- print(title,subtitle,alias,builtin,t,lib,libcolor,glo,glocolor,mark,obsolete) local keys = sortedkeys(t) -- no sorted_pairs if #keys > 0 then local fulltitle = title @@ -341,6 +349,8 @@ end show("global","",sameglobal.global,false,_G,builtin,"darkgreen",globals,"darkblue",false,obsolete) +-- inspect(table.sortedkeys(context)) + for k, v in table.sortedpairs(_G) do if not skipglobal[k] and not obsolete[k] and type(v) == "table" and not marked(v) then @@ -351,7 +361,8 @@ for k, v in table.sortedpairs(_G) do elseif extralua[k] then show(k,"extra lua",sameglobal[k],extralua[k],v,builtin[k],"darkred", false,false,true) elseif basictex[k] then show(k,"basic tex",sameglobal[k],basictex[k],v,builtin[k],"darkred", false,false,true) elseif extratex[k] then show(k,"extra tex",sameglobal[k],extratex[k],v,builtin[k],"darkred", false,false,true) - else show(k,"context", sameglobal[k],false, v,builtin[k],"darkyellow",false,false,true) + else + show(k,"context", sameglobal[k],false, v,builtin[k],"darkyellow",false,false,true) end end end diff --git a/tex/context/base/s-math-repertoire.mkiv b/tex/context/base/s-math-repertoire.mkiv index eeda5f66c..08c58aea3 100644 --- a/tex/context/base/s-math-repertoire.mkiv +++ b/tex/context/base/s-math-repertoire.mkiv @@ -421,7 +421,7 @@ \continueifinputfile{s-math-repertoire.mkiv} -\showmathcharacterssetbodyfonts{lucidaot,cambria,xits,modern,pagella,termes,bonum,schola} +\showmathcharacterssetbodyfonts{lucidaot,cambria,xits,modern,pagella,termes,bonum,schola,dejavu} \starttext @@ -437,10 +437,11 @@ % \setupbodyfont[stix, 12pt] % \setupbodyfont[xits, 12pt] % \setupbodyfont[lucida, 12pt] - \setupbodyfont[lucidaot, 12pt] + % \setupbodyfont[lucidaot, 12pt] % \setupbodyfont[pagella, 12pt] % \setupbodyfont[bonum, 12pt] % \setupbodyfont[schola, 12pt] + \setupbodyfont[dejavu, 12pt] } { diff --git a/tex/context/base/scrn-pag.mkvi b/tex/context/base/scrn-pag.mkvi index 5bbdadda8..749c98e7a 100644 --- a/tex/context/base/scrn-pag.mkvi +++ b/tex/context/base/scrn-pag.mkvi @@ -124,13 +124,24 @@ % % \starttext \input ward \stoptext -\def\scrn_canvas_synchronize_simple +\let\scrn_canvas_synchronize_simple \relax +\let\scrn_canvas_synchronize_complex\relax + +\appendtoks + \global\let\scrn_canvas_synchronize_simple \scrn_canvas_synchronize_simple_indeed + \global\let\scrn_canvas_synchronize_complex\scrn_canvas_synchronize_complex_indeed +\to \everysetuplayout + +\def\scrn_canvas_synchronize_simple_indeed {\ctxcommand{setupcanvas{ paperwidth = \number\printpaperwidth, paperheight = \number\printpaperheight - }}} + }}% + %\global\let\scrn_canvas_synchronize_simple \relax + \global\let\scrn_canvas_synchronize_complex\relax + } -\def\scrn_canvas_synchronize_complex +\def\scrn_canvas_synchronize_complex_indeed {\scrn_canvas_calculate % otherwise we need to hook it into setuppage etc \ctxcommand{setupcanvas{ mode = "\interactionscreenparameter\c!option", @@ -142,12 +153,22 @@ height = \number\canvasheight, paperwidth = \number\canvasmaxwidth, paperheight = \number\canvasmaxheight - }}} + }}% + %\global\let\scrn_canvas_synchronize_simple \relax + \global\let\scrn_canvas_synchronize_complex\relax + } \appendtoks - \doifcommonelse{\interactionscreenparameter\c!option}{\v!max,\v!fit}% - {\global\settrue \c_scrn_canvas_tight_page}% - {\global\setfalse\c_scrn_canvas_tight_page}% + \begingroup + \edef\p_option{\interactionscreenparameter\c!option}% + \ifx\p_option\v!max + \global\settrue \c_scrn_canvas_tight_page + \else\ifx\p_option\v!fit + \global\settrue \c_scrn_canvas_tight_page + \else + \global\setfalse\c_scrn_canvas_tight_page + \fi\fi + \endgroup \to \everysetupinteractionscreen \setupinteractionscreen @@ -159,6 +180,11 @@ \c!topspace=\topspace, \c!option=\v!auto] +\appendtoks + \global\let\scrn_canvas_synchronize_simple \scrn_canvas_synchronize_simple + \global\let\scrn_canvas_synchronize_complex\scrn_canvas_synchronize_complex +\to \everysetupinteractionscreen + %D Conditional page breaks: \unexpanded\def\screen @@ -177,7 +203,10 @@ {\dosingleempty\scrn_transitions_setup} \def\scrn_transitions_setup[#list]% - {\edef\scrn_transitions_list{#list}} + {\edef\scrn_transitions_list{#list}% + \ifx\scrn_transitions_list\v!reset + \let\scrn_transitions_list\empty + \fi} \def\scrn_transitions_set {\iflocation \ifx\scrn_transitions_list\empty \else diff --git a/tex/context/base/spac-ver.mkiv b/tex/context/base/spac-ver.mkiv index d61c7651b..d635d1435 100644 --- a/tex/context/base/spac-ver.mkiv +++ b/tex/context/base/spac-ver.mkiv @@ -142,6 +142,20 @@ \spacing\currentrelativeinterlinespace \fi} +\unexpanded\def\spac_linespacing_setup_use + {\ifcsname\namedinterlinespacehash\m_spac_interlinespace\s!parent\endcsname + \let\currentinterlinespace\m_spac_interlinespace + \spac_linespacing_setup_specified_interline_space + % \else + % we only support named interlinespaces + \fi} + +\unexpanded\def\useinterlinespaceparameter#1% see footnotes + {\edef\m_spac_interlinespace{#1\c!interlinespace}% + \ifx\m_spac_interlinespace\empty \else + \spac_linespacing_setup_use + \fi} + \newtoks\everysetupglobalinterlinespace \newtoks\everysetuplocalinterlinespace diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf Binary files differindex fc9fe0003..d42a70729 100644 --- a/tex/context/base/status-files.pdf +++ b/tex/context/base/status-files.pdf diff --git a/tex/context/base/status-lua.pdf b/tex/context/base/status-lua.pdf Binary files differindex 0a2a851dc..1905df03e 100644 --- a/tex/context/base/status-lua.pdf +++ b/tex/context/base/status-lua.pdf diff --git a/tex/context/base/status-mkiv.lua b/tex/context/base/status-mkiv.lua index 11d9991d6..45c282256 100644 --- a/tex/context/base/status-mkiv.lua +++ b/tex/context/base/status-mkiv.lua @@ -320,7 +320,6 @@ return { }, { category = "mkiv", - comment = "maybe this becomes a runtime module", filename = "toks-ini", loading = "always", status = "okay", @@ -4758,7 +4757,14 @@ return { { category = "lua", filename = "toks-ini", - status = "todo", + loading = "toks-ini", + status = "okay", + }, + { + category = "lua", + filename = "toks-scn", + loading = "toks-ini", + status = "okay", }, { category = "lua", diff --git a/tex/context/base/strc-doc.lua b/tex/context/base/strc-doc.lua index f63832035..1f7f01e4f 100644 --- a/tex/context/base/strc-doc.lua +++ b/tex/context/base/strc-doc.lua @@ -1011,18 +1011,3 @@ commands.popsectionblock = sections.popblock commands.registersection = sections.register commands.setsectionentry = sections.setentry commands.reportstructure = sections.reportstructure --- - --- local byway = "^" .. v_by -- ugly but downward compatible - --- function commands.way(way) --- context((gsub(way,byway,""))) --- end - -local pattern = P(v_by)^-1 * C(P(1)^1) - -function commands.way(way) - if way ~= "" then - context(lpegmatch(pattern,way)) - end -end diff --git a/tex/context/base/strc-not.mkvi b/tex/context/base/strc-not.mkvi index 3de4766ca..982dc2fbe 100644 --- a/tex/context/base/strc-not.mkvi +++ b/tex/context/base/strc-not.mkvi @@ -1182,6 +1182,7 @@ \insert\currentnoteinsertionnumber\bgroup \the\everyinsidenoteinsert\relax \usesetupsparameter\noteparameter % experimental + \useinterlinespaceparameter\noteparameter \doifelse{\noteparameter\c!paragraph}\v!yes {\nointerlineskip \startvboxtohboxseparator @@ -1354,11 +1355,14 @@ % idea: tag with attr and then just flush them again \def\strc_notes_flush_global - {\doifelse{\noteparameter\c!paragraph}\v!yes + {\begingroup + \useinterlinespaceparameter\noteparameter + \doifelse{\noteparameter\c!paragraph}\v!yes {\vbox\starthboxestohbox \iftrialtypesetting\unvcopy\else\unvbox\fi\currentnoteinsertionnumber \stophboxestohbox} - {\iftrialtypesetting\unvcopied\else\unvboxed\fi\currentnoteinsertionnumber}} + {\iftrialtypesetting\unvcopied\else\unvboxed\fi\currentnoteinsertionnumber}% + \endgroup} %D Supporting end notes is surprisingly easy. Even better, we %D can combine this feature with solving the common \TEX\ diff --git a/tex/context/base/strc-num.lua b/tex/context/base/strc-num.lua index e1fc60030..808d23fde 100644 --- a/tex/context/base/strc-num.lua +++ b/tex/context/base/strc-num.lua @@ -589,6 +589,15 @@ function commands.doifnotcounter (name) commands.doifnot (counterdata[name]) end function commands.incrementedcounter(...) context(counters.add(...)) end +local pattern = lpeg.P(variables.by)^-1 * lpeg.C(lpeg.P(1)^1) +local lpegmatch = lpeg.match + +function commands.way(way) + if way and way ~= "" then + context(lpegmatch(pattern,way)) + end +end + -- the noreset is somewhat messy ... always false messes up e.g. itemize but true the pagenumbers -- -- if this fails i'll clean up this still somewhat experimental mechanism (but i need use cases) diff --git a/tex/context/base/strc-reg.mkiv b/tex/context/base/strc-reg.mkiv index eedf86a66..f08a65516 100644 --- a/tex/context/base/strc-reg.mkiv +++ b/tex/context/base/strc-reg.mkiv @@ -314,7 +314,7 @@ \setnextinternalreference \xdef\currentregisternumber{\ctxcommand{storeregister{ metadata = { name = "\currentregister" }, - entries = { { \!!bs#2\!!es }, { \!!bs#3\!!es } }, + entries = { \!!bs#2\!!es, \!!bs#3\!!es }, processors = { \!!bs#4\!!es, \!!bs#5\!!es }, } }}% diff --git a/tex/context/base/supp-box.mkiv b/tex/context/base/supp-box.mkiv index 26609443b..5cfedac7c 100644 --- a/tex/context/base/supp-box.mkiv +++ b/tex/context/base/supp-box.mkiv @@ -2803,6 +2803,10 @@ \setbox\nextbox\hbox{#2}% \normalexpanded{\endgroup\edef\noexpand#1{\ctxcommand{boxtostring(\number\nextbox)}}}} +%D Even more dirty: + +\let\hyphenatedhbox\hbox + \protect \endinput % a bit of test code: diff --git a/tex/context/base/syst-aux.lua b/tex/context/base/syst-aux.lua index 69c9f8168..fba27a303 100644 --- a/tex/context/base/syst-aux.lua +++ b/tex/context/base/syst-aux.lua @@ -11,18 +11,23 @@ if not modules then modules = { } end modules ['syst-aux'] = { -- utfmatch(str,"(.?)(.*)$") -- utf.sub(str,1,1) -local commands, context = commands, context - local tonumber = tonumber -local settings_to_array = utilities.parsers.settings_to_array local format = string.format local utfsub = utf.sub -local P, S, R, C, Cc, Cs, Carg, lpegmatch, utf8character = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Carg, lpeg.match, lpeg.patterns.utf8character +local P, S, R, C, Cc, Cs, Carg, lpegmatch = lpeg.P, lpeg.S, lpeg.R, lpeg.C, lpeg.Cc, lpeg.Cs, lpeg.Carg, lpeg.match local todimen = number.todimen -local setvalue = context.setvalue +local commands = commands +local context = context + +local setcatcode = tex.setcatcode + +local utf8character = lpeg.patterns.utf8character +local settings_to_array = utilities.parsers.settings_to_array + +local setvalue = context.setvalue -local pattern = C(utf8character^-1) * C(P(1)^0) +local pattern = C(utf8character^-1) * C(P(1)^0) function commands.getfirstcharacter(str) local first, rest = lpegmatch(pattern,str) @@ -99,8 +104,15 @@ local sentinel = spaces * (nohash^1 / "\\%0") local sargument = (single * digit)^1 local dargument = (double * digit)^1 -local pattern = Cs( - ( P("global") / "\\global" )^0 +local usespaces = nil +local texpreamble = nil + +local pattern = Cs( -- ^-1 + ( P("spaces") / function() usespaces = true return "" end )^0 + * spaces + * ( P("nospaces") / function() usespaces = false return "" end )^0 + * spaces + * ( P("global") / "\\global" )^0 * spaces * ( P("unexpanded") / "\\unexpanded" )^0 * spaces @@ -119,10 +131,27 @@ local pattern = Cs( ) ) -function commands.thetexdefinition(str) --- print(str) --- print(lpegmatch(pattern,str)) - context(lpegmatch(pattern,str)) +local ctx_dostarttexdefinition = context.dostarttexdefinition + +function commands.texdefinition_1(str) + usespaces = nil + texpreamble = lpegmatch(pattern,str) + if usespaces == true then + setcatcode(32,10) -- space + setcatcode(13, 5) -- endofline + elseif usespaces == false then + setcatcode(32, 9) -- ignore + setcatcode(13, 9) -- ignore + else + -- this is default + -- setcatcode(32,10) -- space + -- setcatcode(13, 9) -- ignore + end + ctx_dostarttexdefinition() +end + +function commands.texdefinition_2() + context(texpreamble) end local upper, lower, strip = utf.upper, utf.lower, string.strip diff --git a/tex/context/base/syst-aux.mkiv b/tex/context/base/syst-aux.mkiv index 38afd034f..9546026e9 100644 --- a/tex/context/base/syst-aux.mkiv +++ b/tex/context/base/syst-aux.mkiv @@ -74,13 +74,20 @@ % %def\expunded#1{\normalexpanded\expandafter{#1}} % \def\expunded#1{\expandafter\empty#1} % used within an edef anyway - %D As we don't have namespace definers yet, we use a special one: -\newcount\c_syst_helpers_n_of_namespaces \c_syst_helpers_n_of_namespaces\pluseight % 1-8 reserved for catcodes +\ifdefined\c_syst_helpers_n_of_namespaces + + % lets plug in a better error message + +\else + + \newcount\c_syst_helpers_n_of_namespaces \c_syst_helpers_n_of_namespaces\pluseight % 1-8 reserved for catcodes + + \def\v_interfaces_prefix_template_system{\number \c_syst_helpers_n_of_namespaces>>} + %def\v_interfaces_prefix_template_system{\characters\c_syst_helpers_n_of_namespaces>>} % no \characters yet -\def\v_interfaces_prefix_template_system{\number \c_syst_helpers_n_of_namespaces>>} -%def\v_interfaces_prefix_template_system{\characters\c_syst_helpers_n_of_namespaces>>} % no \characters yet +\fi \unexpanded\def\installsystemnamespace#1% maybe move this to syst-ini {\ifcsname ??#1\endcsname @@ -3258,6 +3265,25 @@ % [here #oeps: \the\scratchcounter] % \stoptexdefinition +% \bgroup \obeylines +% +% \global\let\stoptexdefinition\relax +% +% \unexpanded\gdef\starttexdefinition% +% {\bgroup% +% \obeylines% +% \syst_helpers_start_tex_definition_one} +% +% \gdef\syst_helpers_start_tex_definition_one#1 +% {\catcode\endoflineasciicode\ignorecatcode% +% \syst_helpers_start_tex_definition_two{#1}} +% +% \gdef\syst_helpers_start_tex_definition_two#1#2\stoptexdefinition% +% {\egroup% +% \ctxcommand{thetexdefinition("#1")}{#2}} +% +% \egroup + \bgroup \obeylines \global\let\stoptexdefinition\relax @@ -3265,15 +3291,15 @@ \unexpanded\gdef\starttexdefinition% {\bgroup% \obeylines% - \syst_helpers_start_tex_definition_one} + \syst_helpers_start_tex_definition} -\gdef\syst_helpers_start_tex_definition_one#1 +\gdef\syst_helpers_start_tex_definition#1 {\catcode\endoflineasciicode\ignorecatcode% - \syst_helpers_start_tex_definition_two{#1}} + \ctxcommand{texdefinition_1("#1")}} -\gdef\syst_helpers_start_tex_definition_two#1#2\stoptexdefinition% +\gdef\dostarttexdefinition#1\stoptexdefinition% {\egroup% - \ctxcommand{thetexdefinition("#1")}{#2}} + \ctxcommand{texdefinition_2()}{#1}} \egroup diff --git a/tex/context/base/syst-ini.mkiv b/tex/context/base/syst-ini.mkiv index 879f3ed53..5ff80531a 100644 --- a/tex/context/base/syst-ini.mkiv +++ b/tex/context/base/syst-ini.mkiv @@ -1115,4 +1115,21 @@ %D %D So let's see what \TEX\ can do now that we've opened up the basic machinery. +%D Now we define a few helpers that we need in a very early stage. We hav eno message system +%D yet but redundant definitions are fatal anyway. + +\newcount\c_syst_helpers_n_of_namespaces \c_syst_helpers_n_of_namespaces\pluseight % 1-8 reserved for catcodes + +\def\v_interfaces_prefix_template_system{\number \c_syst_helpers_n_of_namespaces>>} +%def\v_interfaces_prefix_template_system{\characters\c_syst_helpers_n_of_namespaces>>} % no \characters yet + +\normalprotected\def\installsystemnamespace#1% + {\ifcsname ??#1\endcsname + \immediate\write16{fatal error: duplicate system namespace '#1'}% + \expandafter\normalend + \else + \global\advance\c_syst_helpers_n_of_namespaces\plusone + \expandafter\edef\csname ??#1\endcsname{\v_interfaces_prefix_template_system}% + \fi} + \protect \endinput diff --git a/tex/context/base/syst-lua.lua b/tex/context/base/syst-lua.lua index c50c5f1ca..37353c74e 100644 --- a/tex/context/base/syst-lua.lua +++ b/tex/context/base/syst-lua.lua @@ -14,6 +14,9 @@ commands = commands or { } local commands = commands local context = context +local csprint = context.sprint + +local prtcatcodes = tex.prtcatcodes function commands.writestatus(...) logs.status(...) end -- overloaded later @@ -30,24 +33,30 @@ local ctx_gobbleoneargument = context.gobbleoneargument -- context.constru function commands.doifelse(b) if b then ctx_firstoftwoarguments() +-- csprint(prtcatcodes,[[\ui_ft]]) -- ctx_firstoftwoarguments else ctx_secondoftwoarguments() +-- csprint(prtcatcodes,[[\ui_st]]) -- ctx_secondoftwoarguments end end function commands.doif(b) if b then ctx_firstofoneargument() +-- context.__flushdirect(prtcatcodes,[[\ui_fo]]) -- ctx_firstofonearguments else ctx_gobbleoneargument() +-- context.__flushdirect(prtcatcodes,[[\ui_go]]) -- ctx_gobbleonearguments end end function commands.doifnot(b) if b then ctx_gobbleoneargument() +-- csprint(prtcatcodes,[[\ui_go]]) -- ctx_gobbleonearguments else ctx_firstofoneargument() +-- csprint(prtcatcodes,[[\ui_fo]]) -- ctx_firstofonearguments end end diff --git a/tex/context/base/toks-ini.lua b/tex/context/base/toks-ini.lua index 82c801b88..9fcbd4345 100644 --- a/tex/context/base/toks-ini.lua +++ b/tex/context/base/toks-ini.lua @@ -61,6 +61,8 @@ if newtoken then local scan_glue = newtoken.scan_glue local scan_keyword = newtoken.scan_keyword local scan_token = newtoken.scan_token + local scan_word = newtoken.scan_word + local scan_number = newtoken.scan_number local get_next = newtoken.get_next @@ -102,52 +104,69 @@ if newtoken then local t = { } -- small optimization, a shared variable that is not reset - local function scan_word() - local n = 0 - while true do - local c = scan_code() - if c then - n = n + 1 - t[n] = utfchar(c) - elseif scan_code(space_bits) then - if n > 0 then + if scan_word then + + scan_number = function(base) + local s = scan_word() + if not s then + return nil + elseif base then + return tonumber(s,base) + else + return tonumber(s) + end + end + + else + + scan_word = function() + local n = 0 + while true do + local c = scan_code() + if c then + n = n + 1 + t[n] = utfchar(c) + elseif scan_code(space_bits) then + if n > 0 then + break + end + elseif n > 0 then break + else + return end - elseif n > 0 then - break - else - return end + return concat(t,"",1,n) end - return concat(t,"",1,n) - end - -- so we gobble the space (like scan_int) (number has to be space or non-char terminated - -- as we accept 0xabcd and such so there is no clear separator for a keyword - - local function scan_number(base) - local n = 0 - while true do - local c = scan_code() - if c then - n = n + 1 - t[n] = char(c) - elseif scan_code(space_bits) then - if n > 0 then + -- so we gobble the space (like scan_int) (number has to be space or non-char terminated + -- as we accept 0xabcd and such so there is no clear separator for a keyword + + scan_number = function(base) + local n = 0 + while true do + local c = scan_code() + if c then + n = n + 1 + t[n] = char(c) + elseif scan_code(space_bits) then + if n > 0 then + break + end + elseif n > 0 then break + else + return end - elseif n > 0 then - break + end + local s = concat(t,"",1,n) + if base then + return tonumber(s,base) else - return + return tonumber(s) end end - local s = concat(t,"",1,n) - if base then - return tonumber(s,base) - else - return tonumber(s) - end + end -- -- the next one cannot handle \iftrue true\else false\fi @@ -193,10 +212,16 @@ if newtoken then tokens.getters = { -- these don't expand token = get_next, + count = tex.getcount, + dimen = tex.getdimen, + box = tex.getbox, } tokens.setters = { macro = set_macro, + count = tex.setcount, + dimen = tex.setdimen, + box = tex.setbox, } end diff --git a/tex/context/base/toks-ini.mkiv b/tex/context/base/toks-ini.mkiv index c23b84e06..49625a939 100644 --- a/tex/context/base/toks-ini.mkiv +++ b/tex/context/base/toks-ini.mkiv @@ -14,6 +14,8 @@ \writestatus{loading}{ConTeXt Token Support / Initialization} \registerctxluafile{toks-ini}{1.001} +\registerctxluafile{toks-scn}{1.001} +\registerctxluafile{cldf-scn}{1.001} \unprotect diff --git a/tex/context/base/toks-scn.lua b/tex/context/base/toks-scn.lua new file mode 100644 index 000000000..3da962dad --- /dev/null +++ b/tex/context/base/toks-scn.lua @@ -0,0 +1,378 @@ +if not modules then modules = { } end modules ['toks-scn'] = { + version = 1.001, + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- Writing this kind of code (and completing the newtoken code base) is fun. I did +-- so with the brilliant film music from The Girl with the Dragon Tattoo running in a +-- loop in the background (three cd's by Trent Reznor and Atticus Ross). An alien +-- feeling helps with alien code. + +-- todo: more \let's at the tex end + +local type, next, tostring, tonumber = type, next, tostring, tonumber + +local formatters = string.formatters +local concat = table.concat +local loadstring = loadstring + +local scanners = tokens.scanners +local tokenbits = tokens.bits + +if not scanners then return end -- for now + +local scanstring = scanners.string +local scaninteger = scanners.integer +local scannumber = scanners.number +local scankeyword = scanners.keyword +local scanword = scanners.word +local scancode = scanners.code +local scanboolean = scanners.boolean +local scandimen = scanners.dimen + +if not scanstring then return end -- for now + +local todimen = number.todimen + +local lpegmatch = lpeg.match +local p_unquoted = lpeg.patterns.unquoted + +local trace_compile = false trackers.register("tokens.compile", function(v) trace_compile = v end) +local report_compile = logs.reporter("tokens","compile") +local report_scan = logs.reporter("tokens","scan") + +local open = tokenbits.open +local close = tokenbits.close + +local function scanopen() + while true do + local c = scancode(open) + if c == 123 then + return true + -- elseif c ~= 32 then + elseif not c then + return + end + end +end + +local function scanclose() + while true do + local c = scancode(close) + if c == 125 then + return true + -- elseif c ~= 32 then + elseif not c then + return + end + end +end + +scanners.scanopen = scanopen +scanners.scanclose = scanclose + +local shortcuts = { + tokens = tokens, + bits = tokenbits, + open = open, + close = close, + scanners = scanners, + scanstring = scanstring, + scaninteger = scaninteger, + scannumber = scannumber, + scankeyword = scankeyword, + scanword = scanword, + scancode = scancode, + scanboolean = scanboolean, + scandimen = scandimen, + scandimension = scandimen, + scanopen = scanopen, + scanclose = scanclose, + todimen = todimen, + tonumber = tonumber, + tostring = tostring, + inspect = inspect, + report = report_scan, +} + +tokens.shortcuts = shortcuts + +local load = load +local dump = string.dump + +local function loadstripped(code) + return load(code,nil,nil,shortcuts) + -- return load(dump(load(code),true),nil,nil,shortcuts) +end + +tokens.converters = { + tonumber = "tonumber", + todimen = "todimen", + toglue = "todimen", + tostring = "tostring", +} + +local f_if = formatters[ " if scankeyword('%s') then data['%s'] = scan%s()"] +local f_elseif = formatters[" elseif scankeyword('%s') then data['%s'] = scan%s()"] +local f_local = formatters["local scan%s = scanners.%s"] +local f_scan = formatters["scan%s()"] +local f_shortcut = formatters["local %s = scanners.converters.%s"] + +local f_if_c = formatters[ " if scankeyword('%s') then data['%s'] = %s(scan%s())"] +local f_elseif_c = formatters[" elseif scankeyword('%s') then data['%s'] = %s(scan%s())"] +local f_scan_c = formatters["%s(scan%s())"] + +local f_any = formatters[" else local key = scanword() if key then data[key] = scan%s() else break end end"] +local f_any_c = formatters[" else local key = scanword() if key then data[key] = %s(scan%s()) else break end end"] +local s_done = " else break end" + +local f_table = formatters["%\nt\nreturn function()\n local data = { }\n%s\n return %s\nend\n"] +local f_sequence = formatters["%\nt\n%\nt\n%\nt\nreturn function()\n return %s\nend\n"] +local f_simple = formatters["%\nt\nreturn function()\n return %s\nend\n"] +local f_string = formatters["%q"] +local f_action_f = formatters["action%s(%s)"] +local f_action_s = formatters["local action%s = tokens._action[%s]"] +local f_nested = formatters["local function scan%s()\n local data = { }\n%s\n return data\nend\n"] + +-- local f_check = formatters[ [[ +-- local wrapped = false +-- while true do +-- local c = scancode(open) +-- if c == 123 then +-- wrapped = true +-- break +-- elseif c ~= 32 then +-- break +-- end +-- end +-- while true do +-- ]] .. "%\nt\n" .. [[ +-- %s +-- end +-- if wrapped then +-- while true do +-- local c = scancode(close) +-- if c == 125 then +-- break +-- elseif c ~= 32 then +-- break +-- end +-- end +-- end +-- ]] ] + +local f_check = formatters[ [[ + local wrapped = scanopen() + while true do + ]] .. "%\nt\n" .. [[ + %s + end + if wrapped then + scanclose() + end +]] ] + +function tokens.compile(specification) + local f = { } + local n = 0 + local c = { } + local t = specification.arguments or specification + local a = specification.actions or nil + if type(a) == "function" then + a = { a } + end + local code + local function compile(t,nested) + local done = s_done + local r = { } + local m = 0 + for i=1,#t do + local ti = t[i] + local t1 = ti[1] + local t2 = ti[2] or "string" + if type(t2) == "table" then + n = n + 1 + f[n] = compile(t2,n) + t2 = n + end + local t3 = ti[3] + if type(t3) == "function" then + -- todo: also create shortcut + elseif t3 then + c[t3] = f_shortcut(t3,t3) + if t1 == "*" then + done = f_any_c(t3,t2) + else + m = m + 1 + r[m] = (m > 1 and f_elseif_c or f_if_c)(t1,t1,t3,t2) + end + else + if t1 == "*" then + done = f_any(t2) + else + m = m + 1 + r[m] = (m > 1 and f_elseif or f_if )(t1,t1,t2) + end + end + end + local c = f_check(r,done) + if nested then + return f_nested(nested,c) + else + return c + end + end + local tt = type(t) + if tt == "string" then + if a then + code = f_scan(t) + tokens._action = a + for i=1,#a do + code = f_action_f(i,code) + f[#f+1] = f_action_s(i,i) + end + code = f_simple(f,code) + else + return scanners[t] + end + elseif tt ~= "table" then + return + elseif #t == 1 then + local ti = t[1] + if type(ti) == "table" then + ti = compile(ti) + code = "data" + if a then + tokens._action = a + for i=1,#a do + code = f_action_f(i,code) + f[#f+1] = f_action_s(i,i) + end + end + code = f_table(f,ti,code) + elseif a then + code = f_scan(ti) + tokens._action = a + for i=1,#a do + code = f_action_f(i,code) + f[#f+1] = f_action_s(i,i) + end + code = f_simple(f,code) + else + return scanners[ti] + end + else + local r = { } + local p = { } + local m = 0 + for i=1,#t do + local ti = t[i] + local tt = type(ti) + if tt == "table" then + if ti[1] == "_constant_" then + local v = ti[2] + if type(v) == "string" then + r[i] = f_string(v) + else + r[i] = tostring(v) + end + else + m = m + 1 + p[m] = compile(ti,100+m) + r[i] = f_scan(100+m) + end + elseif tt == "number" then + r[i] = tostring(ti) + elseif tt == "boolean" then + r[i] = tostring(ti) + else + local s = lpegmatch(p_unquoted,ti) + if s and ti ~= s then + r[i] = ti -- a string, given as "'foo'" or '"foo"' + elseif scanners[ti] then + r[i] = f_scan(ti) + else + report_compile("unknown scanner %a",ti) + r[i] = ti + end + end + end + code = concat(r,",") + if a then + tokens._action = a + for i=1,#a do + code = f_action_f(i,code) + f[#f+1] = f_action_s(i,i) + end + end + code = f_sequence(c,f,p,code) + end + if not code then + return + end + if trace_compile then + report_compile("code: %s",code) + end + local code, message = loadstripped(code) + if code then + code = code() -- sets action + else + report_compile("error in code: %s",code) + report_compile("error message: %s",message) + end + if a then + tokens._action = nil + end + if code then + return code + end +end + +-- local fetch = tokens.compile { +-- "string", +-- "string", +-- { +-- { "data", "string" }, +-- { "tab", "string" }, +-- { "method", "string" }, +-- { "foo", { +-- { "method", "integer" }, +-- { "compact", "number" }, +-- { "nature" }, +-- { "*" }, -- any key +-- } }, +-- { "compact", "string", "tonumber" }, +-- { "nature", "boolean" }, +-- { "escape", "string" }, +-- { "escape" }, +-- } +-- "boolean", +-- } +-- +-- os.exit() + +function tokens.scantable(t,data) + if not data then + data = { } + end + local wrapped = scanopen() + while true do + local key = scanword() + if key then + local get = t[key] + if get then + data[key] = get() + else + -- catch all we can get + end + else + break + end + end + if wrapped then + scanclose() + end + return data +end diff --git a/tex/context/base/type-imp-dejavu.mkiv b/tex/context/base/type-imp-dejavu.mkiv index de1f7752c..41cf1f701 100644 --- a/tex/context/base/type-imp-dejavu.mkiv +++ b/tex/context/base/type-imp-dejavu.mkiv @@ -15,33 +15,6 @@ \starttypescriptcollection[dejavu] - \starttypescript [\s!mono] [dejavu-condensed] [\s!name] - \setups[\s!font:\s!fallback:\s!mono] - % \definefontsynonym [\s!Mono] [\s!name:dejavusansmonocondensed] [\s!features=\s!none] - % \definefontsynonym [\s!MonoBold] [\s!name:dejavusansmonoboldcondensed] [\s!features=\s!none] - % \definefontsynonym [\s!MonoItalic] [\s!name:dejavusansmonoobliquecondensed] [\s!features=\s!none] - % \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldobliquecondensed] [\s!features=\s!none] - \definefontsynonym [\s!Mono] [\s!name:dejavusansmono] [\s!features=dejavu-condensed-mono] - \definefontsynonym [\s!MonoBold] [\s!name:dejavusansmonobold] [\s!features=dejavu-condensed-mono] - \definefontsynonym [\s!MonoItalic] [\s!name:dejavusansmonooblique] [\s!features=dejavu-condensed-mono] - \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldoblique] [\s!features=dejavu-condensed-mono] - \stoptypescript - - % \starttypescript [\s!mono] [dejavu-condensed] [\s!name] - % \setups[\s!font:\s!fallback:\s!mono] - % \definefontsynonym [\s!Mono] [\s!name:dejavusansmono] [\s!features=\s!none] - % \definefontsynonym [\s!MonoBold] [\s!name:dejavusansmonobold] [\s!features=\s!none] - % \definefontsynonym [\s!MonoItalic] [\s!name:dejavusansmonooblique] [\s!features=\s!none] - % \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldoblique] [\s!features=\s!none] - % \stoptypescript - - \starttypescript[dejavu-condensed] - \definetypeface [dejavu-condensed] [\s!rm] [\s!serif] [dejavu-condensed] [\s!default] - \definetypeface [dejavu-condensed] [\s!ss] [\s!sans] [dejavu-condensed] [\s!default] - \definetypeface [dejavu-condensed] [\s!tt] [\s!mono] [dejavu-condensed] [\s!default] - \definetypeface [dejavu-condensed] [\s!mm] [\s!math] [xits] [\s!default] [\s!rscale=1.2] - \stoptypescript - \starttypescript [\s!serif] [dejavu] [\s!name] \setups[\s!font:\s!fallback:\s!serif] \definefontsynonym [\s!Serif] [\s!name:dejavuserif] [\s!features=\s!default] @@ -66,11 +39,17 @@ \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldoblique] [\s!features=\s!none] \stoptypescript + \starttypescript [\s!math][dejavu][\s!name] + %\loadfontgoodies[dejavu] + \definefontsynonym[\s!MathRoman][file:dejavu-math.otf][\s!features=\s!math\mathsizesuffix] + \stoptypescript + \starttypescript[dejavu] \definetypeface [dejavu] [\s!rm] [\s!serif] [dejavu] [\s!default] \definetypeface [dejavu] [\s!ss] [\s!sans] [dejavu] [\s!default] \definetypeface [dejavu] [\s!tt] [\s!mono] [dejavu] [\s!default] - \definetypeface [dejavu] [\s!mm] [\s!math] [xits] [\s!default] [\s!rscale=1.2] +% \definetypeface [dejavu] [\s!mm] [\s!math] [xits] [\s!default] [\s!rscale=1.2] + \definetypeface [dejavu] [\s!mm] [\s!math] [dejavu] [\s!default] \stoptypescript \starttypescript[dejavubidi] @@ -96,4 +75,32 @@ \definefontsynonym [\s!SansBoldItalic] [\s!name:dejavusanscondensedboldoblique] [\s!features=\s!default] \stoptypescript + \starttypescript [\s!mono] [dejavu-condensed] [\s!name] + \setups[\s!font:\s!fallback:\s!mono] + % \definefontsynonym [\s!Mono] [\s!name:dejavusansmonocondensed] [\s!features=\s!none] + % \definefontsynonym [\s!MonoBold] [\s!name:dejavusansmonoboldcondensed] [\s!features=\s!none] + % \definefontsynonym [\s!MonoItalic] [\s!name:dejavusansmonoobliquecondensed] [\s!features=\s!none] + % \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldobliquecondensed] [\s!features=\s!none] + \definefontsynonym [\s!Mono] [\s!name:dejavusansmono] [\s!features=dejavu-condensed-mono] + \definefontsynonym [\s!MonoBold] [\s!name:dejavusansmonobold] [\s!features=dejavu-condensed-mono] + \definefontsynonym [\s!MonoItalic] [\s!name:dejavusansmonooblique] [\s!features=dejavu-condensed-mono] + \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldoblique] [\s!features=dejavu-condensed-mono] + \stoptypescript + + % \starttypescript [\s!mono] [dejavu-condensed] [\s!name] + % \setups[\s!font:\s!fallback:\s!mono] + % \definefontsynonym [\s!Mono] [\s!name:dejavusansmono] [\s!features=\s!none] + % \definefontsynonym [\s!MonoBold] [\s!name:dejavusansmonobold] [\s!features=\s!none] + % \definefontsynonym [\s!MonoItalic] [\s!name:dejavusansmonooblique] [\s!features=\s!none] + % \definefontsynonym [\s!MonoBoldItalic] [\s!name:dejavusansmonoboldoblique] [\s!features=\s!none] + % \stoptypescript + + \starttypescript[dejavu-condensed] + \definetypeface [dejavu-condensed] [\s!rm] [\s!serif] [dejavu-condensed] [\s!default] + \definetypeface [dejavu-condensed] [\s!ss] [\s!sans] [dejavu-condensed] [\s!default] + \definetypeface [dejavu-condensed] [\s!tt] [\s!mono] [dejavu-condensed] [\s!default] +% \definetypeface [dejavu-condensed] [\s!mm] [\s!math] [xits] [\s!default] [\s!rscale=1.2] + \definetypeface [dejavu-condensed] [\s!mm] [\s!math] [dejavu] [\s!default] + \stoptypescript + \stoptypescriptcollection diff --git a/tex/context/base/typo-del.mkiv b/tex/context/base/typo-del.mkiv index 2b4e6e6aa..4c3c5ab3d 100644 --- a/tex/context/base/typo-del.mkiv +++ b/tex/context/base/typo-del.mkiv @@ -394,7 +394,7 @@ \blank[\p_delimited_spaceafter]% \fi \useindentnextparameter\delimitedtextparameter - \dorechecknextindentation}% AM: This was missing! + \aftergroup\dorechecknextindentation}% AM: This was missing! \def\typo_delimited_start_txt {\let\typo_delimited_stop\typo_delimited_stop_txt diff --git a/tex/context/base/typo-itc.lua b/tex/context/base/typo-itc.lua index 5e1ff3fbc..1de481a49 100644 --- a/tex/context/base/typo-itc.lua +++ b/tex/context/base/typo-itc.lua @@ -228,6 +228,12 @@ function italics.handler(head) replaceinserted = nil postinserted = nil elseif id == disc_code then + previnserted = nil + previtalic = 0 + replaceinserted = nil + replaceitalic = 0 + postinserted = nil + postitalic = 0 replace = getfield(current,"replace") if replace then local current = find_tail(replace) @@ -259,18 +265,21 @@ function italics.handler(head) replace = current end end - else - replaceitalic = 0 +-- else +-- replaceitalic = 0 end - else - replaceitalic = 0 +-- else +-- replaceitalic = 0 end - else - replaceitalic = 0 +-- else +-- replaceitalic = 0 end - replaceinserted = nil +-- replaceinserted = nil +-- else +-- replaceitalic = 0 +-- replaceinserted = nil end - local post = getfield(current,"post") + post = getfield(current,"post") if post then local current = find_tail(post) if getid(current) ~= glyph_code then @@ -286,7 +295,7 @@ function italics.handler(head) local cd = data[char] if not cd then -- this really can happen - postitalic = 0 +-- postitalic = 0 else postitalic = cd.italic or cd.italic_correction if not postitalic then @@ -301,16 +310,19 @@ function italics.handler(head) post = current end end - else - postitalic = 0 +-- else +-- postitalic = 0 end - else - postitalic = 0 +-- else +-- postitalic = 0 end - else - postitalic = 0 +-- else +-- postitalic = 0 end - postinserted = nil +-- postinserted = nil +-- else +-- postitalic = 0 +-- postinserted = nil end elseif id == kern_code then -- how about fontkern ? previnserted = nil @@ -350,23 +362,37 @@ function italics.handler(head) end elseif id == math_code then current = end_of_math(current) + previnserted = nil + previtalic = 0 + replaceinserted = nil + replaceitalic = 0 + postinserted = nil + postitalic = 0 else if previtalic ~= 0 then if trace_italics then report_italics("inserting %p between %s italic %C and whatever",previtalic,"glyph",prevchar) end insert_node_after(prevhead,prev,new_correction_kern(previtalic)) - previnserted = nil - previtalic = 0 - done = true + previnserted = nil + previtalic = 0 + replaceinserted = nil + replaceitalic = 0 + postinserted = nil + postitalic = 0 + done = true else if replaceitalic ~= 0 then if trace_italics then report_italics("inserting %p between %s italic %C and whatever",replaceritalic,"replace",replacechar) end insert_node_after(replacehead,replace,new_correction_kern(replaceitalic)) - replaceitalic = 0 + previnserted = nil + previtalic = 0 replaceinserted = nil + replaceitalic = 0 + postinserted = nil + postitalic = 0 done = true end if postitalic ~= 0 then @@ -374,9 +400,13 @@ function italics.handler(head) report_italics("inserting %p between %s italic %C and whatever",postitalic,"post",postchar) end insert_node_after(posthead,post,new_correction_kern(postitalic)) - postinserted = nil - postitalic = 0 - done = true + previnserted = nil + previtalic = 0 + replaceinserted = nil + replaceitalic = 0 + postinserted = nil + postitalic = 0 + done = true end end end diff --git a/tex/context/base/util-seq.lua b/tex/context/base/util-seq.lua index 4dd9ddc33..08fc4e95c 100644 --- a/tex/context/base/util-seq.lua +++ b/tex/context/base/util-seq.lua @@ -17,13 +17,15 @@ use locals to refer to them when compiling the chain.</p> -- todo: protect groups (as in tasks) -local format, gsub, concat, gmatch = string.format, string.gsub, table.concat, string.gmatch +local gsub, concat, gmatch = string.gsub, table.concat, string.gmatch local type, load = type, load utilities = utilities or { } local tables = utilities.tables local allocate = utilities.storage.allocate +local formatters = string.formatters + local sequencers = { } utilities.sequencers = sequencers @@ -217,20 +219,23 @@ local function construct(t) for i=1,#actions do local action = actions[i] if not askip[action] then + local localized if type(action) == "function" then local name = localize(tostring(action)) functions[name] = action - action = format("utilities.sequencers.functions.%s",name) + action = formatters["utilities.sequencers.functions.%s"](name) + localized = localize(name) -- shorter than action + else + localized = localize(action) end - local localized = localize(action) n = n + 1 - variables[n] = format("local %s = %s",localized,action) + variables[n] = formatters["local %s = %s"](localized,action) if not returnvalues then - calls[n] = format("%s(%s)",localized,arguments) + calls[n] = formatters["%s(%s)"](localized,arguments) elseif n == 1 then - calls[n] = format("local %s = %s(%s)",returnvalues,localized,arguments) + calls[n] = formatters["local %s = %s(%s)"](returnvalues,localized,arguments) else - calls[n] = format("%s = %s(%s)",returnvalues,localized,arguments) + calls[n] = formatters["%s = %s(%s)"](returnvalues,localized,arguments) end end end @@ -243,9 +248,9 @@ local function construct(t) variables = concat(variables,"\n") calls = concat(calls,"\n") if results then - t.compiled = format("%s\nreturn function(%s)\n%s\nreturn %s\nend",variables,arguments,calls,results) + t.compiled = formatters["%s\nreturn function(%s)\n%s\nreturn %s\nend"](variables,arguments,calls,results) else - t.compiled = format("%s\nreturn function(%s)\n%s\nend",variables,arguments,calls) + t.compiled = formatters["%s\nreturn function(%s)\n%s\nend"](variables,arguments,calls) end end -- print(t.compiled) @@ -271,6 +276,7 @@ compile = function(t,compiler,n) -- already referred to in sequencers.new if compiled == "" then runner = false else +-- inspect(compiled) runner = compiled and load(compiled)() -- we can use loadstripped here end t.runner = runner @@ -327,12 +333,12 @@ function sequencers.nodeprocessor(t,nofarguments) -- todo: handle 'kind' in plug if not askip[action] then local localized = localize(action) n = n + 1 - vars[n] = format("local %s = %s",localized,action) + vars[n] = formatters["local %s = %s"](localized,action) -- only difference with tostring is kind and rets (why no return) if kind[action] == "nohead" then - calls[n] = format(" ok = %s(head%s) done = done or ok",localized,args) + calls[n] = formatters[" ok = %s(head%s) done = done or ok"](localized,args) else - calls[n] = format(" head, ok = %s(head%s) done = done or ok",localized,args) + calls[n] = formatters[" head, ok = %s(head%s) done = done or ok"](localized,args) end -- local s = " print('" .. tostring(group) .. " " .. tostring(action) .. " : ' .. tostring(head)) " -- calls[n] = s .. calls[n] .. s @@ -340,6 +346,6 @@ function sequencers.nodeprocessor(t,nofarguments) -- todo: handle 'kind' in plug end end end - local processor = #calls > 0 and format(template_yes,concat(vars,"\n"),args,concat(calls,"\n")) or template_nop + local processor = #calls > 0 and formatters[template_yes](concat(vars,"\n"),args,concat(calls,"\n")) or template_nop return processor end diff --git a/tex/context/base/x-set-11.mkiv b/tex/context/base/x-set-11.mkiv index c0575e625..53e172102 100644 --- a/tex/context/base/x-set-11.mkiv +++ b/tex/context/base/x-set-11.mkiv @@ -57,7 +57,7 @@ 2: -- wordt verwerkt 3: -- is niet gedefinieerd 4: -- wordt nogmaals verwerkt - optional: optioneel + optional: opt displaymath: formule index: ingang math: formule @@ -95,7 +95,7 @@ 2: -- is processed 3: -- is undefined 4: -- is processed again - optional: optional + optional: opt displaymath: formula index: entry math: formula @@ -133,7 +133,7 @@ 2: -- wird verarbeitet 3: -- ist undefiniert 4: -- ist mehrmals verarbeitet - optional: optioneel + optional: opt displaymath: formula index: entry math: formula @@ -171,7 +171,7 @@ 2: -- je zpracovano 3: -- je nedefinovano 4: -- je zpracovano znovu - optional: optioneel + optional: opt displaymath: formula index: entry math: formula @@ -209,7 +209,7 @@ 2: -- is processed 3: -- is undefined 4: -- is processed again - optional: optioneel + optional: opt displaymath: formula index: entry math: formula @@ -247,7 +247,7 @@ 2: este procesat -- 3: -- este nedefinit 4: -- este procesat din nou - optional: optioneel + optional: opt displaymath: formula index: entry math: formula @@ -285,7 +285,7 @@ 2: -- est traité 3: -- n'est pas défini 4: -- est traité de nouveau - optional: optionel + optional: opt displaymath: formule index: entrée math: formule diff --git a/tex/context/base/x-xtag.mkiv b/tex/context/base/x-xtag.mkiv index 09490cc8f..ab95c567e 100644 --- a/tex/context/base/x-xtag.mkiv +++ b/tex/context/base/x-xtag.mkiv @@ -14,7 +14,7 @@ %D Here we load the \MKII\ (mostly) streaming \XML\ parser. We %D define a couple of catcode regimes first. -\ifdefined\XMLbanner \endinput \fi +\endinput \writestatus{xtag}{this module is obsolete, use the mkiv-xml features or use mkii instead} diff --git a/tex/generic/context/luatex/luatex-fonts-merged.lua b/tex/generic/context/luatex/luatex-fonts-merged.lua index b6621525a..0c307c7bc 100644 --- a/tex/generic/context/luatex/luatex-fonts-merged.lua +++ b/tex/generic/context/luatex/luatex-fonts-merged.lua @@ -1,6 +1,6 @@ -- merged file : luatex-fonts-merged.lua -- parent file : luatex-fonts.lua --- merge date : 03/10/15 12:09:17 +-- merge date : 03/25/15 22:13:54 do -- begin closure to overcome local limits and interference @@ -660,24 +660,48 @@ function lpeg.append(list,pp,delayed,checked) end return p end +local p_false=P(false) +local p_true=P(true) local function make(t,hash) - local p=P(false) + local p=p_false local keys=sortedkeys(t) + local function making(t,w) + local p=p_false + local keys=sortedkeys(t) + for i=1,#keys do + local k=keys[i] + local v=t[k] + if w then + if v==true then + p=p+P(k)*p_true + else + p=p+P(k)*(making(v,w)+p_true) + end + else + if v==true then + p=p+P(k) + else + p=p+P(k)*making(v,w) + end + end + end + return p + end for i=1,#keys do local k=keys[i] local v=t[k] local h=hash[v] if h then - if next(v) then - p=p+P(k)*(make(v,hash)+P(true)) + if v==true then + p=p+P(k)*p_true else - p=p+P(k)*P(true) + p=p+P(k)*(making(v,true)+p_true) end else - if next(v) then - p=p+P(k)*make(v,hash) - else + if v==true then p=p+P(k) + else + p=p+P(k)*making(v,false) end end end @@ -685,34 +709,55 @@ local function make(t,hash) end function lpeg.utfchartabletopattern(list) local tree={} - local hash={} + local hash local n=#list if n==0 then + hash=list for s in next,list do local t=tree + local p,pk for c in gmatch(s,".") do - local tc=t[c] - if not tc then - tc={} - t[c]=tc + if t==true then + t={ [c]=true } + p[pk]=t + p=t + t=true + else + local tc=t[c] + if not tc then + tc=true + t[c]=tc + end + p=t + t=tc end - t=tc + pk=c end - hash[t]=s end else + hash={} for i=1,n do local t=tree local s=list[i] + local p,pk for c in gmatch(s,".") do - local tc=t[c] - if not tc then - tc={} - t[c]=tc + if t==true then + t={ [c]=true } + p[pk]=t + p=t + t=true + else + local tc=t[c] + if not tc then + tc=true + t[c]=true + end + p=t + t=tc end - t=tc + pk=c end - hash[t]=s + hash[s]=true end end return make(tree,hash) @@ -5280,6 +5325,7 @@ local report_fonts=logs.reporter("fonts","loading") local fonts=fonts or {} local mappings=fonts.mappings or {} fonts.mappings=mappings +local allocate=utilities.storage.allocate local function loadlumtable(filename) local lumname=file.replacesuffix(file.basename(filename),"lum") local lumfile=resolvers.findfile(lumname,"map") or "" @@ -5381,7 +5427,7 @@ mappings.fromunicode16=fromunicode16 local ligseparator=P("_") local varseparator=P(".") local namesplitter=Ct(C((1-ligseparator-varseparator)^1)*(ligseparator*C((1-ligseparator-varseparator)^1))^0) -local overloads={ +local overloads=allocate { IJ={ name="I_J",unicode={ 0x49,0x4A },mess=0x0132 }, ij={ name="i_j",unicode={ 0x69,0x6A },mess=0x0133 }, ff={ name="f_f",unicode={ 0x66,0x66 },mess=0xFB00 }, |