diff options
Diffstat (limited to 'tex/context/base')
24 files changed, 1765 insertions, 383 deletions
diff --git a/tex/context/base/back-ini.mkiv b/tex/context/base/back-ini.mkiv index c3bc78ae6..8a3f77b1d 100644 --- a/tex/context/base/back-ini.mkiv +++ b/tex/context/base/back-ini.mkiv @@ -51,8 +51,6 @@ %D Not everything here makes sense and the content of this file will %D definitely change. -\newcount\backendtransformlevel - \let \dostartrotation \gobbleoneargument \let \dostoprotation \donothing \let \dostartscaling \gobbletwoarguments diff --git a/tex/context/base/back-pdf.lua b/tex/context/base/back-pdf.lua index 9eb4a9b73..2fbaaa0d2 100644 --- a/tex/context/base/back-pdf.lua +++ b/tex/context/base/back-pdf.lua @@ -38,13 +38,17 @@ end -- -- we could also do the save restore wrapping here + colorhack +local pdfsave = nodes.pool.pdfsave +local pdfrestore = nodes.pool.pdfrestore local pdfsetmatrix = nodes.pool.pdfsetmatrix + local stack = { } local function popmatrix() local top = remove(stack) if top then context(pdfsetmatrix(unpack(top))) + context(pdfrestore()) end end @@ -53,6 +57,7 @@ function commands.pdfstartrotation(a) insert(stack,false) else local s, c = sind(a), cosd(a) + context(pdfsave()) context(pdfsetmatrix(c,s,-s,c)) insert(stack,{ c, -s, s, c }) end @@ -68,6 +73,7 @@ function commands.pdfstartscaling(sx,sy) if sy == 0 then sy = 0.0001 end + context(pdfsave()) context(pdfsetmatrix(sx,0,0,sy)) insert(stack,{ 1/sx, 0, 0, 1/sy }) end @@ -81,6 +87,7 @@ function commands.pdfstartmatrix(sx,rx,ry,sy) -- tx, ty if sx == 1 and rx == 0 and ry == 0 and sy == 1 then insert(stack,false) else + context(pdfsave()) context(pdfsetmatrix(sx,rx,ry,sy)) insert(stack,{ -sx, -rx, -ry, -sy }) end @@ -88,5 +95,7 @@ end commands.pdfstoprotation = popmatrix commands.pdfstopscaling = popmatrix -commands.pdfstopmirroring = commands.pdfstartmirroring +commands.pdfstopmirroring = popmatrix commands.pdfstopmatrix = popmatrix + +-- todo : clipping diff --git a/tex/context/base/back-pdf.mkiv b/tex/context/base/back-pdf.mkiv index 3fbad1350..c91d2251d 100644 --- a/tex/context/base/back-pdf.mkiv +++ b/tex/context/base/back-pdf.mkiv @@ -41,17 +41,31 @@ %D %D Here we initialize some internal quantities. We also protect them. -\pdfoutput 1 \let\pdfoutput \undefined \newcount\pdfoutput \pdfoutput 1 -\pdfhorigin 1 true in \let\pdfhorigin\undefined \newdimen\pdfhorigin \pdfhorigin 1 true in -\pdfvorigin 1 true in \let\pdfvorigin\undefined \newdimen\pdfvorigin \pdfvorigin 1 true in +\pdfoutput \plusone \let\pdfoutput \undefined \newcount\pdfoutput \pdfoutput \plusone -% most of these will be protected as well +%D These are already set: +\pdfhorigin 1 true in \let\pdfhorigin\undefined \newdimen\pdfhorigin \pdfhorigin 1 true in +\pdfvorigin \pdfhorigin \let\pdfvorigin\undefined \newdimen\pdfvorigin \pdfvorigin \pdfhorigin + +%D These too and most of them will be protected as well: + +\pdfminorversion \plussix +\pdfgentounicode \plusone \let\pdfgentounicode \undefined \newcount\pdfgentounicode +\pdfinclusioncopyfonts \plusone \let\pdfinclusioncopyfonts \undefined \newcount\pdfinclusioncopyfonts +\pdfinclusionerrorlevel \zerocount \let\pdfinclusionerrorlevel\undefined \newcount\pdfinclusionerrorlevel +\pdfdecimaldigits \plusten \let\pdfdecimaldigits \undefined \newcount\pdfdecimaldigits \pdfimageresolution 300 \pdfpkresolution 600 -\pdfdecimaldigits 10 -\pdfinclusionerrorlevel 0 -\pdfminorversion 6 % use setupbackend for changes + +%D Let's block these (we could share a dummy: + +\let\pdfcatalog \relax \newtoks\pdfcatalog +\let\pdfinfo \relax \newtoks\pdfinfo +\let\pdfnames \relax \newtoks\pdfnames +\let\pdfpageresources\relax \newtoks\pdfpageresources +\let\pdfpageattr \relax \newtoks\pdfpageattr +\let\pdfpagesattr \relax \newtoks\pdfpagesattr %D This one can be consulted by users although the suffix is also %D a system mode. @@ -102,16 +116,8 @@ \unexpanded\def\pdfbackendsetshade #1#2{\ctxlua{lpdf.adddocumentshade ("#1",lpdf.verbose(\!!bs#2\!!es))}} \def\pdfbackendcurrentresources {\cldcontext{lpdf.collectedresources()}} - \def\pdfcolor #1{\ctxlua{lpdf.pdfcolor(\thecolorattribute{#1})}} \let\PDFcolor\pdfcolor - -%D Let's block these: - -\let\pdfcatalog \relax \newtoks\pdfcatalog -\let\pdfinfo \relax \newtoks\pdfinfo -\let\pdfnames \relax \newtoks\pdfnames -\let\pdfpageresources\relax \newtoks\pdfpageresources -\let\pdfpageattr \relax \newtoks\pdfpageattr -\let\pdfpagesattr \relax \newtoks\pdfpagesattr + \def\pdfcolor #1{\cldcontext{lpdf.pdfcolor(\thecolorattribute{#1})}} + \let\PDFcolor\pdfcolor %D An example of usage is: @@ -120,38 +126,35 @@ \pdfbackendsetinfo{ConTeXt.Time} {\number\normalyear.\twodigits\normalmonth.\twodigits\normalday\space \twodigits\currenthour:\twodigits\currentminute}% \pdfbackendsetinfo{ConTeXt.Jobname}{\jobname}% \pdfbackendsetinfo{ConTeXt.Url} {www.pragma-ade.com}% + \pdfbackendsetinfo{ConTeXt.Support}{contextgarden.net}% \to \everylastbackendshipout %D Transformations. Some day we will use primitives (once they're fixed). + % todo: inject at the lua end cq. deal with #5 and #6 too % % % rotation % % % \unexpanded\def\dostartrotation#1% grouped - {\advance\backendtransformlevel\plusone - \forcecolorhack + {\forcecolorhack \pdfsave \pdfsetmatrix{\ctxcommand{pdfrotation(#1)}}} \unexpanded\def\dostoprotation {\pdfrestore - \forcecolorhack - \advance\backendtransformlevel\minusone} + \forcecolorhack} % \unexpanded\def\dostartrotation#1% grouped % {\forcecolorhack -% \advance\backendtransformlevel\plusone % \ctxcommand{pdfstartrotation(#1)}} % \unexpanded\def\dostoprotation -% {\ctxcommand{pdfstoprotation()}% -% \advance\backendtransformlevel\minusone} +% {\ctxcommand{pdfstoprotation()}} % % % scaling % % % \unexpanded\def\dostartscaling#1#2% the test is needed because acrobat is bugged! - {\advance\backendtransformlevel\plusone - \forcecolorhack % maybe use signal instead + {\forcecolorhack % maybe use signal instead \pdfsave \pdfsetmatrix {\ifdim#1\points=\zeropoint.0001\else#1\fi\space 0 0 @@ -159,60 +162,49 @@ \unexpanded\def\dostopscaling {\pdfrestore - \forcecolorhack - \advance\backendtransformlevel\minusone} + \forcecolorhack} % \unexpanded\def\dostartscaling#1#2% the test is needed because acrobat is bugged! % {\forcecolorhack -% \advance\backendtransformlevel\plusone % \ctxcommand{pdfstartscaling(#1,#2)}} % \unexpanded\def\dostopscaling -% {\ctxcommand{pdfstopscaling()}% -% \advance\backendtransformlevel\minusone} +% {\ctxcommand{pdfstopscaling()}} % % % mirroring % % % \unexpanded\def\dostartmirroring - {\advance\backendtransformlevel\plusone - \forcecolorhack + {\forcecolorhack \pdfsave \pdfsetmatrix{-1 0 0 1}} % 0 0 \unexpanded\def\dostopmirroring {\pdfrestore - \forcecolorhack - \advance\backendtransformlevel\minusone} + \forcecolorhack} % \unexpanded\def\dostartmirroring -% {\advance\backendtransformlevel\plusone -% \ctxcommand{pdfstartmirroring()}} +% {\ctxcommand{pdfstartmirroring()}} % \unexpanded\def\dostopmirroring -% {\ctxcommand{pdfstopmirroring()}% -% \advance\backendtransformlevel\minusone} +% {\ctxcommand{pdfstopmirroring()}} % % % transform % % % \unexpanded\def\dotransformnextbox#1#2#3#4#5#6% sx rx ry sy tx ty (will change) / basepoints ! - {\advance\backendtransformlevel\plusone - % fixing ht/dp/wd should happen elsewhere - \dowithnextbox{\dodotransformnextbox{#5}{#6}{#1 #2 #3 #4}}} + {\dowithnextbox{\dodotransformnextbox{#5}{#6}{#1 #2 #3 #4}}} \unexpanded\def\dodotransformnextbox#1#2#3% - {%\forcecolorhack - \hbox + {\hbox {\kern#1\onebasepoint \raise#2\onebasepoint\hbox {\pdfsave \pdfsetmatrix{#3}% 0 0 (no #5 #6 yet) \box\nextbox \pdfrestore - \advance\backendtransformlevel\minusone}}} + }}} % \unexpanded\def\dotransformnextbox#1#2#3#4#5#6% sx rx ry sy tx ty (will change) / basepoints ! -% {\advance\backendtransformlevel\plusone -% % fixing ht/dp/wd should happen elsewhere +% {% fixing ht/dp/wd should happen elsewhere % \dowithnextbox{\dodotransformnextbox{#1}{#2}{#3}{#4}{#5}{#6}}} % \unexpanded\def\dodotransformnextbox#1#2#3#4#5#6% @@ -222,8 +214,41 @@ % \hbox % {\ctxcommand{pdfstartmatrix(#1,#2,#3,#4)}% % \box\nextbox -% \ctxcommand{pdfstopmatrix()}% -% \advance\backendtransformlevel\minusone}}} +% \ctxcommand{pdfstopmatrix()}}}} + +% somehow the shift is not happening .. bug in luatex? +% +% \unexpanded\def\dodotransformnextbox#1#2#3#4#5#6% +% {\ctxcommand{pdftransformbox(\number\nextbox,#1,#2,#3,#4,\number\dimexpr#5\onebasepoint,\number\dimexpr#6\onebasepoint)}% +% \box\nextbox} +% +% \startluacode +% function commands.pdftransformbox(box,sx,rx,ry,sy,tx,ty) +% if sx == 1 and rx == 0 and ry == 0 and sy == 1 then +% if tx == 0 and ty == 0 then +% local b = nodes.hpack(nodes.concat { +% nodes.pool.kern(tx), +% nodes.takebox(box), +% }) +% b.shift = -ty +% tex.setbox(box,b) +% else +% -- no need to transform +% end +% else +% local b = nodes.hpack(nodes.concat { +% nodes.pool.kern(tx), +% nodes.pool.pdfsave(), +% nodes.pool.pdfsetmatrix(sx,rx,ry,sy), +% nodes.takebox(box), +% nodes.pool.pdfsetmatrix(-sx,-rx,-ry,-sy), +% nodes.pool.pdfrestore(), +% }) +% b.shift = -ty +% tex.setbox(box,b) +% end +% end +% \stopluacode % % % clipping % % % diff --git a/tex/context/base/char-utf.lua b/tex/context/base/char-utf.lua index d406b8bfe..8714d6b44 100644 --- a/tex/context/base/char-utf.lua +++ b/tex/context/base/char-utf.lua @@ -29,28 +29,31 @@ local utfchar, utfbyte, utfcharacters, utfvalues = utf.char, utf.byte, utf.chara local allocate = utilities.storage.allocate local lpegmatch, lpegpatterns = lpeg.match, lpeg.patterns -local charfromnumber = characters.fromnumber +local charfromnumber = characters.fromnumber -characters = characters or { } -local characters = characters +characters = characters or { } +local characters = characters -characters.graphemes = allocate() -local graphemes = characters.graphemes +local graphemes = allocate() +characters.graphemes = graphemes -characters.combined = allocate() -local combined = characters.combined +local collapsed = allocate() +characters.collapsed = collapsed -characters.decomposed = allocate() -local decomposed = characters.decomposed +local combined = allocate() +characters.combined = combined -characters.mathpairs = allocate() -local mathpairs = characters.mathpairs +local decomposed = allocate() +characters.decomposed = decomposed -characters.filters = allocate() -local filters = characters.filters +local mathpairs = allocate() +characters.mathpairs = mathpairs -filters.utf = filters.utf or { } -local utffilters = characters.filters.utf +local filters = allocate() +characters.filters = filters + +local utffilters = { } +characters.filters.utf = utffilters -- is characters.combined cached? @@ -81,90 +84,132 @@ local decomposed = allocate { characters.decomposed = decomposed -local function initialize() -- maybe only 'mn' +-- local function initialize() -- maybe only 'mn' +-- local data = characters.data +-- for unicode, v in next, data do +-- -- using vs and first testing for length is faster (.02->.01 s) +-- local vs = v.specials +-- if vs and #vs == 3 then +-- local vc = vs[1] +-- if vc == "char" then +-- local one, two = vs[2], vs[3] +-- if data[two].category == "mn" then +-- local cgf = combined[one] +-- if not cgf then +-- cgf = { [two] = unicode } +-- combined[one] = cgf +-- else +-- cgf[two] = unicode +-- end +-- end +-- local first, second, combination = utfchar(one), utfchar(two), utfchar(unicode) +-- local cgf = graphemes[first] +-- if not cgf then +-- cgf = { [second] = combination } +-- graphemes[first] = cgf +-- else +-- cgf[second] = combination +-- end +-- if v.mathclass or v.mathspec then +-- local mps = mathpairs[two] +-- if not mps then +-- mps = { [one] = unicode } +-- mathpairs[two] = mps +-- else +-- mps[one] = unicode -- here unicode +-- end +-- local mps = mathpairs[second] +-- if not mps then +-- mps = { [first] = combination } +-- mathpairs[second] = mps +-- else +-- mps[first] = combination +-- end +-- end +-- -- elseif vc == "compat" then +-- -- else +-- -- local description = v.description +-- -- if find(description,"LIGATURE") then +-- -- if vs then +-- -- local t = { } +-- -- for i=2,#vs do +-- -- t[#t+1] = utfchar(vs[i]) +-- -- end +-- -- decomposed[utfchar(unicode)] = concat(t) +-- -- else +-- -- local vs = v.shcode +-- -- if vs then +-- -- local t = { } +-- -- for i=1,#vs do +-- -- t[i] = utfchar(vs[i]) +-- -- end +-- -- decomposed[utfchar(unicode)] = concat(t) +-- -- end +-- -- end +-- -- end +-- end +-- end +-- end +-- initialize = false +-- characters.initialize = function() end -- when used outside tex +-- end + +local function initialize() local data = characters.data - for unicode, v in next, data do - -- using vs and first testing for length is faster (.02->.01 s) + local function backtrack(v,last,target) local vs = v.specials - local vc = vs and #vs == 3 and vs[1] - if vc == "char" then + if vs and #vs == 3 and vs[1] == "char" then local one, two = vs[2], vs[3] - if data[two].category == "mn" then - local cgf = combined[one] + local first, second = utfchar(one), utfchar(two) .. last + collapsed[first..second] = target + backtrack(data[one],second,target) + end + end + for unicode, v in next, data do + local vs = v.specials + if vs and #vs == 3 then + if vs[1] == "char" then + -- + local one, two = vs[2], vs[3] + local first, second, combination = utfchar(one), utfchar(two), utfchar(unicode) + -- + collapsed[first..second] = combination + backtrack(data[one],second,combination) + -- sort of obsolete: + local cgf = graphemes[first] if not cgf then - cgf = { [two] = unicode } - combined[one] = cgf - else - cgf[two] = unicode - end - end - local first, second, combination = utfchar(one), utfchar(two), utfchar(unicode) - local cgf = graphemes[first] - if not cgf then - cgf = { [second] = combination } - graphemes[first] = cgf - else - cgf[second] = combination - end - if v.mathclass or v.mathspec then - local mps = mathpairs[two] - if not mps then - mps = { [one] = unicode } - mathpairs[two] = mps + cgf = { [second] = combination } + graphemes[first] = cgf else - mps[one] = unicode -- here unicode + cgf[second] = combination end - local mps = mathpairs[second] - if not mps then - mps = { [first] = combination } - mathpairs[second] = mps - else - mps[first] = combination + -- + if v.mathclass or v.mathspec then + local mps = mathpairs[two] + if not mps then + mps = { [one] = unicode } + mathpairs[two] = mps + else + mps[one] = unicode -- here unicode + end + local mps = mathpairs[second] + if not mps then + mps = { [first] = combination } + mathpairs[second] = mps + else + mps[first] = combination + end end + -- end - -- elseif vc == "compat" then - -- else - -- local description = v.description - -- if find(description,"LIGATURE") then - -- if vs then - -- local t = { } - -- for i=2,#vs do - -- t[#t+1] = utfchar(vs[i]) - -- end - -- decomposed[utfchar(unicode)] = concat(t) - -- else - -- local vs = v.shcode - -- if vs then - -- local t = { } - -- for i=1,#vs do - -- t[i] = utfchar(vs[i]) - -- end - -- decomposed[utfchar(unicode)] = concat(t) - -- end - -- end - -- end end end initialize = false - characters.initialize = function() end -- when used outside tex + characters.initialize = function() end end characters.initialize = initialize --- utffilters.addgrapheme(utfchar(318),'l','\string~') --- utffilters.addgrapheme('c','a','b') - -function utffilters.addgrapheme(result,first,second) -- can be U+ 0x string or utf or number - local result = charfromnumber(result) - local first = charfromnumber(first) - local second = charfromnumber(second) - if not graphemes[first] then - graphemes[first] = { [second] = result } - else - graphemes[first][second] = result - end -end - --[[ldx-- <p>In order to deal with 8-bit output, we need to find a way to go from <l n='utf'/> to 8-bit. This is handled in the <l n='luatex'/> engine itself.</p> @@ -252,109 +297,130 @@ not collecting tokens is not only faster but also saves garbage collecting. local skippable = table.tohash { "mkiv", "mkvi" } local filesuffix = file.suffix -function utffilters.collapse(str,filename) -- we can make high a seperate pass (never needed with collapse) - if skippable[filesuffix(filename)] then - return str - -- elseif find(filename,"^virtual://") then - -- return str - -- else - -- -- print("\n"..filename) - end - if str and str ~= "" then - local nstr = #str - if nstr > 1 then - if initialize then -- saves a call - initialize() - end - local tokens, t, first, done, n = { }, 0, false, false, 0 - for second in utfcharacters(str) do - if done then - if first then - if second == " " then - t = t + 1 - tokens[t] = first - first = second - else - -- local crs = high[second] - -- if crs then - -- t = t + 1 - -- tokens[t] = first - -- first = crs - -- else - local cgf = graphemes[first] - if cgf and cgf[second] then - first = cgf[second] - else - t = t + 1 - tokens[t] = first - first = second - end - -- end - end - elseif second == " " then - first = second - else - -- local crs = high[second] - -- if crs then - -- first = crs - -- else - first = second - -- end - end - elseif second == " " then - first = nil - n = n + 1 - else - -- local crs = high[second] - -- if crs then - -- for s in utfcharacters(str) do - -- if n == 1 then - -- break - -- else - -- t = t + 1 - -- tokens[t] = s - -- n = n - 1 - -- end - -- end - -- if first then - -- t = t + 1 - -- tokens[t] = first - -- end - -- first = crs - -- done = true - -- else - local cgf = graphemes[first] - if cgf and cgf[second] then - for s in utfcharacters(str) do - if n == 1 then - break - else - t = t + 1 - tokens[t] = s - n = n - 1 - end - end - first = cgf[second] - done = true - else - first = second - n = n + 1 - end - -- end - end - end - if done then - if first then - t = t + 1 - tokens[t] = first - end - return concat(tokens) -- seldom called - end - elseif nstr > 0 then - return high[str] or str +-- function utffilters.collapse(str,filename) -- we can make high a seperate pass (never needed with collapse) +-- if skippable[filesuffix(filename)] then +-- return str +-- -- elseif find(filename,"^virtual://") then +-- -- return str +-- -- else +-- -- -- print("\n"..filename) +-- end +-- if str and str ~= "" then +-- local nstr = #str +-- if nstr > 1 then +-- if initialize then -- saves a call +-- initialize() +-- end +-- local tokens, t, first, done, n = { }, 0, false, false, 0 +-- for second in utfcharacters(str) do +-- if done then +-- if first then +-- if second == " " then +-- t = t + 1 +-- tokens[t] = first +-- first = second +-- else +-- -- local crs = high[second] +-- -- if crs then +-- -- t = t + 1 +-- -- tokens[t] = first +-- -- first = crs +-- -- else +-- local cgf = graphemes[first] +-- if cgf and cgf[second] then +-- first = cgf[second] +-- else +-- t = t + 1 +-- tokens[t] = first +-- first = second +-- end +-- -- end +-- end +-- elseif second == " " then +-- first = second +-- else +-- -- local crs = high[second] +-- -- if crs then +-- -- first = crs +-- -- else +-- first = second +-- -- end +-- end +-- elseif second == " " then +-- first = nil +-- n = n + 1 +-- else +-- -- local crs = high[second] +-- -- if crs then +-- -- for s in utfcharacters(str) do +-- -- if n == 1 then +-- -- break +-- -- else +-- -- t = t + 1 +-- -- tokens[t] = s +-- -- n = n - 1 +-- -- end +-- -- end +-- -- if first then +-- -- t = t + 1 +-- -- tokens[t] = first +-- -- end +-- -- first = crs +-- -- done = true +-- -- else +-- local cgf = graphemes[first] +-- if cgf and cgf[second] then +-- for s in utfcharacters(str) do +-- if n == 1 then +-- break +-- else +-- t = t + 1 +-- tokens[t] = s +-- n = n - 1 +-- end +-- end +-- first = cgf[second] +-- done = true +-- else +-- first = second +-- n = n + 1 +-- end +-- -- end +-- end +-- end +-- if done then +-- if first then +-- t = t + 1 +-- tokens[t] = first +-- end +-- return concat(tokens) -- seldom called +-- end +-- elseif nstr > 0 then +-- return high[str] or str -- thsi will go from here +-- end +-- end +-- return str +-- end + +-- this is about twice as fast + +local p_collapse = nil -- so we can reset if needed + +function utffilters.collapse(str,filename) + if not p_collapse then + if initialize then + initialize() end + local tree = lpeg.utfchartabletopattern(table.keys(collapsed)) + p_collapse = lpeg.Cs((tree/collapsed + lpegpatterns.utf8char)^0) + end + if not str or #str == "" or #str == 1 then + return str + elseif filename and skippable[filesuffix(filename)] then -- we could hash the collapsables or do a quicker test + return str + else + return lpegmatch(p_collapse,str) or str end - return str end -- function utffilters.decompose(str) @@ -399,17 +465,86 @@ end -- return str -- end -local tree = lpeg.utfchartabletopattern(table.keys(decomposed)) -local finder = lpeg.finder(tree,false,true) -local replacer = lpeg.replacer(tree,decomposed,false,true) +-- local replacer = nil +-- local finder = nil +-- +-- function utffilters.decompose(str) -- 3 to 4 times faster than the above +-- if not replacer then +-- if initialize then +-- initialize() +-- end +-- local tree = lpeg.utfchartabletopattern(table.keys(decomposed)) +-- finder = lpeg.finder(tree,false,true) +-- replacer = lpeg.replacer(tree,decomposed,false,true) +-- end +-- if str and str ~= "" and #str > 1 and lpegmatch(finder,str) then +-- return lpegmatch(replacer,str) +-- end +-- return str +-- end + +local p_decompose = nil function utffilters.decompose(str) -- 3 to 4 times faster than the above - if str and str ~= "" and #str > 1 and lpegmatch(finder,str) then - return lpegmatch(replacer,str) + if not p_decompose then + if initialize then + initialize() + end + local tree = lpeg.utfchartabletopattern(table.keys(decomposed)) + p_decompose = lpeg.Cs((tree/decomposed + lpegpatterns.utf8char)^0) + + end + if str and str ~= "" and #str > 1 then + return lpegmatch(p_decompose,str) end return str end +-- utffilters.addgrapheme(utfchar(318),'l','\string~') +-- utffilters.addgrapheme('c','a','b') + +function utffilters.addgrapheme(result,first,second) -- can be U+ 0x string or utf or number + local result = charfromnumber(result) + local first = charfromnumber(first) + local second = charfromnumber(second) + if not graphemes[first] then + graphemes[first] = { [second] = result } + else + graphemes[first][second] = result + end + local pair = first .. second + if not composed[pair] then + composed[pair] = result + p_composed = nil + end +end + +-- -- + +-- local c1, c2, c3 = "a", "̂", "̃" +-- local r2, r3 = "â", "ẫ" +-- local l1 = "ffl" +-- +-- local str = c1..c2..c3 .. " " .. c1..c2 .. " " .. l1 +-- local res = r3 .. " " .. r2 .. " " .. "ffl" +-- +-- local text = io.loaddata("t:/sources/tufte.tex") +-- +-- local function test(n) +-- local data = text .. string.rep(str,100) .. text +-- local okay = text .. string.rep(res,100) .. text +-- local t = os.clock() +-- for i=1,10000 do +-- collapse(data) +-- end +-- print(os.clock()-t,decompose(collapse(data))==okay,decompose(collapse(str))) +-- end +-- +-- test(050) +-- test(150) + +-- -- + local sequencers = utilities.sequencers if sequencers then diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv index 512dbb282..63fe35cd1 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{2014.06.06 23:52} +\newcontextversion{2014.06.11 15:52} %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 6bf00b133..7ffefbcfc 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 1290a7d92..8a91ce755 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{2014.06.06 23:52} +\edef\contextversion{2014.06.11 15:52} \edef\contextkind {beta} %D For those who want to use this: diff --git a/tex/context/base/file-lib.lua b/tex/context/base/file-lib.lua index 3311321c5..409559cd3 100644 --- a/tex/context/base/file-lib.lua +++ b/tex/context/base/file-lib.lua @@ -25,7 +25,46 @@ local function defaultfailure(name) report_files("asked name %a, not found",name) end -function commands.uselibrary(specification) -- todo; reporter +-- function commands.uselibrary(specification) -- todo; reporter +-- local name = specification.name +-- if name and name ~= "" then +-- local patterns = specification.patterns or defaultpatterns +-- local action = specification.action or defaultaction +-- local failure = specification.failure or defaultfailure +-- local onlyonce = specification.onlyonce +-- local files = utilities.parsers.settings_to_array(name) +-- local truename = environment.truefilename +-- local done = false +-- for i=1,#files do +-- local filename = files[i] +-- if not loaded[filename] then +-- if onlyonce then +-- loaded[filename] = true -- todo: base this on return value +-- end +-- for i=1,#patterns do +-- local somename = format(patterns[i],filename) +-- if truename then +-- somename = truename(somename) +-- end +-- local foundname = resolvers.getreadfilename("any",".",somename) or "" +-- if foundname ~= "" then +-- action(name,foundname) +-- done = true +-- break +-- end +-- end +-- if done then +-- break +-- end +-- end +-- end +-- if failure and not done then +-- failure(name) +-- end +-- end +-- end + +function commands.uselibrary(specification) -- todo: reporter local name = specification.name if name and name ~= "" then local patterns = specification.patterns or defaultpatterns @@ -34,13 +73,15 @@ function commands.uselibrary(specification) -- todo; reporter local onlyonce = specification.onlyonce local files = utilities.parsers.settings_to_array(name) local truename = environment.truefilename - local done = false for i=1,#files do local filename = files[i] - if not loaded[filename] then + if loaded[filename] then + -- next one + else if onlyonce then loaded[filename] = true -- todo: base this on return value end + local done = false for i=1,#patterns do local somename = format(patterns[i],filename) if truename then @@ -53,13 +94,10 @@ function commands.uselibrary(specification) -- todo; reporter break end end - if done then - break + if failure and not done then + failure(name) end end end - if failure and not done then - failure(name) - end end end diff --git a/tex/context/base/file-mod.lua b/tex/context/base/file-mod.lua index 2f34d9dd2..39274ceef 100644 --- a/tex/context/base/file-mod.lua +++ b/tex/context/base/file-mod.lua @@ -35,8 +35,25 @@ local iterator = utilities.parsers.iterator -- modules can have a specific suffix or can specify one -local prefixes = { "m", "p", "s", "x", "v", "t" } -local suffixes = { "mkvi", "mkiv", "tex", "cld", "lua" } -- order might change and how about cld +local prefixes = { + "m", -- module, extends functionality + "p", -- private code + "s", -- styles + "x", -- xml specific modules + -- "v", -- an old internal one for examples + "t", -- third party extensions +} + +-- the order might change and how about cld + +local suffixes = { + "mkvi", -- proprocessed mkiv files + "mkiv", -- mkiv files + "tex", -- normally source code files + "cld", -- context lua documents (often stand alone) + "lua", -- lua files +} + local modstatus = { } local function usemodule(name,hasscheme) @@ -118,6 +135,10 @@ function commands.usemodules(prefix,askedname,truename) end if status then -- ok, don't change + elseif find(truename,"%-") and usemodule(truename) then + -- assume a user namespace + report_modules("using user prefixed file %a",truename) + status = 1 elseif not permit_unprefixed then -- forget about it elseif usemodule(truename) then diff --git a/tex/context/base/hand-ini.mkiv b/tex/context/base/hand-ini.mkiv index 450794d27..16c8b0746 100644 --- a/tex/context/base/hand-ini.mkiv +++ b/tex/context/base/hand-ini.mkiv @@ -51,10 +51,10 @@ \let\pdfadjustspacing\relax \newcount\pdfadjustspacing % a little bit protection \let\pdfprotrudechars\relax \newcount\pdfprotrudechars % a little bit protection -\def\font_expansion_enable {\normalpdfadjustspacing\plustwo } -\def\font_expansion_disable {\normalpdfadjustspacing\zerocount} -\def\font_protruding_enable {\normalpdfprotrudechars\plustwo } -\def\font_protruding_disable{\normalpdfprotrudechars\zerocount} +\def\font_expansion_enable {\normalpdfadjustspacing\plustwo } % these will become normal primitives +\def\font_expansion_disable {\normalpdfadjustspacing\zerocount} % these will become normal primitives +\def\font_protruding_enable {\normalpdfprotrudechars\plustwo } % these will become normal primitives +\def\font_protruding_disable{\normalpdfprotrudechars\zerocount} % these will become normal primitives \appendtoks \font_expansion_disable \to \everyforgetall % Here or not here? \appendtoks \font_protruding_disable \to \everyforgetall % Here or not here? diff --git a/tex/context/base/lpdf-col.lua b/tex/context/base/lpdf-col.lua index 9e483f9b5..924414d40 100644 --- a/tex/context/base/lpdf-col.lua +++ b/tex/context/base/lpdf-col.lua @@ -553,7 +553,7 @@ function lpdf.colorspec(model,ca,default) end function lpdf.pdfcolor(attribute) -- bonus, for pgf and friends - context(lpdfcolor(1,attribute)) + return lpdfcolor(1,attribute) end function lpdf.transparency(ct,default) -- kind of overlaps with transparencycode diff --git a/tex/context/base/lpdf-ini.lua b/tex/context/base/lpdf-ini.lua index eee5e2280..e8bd82cb9 100644 --- a/tex/context/base/lpdf-ini.lua +++ b/tex/context/base/lpdf-ini.lua @@ -56,9 +56,9 @@ local pdf = pdf local factor = number.dimenfactors.bp if pdf.setinfo then --- table.setmetatablenewindex(pdf,function(t,k,v) --- report_blocked("'pdf.%s' is not supported",k) --- end) + -- table.setmetatablenewindex(pdf,function(t,k,v) + -- report_blocked("'pdf.%s' is not supported",k) + -- end) -- the getters are harmless end @@ -103,15 +103,27 @@ local pdfimmediateobject = pdf.immediateobj local pdfdeferredobject = pdf.obj local pdfreferenceobject = pdf.refobj -function pdf.setinfo () report_blocked("'pdf.%s' is not supported","setinfo") end -- use lpdf.addtoinfo etc -function pdf.setcatalog () report_blocked("'pdf.%s' is not supported","setcatalog") end -function pdf.setnames () report_blocked("'pdf.%s' is not supported","setnames") end -function pdf.settrailer () report_blocked("'pdf.%s' is not supported","settrailer") end -function pdf.setpageresources () report_blocked("'pdf.%s' is not supported","setpageresources") end -function pdf.setpageattributes () report_blocked("'pdf.%s' is not supported","setpageattributes") end -function pdf.setpagesattributes() report_blocked("'pdf.%s' is not supported","setpagesattributes") end +-- function pdf.setinfo () report_blocked("'pdf.%s' is not supported","setinfo") end -- use lpdf.addtoinfo etc +-- function pdf.setcatalog () report_blocked("'pdf.%s' is not supported","setcatalog") end +-- function pdf.setnames () report_blocked("'pdf.%s' is not supported","setnames") end +-- function pdf.settrailer () report_blocked("'pdf.%s' is not supported","settrailer") end +-- function pdf.setpageresources () report_blocked("'pdf.%s' is not supported","setpageresources") end +-- function pdf.setpageattributes () report_blocked("'pdf.%s' is not supported","setpageattributes") end +-- function pdf.setpagesattributes() report_blocked("'pdf.%s' is not supported","setpagesattributes") end +-- function pdf.registerannot () report_blocked("'pdf.%s' is not supported","registerannot") end + +local function pdfdisablecommand(command) + pdf[command] = function() report_blocked("'pdf.%s' is not supported",command) end +end -function pdf.registerannot() report_blocked("'pdf.%s' is not supported","registerannot") end +pdfdisablecommand("setinfo") +pdfdisablecommand("setcatalog") +pdfdisablecommand("setnames") +pdfdisablecommand("settrailer") +pdfdisablecommand("setpageresources") +pdfdisablecommand("setpageattributes") +pdfdisablecommand("setpagesattributes") +pdfdisablecommand("registerannot") local trace_finalizers = false trackers.register("backend.finalizers", function(v) trace_finalizers = v end) local trace_resources = false trackers.register("backend.resources", function(v) trace_resources = v end) @@ -784,13 +796,50 @@ local catalog = pdfdictionary { Type = pdfconstant("Catalog") } -- nicer, but wh local info = pdfdictionary { Type = pdfconstant("Info") } -- nicer, but when we assign we nil the Type ----- names = pdfdictionary { Type = pdfconstant("Names") } -- nicer, but when we assign we nil the Type -local function flushcatalog() if not environment.initex then trace_flush("catalog") catalog.Type = nil pdfsetcatalog(catalog()) end end -local function flushinfo () if not environment.initex then trace_flush("info") info .Type = nil pdfsetinfo (info ()) end end --------------- flushnames () if not environment.initex then trace_flush("names") names .Type = nil pdfsetnames (names ()) end end +local function flushcatalog() + if not environment.initex then + trace_flush("catalog") + catalog.Type = nil + pdfsetcatalog(catalog()) + end +end + +local function flushinfo() + if not environment.initex then + trace_flush("info") + info.Type = nil + pdfsetinfo(info()) + end +end -function lpdf.addtocatalog(k,v) if not (lpdf.protectresources and catalog[k]) then trace_set("catalog",k) catalog[k] = v end end -function lpdf.addtoinfo (k,v) if not (lpdf.protectresources and info [k]) then trace_set("info", k) info [k] = v end end --------- lpdf.addtonames (k,v) if not (lpdf.protectresources and names [k]) then trace_set("names", k) names [k] = v end end +-- local function flushnames() +-- if not environment.initex then +-- trace_flush("names") +-- names.Type = nil +-- pdfsetnames(names()) +-- end +-- end + +function lpdf.addtocatalog(k,v) + if not (lpdf.protectresources and catalog[k]) then + trace_set("catalog",k) + catalog[k] = v + end +end + +function lpdf.addtoinfo(k,v) + if not (lpdf.protectresources and info[k]) then + trace_set("info",k) + info[k] = v + end +end + +-- local function lpdf.addtonames(k,v) +-- if not (lpdf.protectresources and names[k]) then +-- trace_set("names",k) +-- names[k] = v +-- end +-- end local names = pdfdictionary { -- Type = pdfconstant("Names") @@ -944,10 +993,11 @@ function lpdf.limited(n,min,max,default) end end --- lpdf.addtoinfo("ConTeXt.Version", tex.contextversiontoks) +-- lpdf.addtoinfo("ConTeXt.Version", environment.version) -- lpdf.addtoinfo("ConTeXt.Time", os.date("%Y.%m.%d %H:%M")) -- :%S -- lpdf.addtoinfo("ConTeXt.Jobname", environment.jobname) -- lpdf.addtoinfo("ConTeXt.Url", "www.pragma-ade.com") +-- lpdf.addtoinfo("ConTeXt.Support", "contextgarden.net") -- if not pdfreferenceobject then -- diff --git a/tex/context/base/meta-ini.mkiv b/tex/context/base/meta-ini.mkiv index 555deca2c..ff7012caf 100644 --- a/tex/context/base/meta-ini.mkiv +++ b/tex/context/base/meta-ini.mkiv @@ -403,18 +403,9 @@ {\begingroup \edef\width {#2\space}\let\overlaywidth \width \edef\height{#3\space}\let\overlayheight\height - \ifcsname\??mpclip#1\endcsname - \meta_start_current_graphic - \xdef\MPclippath{\normalexpanded{\noexpand\ctxlua{metapost.theclippath { - instance = "\currentMPinstance", - format = "\currentMPformat", - data = \!!bs\getvalue{\??mpclip#1}\!!es, - initializations = \!!bs\meta_flush_current_initializations\!!es, - useextensions = "\MPinstanceparameter\s!extensions", - inclusions = \!!bs\meta_flush_current_inclusions\!!es, - method = "\MPinstanceparameter\c!method", - }}}}% - \meta_stop_current_graphic + \edef\currentMPclip{#1}% + \ifcsname\??mpclip\currentMPclip\endcsname + \meta_grab_clip_path_indeed \ifx\MPclippath\empty \xdef\MPclippath{#4}% \fi @@ -423,6 +414,19 @@ \fi \endgroup} +\def\meta_grab_clip_path_indeed + {\meta_start_current_graphic + \xdef\MPclippath{\normalexpanded{\noexpand\ctxlua{metapost.theclippath { + instance = "\currentMPinstance", + format = "\currentMPformat", + data = \!!bs\csname\??mpclip\currentMPclip\endcsname\!!es, + initializations = \!!bs\meta_flush_current_initializations\!!es, + useextensions = "\MPinstanceparameter\s!extensions", + inclusions = \!!bs\meta_flush_current_inclusions\!!es, + method = "\MPinstanceparameter\c!method", + }}}}% + \meta_stop_current_graphic} + %D Since we want lables to follow the document settings, we %D also set the font related variables. diff --git a/tex/context/base/page-txt.mkvi b/tex/context/base/page-txt.mkvi index 6d8d50028..c38b2fd4c 100644 --- a/tex/context/base/page-txt.mkvi +++ b/tex/context/base/page-txt.mkvi @@ -142,11 +142,11 @@ %D \showsetup{noheaderandfooterlines} %D \showsetup{notopandbottomlines} -\def\noheaderandfooterlines +\unexpanded\def\noheaderandfooterlines {\setuplayoutelement[\v!header][\c!state=\v!empty]% \setuplayoutelement[\v!footer][\c!state=\v!empty]} -\def\notopandbottomlines +\unexpanded\def\notopandbottomlines {\setuplayoutelement[\v!top ][\c!state=\v!empty]% \setuplayoutelement[\v!bottom][\c!state=\v!empty]} @@ -418,7 +418,7 @@ %D The following macro has to be called after a page %D is flushed. -\def\resetlayouttextlines % public +\unexpanded\def\resetlayouttextlines % public {\csname\??layouttextsreset\v!top \endcsname \csname\??layouttextsreset\v!header\endcsname \csname\??layouttextsreset\v!text \endcsname @@ -435,7 +435,7 @@ % \settext[header][text][middle][xxx][yyy] -\def\settextcontent +\unexpanded\def\settextcontent {\doquintupleempty\page_layouts_set_text_content} \def\page_layouts_set_text_content[#vertical][#horizontal][#one][#two][#three]% header text middle text/text @@ -456,7 +456,7 @@ \c!rightstyle\c!rightcolor\c!rightwidth{#one}}% \fi\fi\fi} -\def\resettextcontent +\unexpanded\def\resettextcontent {\dotripleempty\page_layouts_reset_text_content} \def\page_layouts_reset_text_content[#vertical][#horizontal][#tag]% header text middle diff --git a/tex/context/base/publ-imp-apa.bib b/tex/context/base/publ-imp-apa.bib deleted file mode 100644 index fe56719f8..000000000 --- a/tex/context/base/publ-imp-apa.bib +++ /dev/null @@ -1,29 +0,0 @@ -% The fields. - -@article {apa-article, - author = "...", - comment = "...", - crossref = "...", - editor = "...", - issue = "...", - journal = "...", - note = "...", - pages = "...", - title = "...", - volume = "...", - year = "...", -} - -@book {apa-book, - author = "...", - comment = "...", - chapter = "...", - crossref = "...", - editor = "...", - series = "...", - pages = "...", - publisher = "...", - volume = "...", - year = "...", -} - diff --git a/tex/context/base/publ-imp-apa.mkvi b/tex/context/base/publ-imp-apa.mkvi index 4d4edfc52..c17fa097e 100644 --- a/tex/context/base/publ-imp-apa.mkvi +++ b/tex/context/base/publ-imp-apa.mkvi @@ -21,6 +21,72 @@ \startbtxrenderingdefinitions[apa] +%D Because we want to mix rendering (in the manual) we need a namespace in label +%D texts: + +\setupbtxlabeltext + [en] + [apa:mastersthesis={Master's thesis}, + apa:phdthesis={PhD thesis}, + apa:technicalreport={Technical report}, + apa:editor=editor, + apa:editors=editors, + apa:edition=edition, + apa:volume=volume, + apa:Volume=Volume, + apa:number=number, + apa:Number=Number, + apa:in=in, + apa:of=of, + apa:In=In, + apa:p=p, + apa:pp=pp, + apa:pages=pages, + apa:and=and, + apa:others={et al.}] + +\setupbtxlabeltext + [fr] + [apa:mastersthesis={Thèse de master (DEA, DESS, master)}, + apa:phdthesis={Thèse de doctorat}, + apa:technicalreport={Rapport technique}, + apa:editor=éditeur, + apa:editors=éditeurs, + apa:edition=édition, + apa:volume=volume, + apa:Volume=Volume, + apa:number=numéro, + apa:Number=Numéro, + apa:in=dans, + apa:of=de, + apa:In=Dans, + apa:p=p, + apa:pp=pp, + apa:pages=pages, + apa:and=et, + apa:others={et al.}] + +\setupbtxlabeltext + [de] + [apa:mastersthesis={Masterarbeit}, + apa:phdthesis={Dissertation}, + apa:technicalreport={Technischer Bericht}, + apa:editor=Herausgeber, + apa:editors=Herausgeber, + apa:edition=Auflage, + apa:volume=Band, + apa:Volume=Band, + apa:number=Numer, + apa:Number=Numer, + apa:in=in, + apa:of=von, + apa:In=In, + apa:p=S, + apa:pp=S, + apa:pages=Seiten, + apa:and=und, + apa:others={et al.}] + %D The variables control the shared code for which we use a tex definition with %D one argument, specifying the field name. @@ -159,9 +225,9 @@ \btxflushauthor{editor} \btxcomma \btxsingularplural {editor} { - \btxlabeltext{editor} + \btxlabeltext{apa:editor} } { - \btxlabeltext{editors} + \btxlabeltext{apa:editors} } } { % weird period @@ -187,9 +253,9 @@ \btxflushauthor{editor} \btxcomma \btxsingularplural {editor} { - \btxlabeltext{editor} + \btxlabeltext{apa:editor} } { - \btxlabeltext{editors} + \btxlabeltext{apa:editors} } } { \btxdoif {key} { @@ -228,7 +294,7 @@ \btxspace \btxflush{pages} \btxspace - \btxlabeltext{p} + \btxlabeltext{apa:p} \btxperiod } \stoptexdefinition @@ -238,7 +304,7 @@ \btxspace \btxflush{pages} \btxspace - \btxlabeltext{pp} + \btxlabeltext{apa:pp} \btxperiod } \stoptexdefinition @@ -246,7 +312,7 @@ \starttexdefinition btx:apa:pages:pages \btxdoif {pages} { \btxcomma - \btxlabeltext{pages} + \btxlabeltext{apa:pages} \btxnbsp \btxflush{pages} } @@ -257,7 +323,7 @@ \btxspace \btxflush{edition} \btxspace - \btxlabeltext{edition} + \btxlabeltext{apa:edition} \btxperiod } \stoptexdefinition @@ -269,7 +335,7 @@ % \btxspace % \btxflush{edition} % \btxspace -% \btxlabeltext{edition} +% \btxlabeltext{apa:edition} % } % \stoptexdefinition @@ -285,12 +351,13 @@ \texdefinition{btx:apa:italic}{journal} } { \btxdoif {crossref} { - \btxlabeltext{In} + \btxlabeltext{apa:In} \btxspace \btxflush{crossref} } } \btxdoifelse {volume} { + \btxspace \texdefinition{btx:apa:italic}{volume} \btxdoif {issue} { \btxlparent @@ -316,19 +383,19 @@ \doifmodeelse {btx:apa:edited-book} { \btxdoifelse {volume} { \btxspace - \btxlabeltext{Number} + \btxlabeltext{apa:Number} \btxnbsp \btxflush{volume} \btxdoifelse {series} { \btxspace - \btxlabeltext{in} + \btxlabeltext{apa:in} \btxnbsp \btxflush{series} \btxperiod } { \btxdoifelse {crossref} { \btxspace - \btxlabeltext{in} + \btxlabeltext{apa:in} \btxlbracket \btxsetup{btx:format:crossref} \btxrbracket @@ -352,22 +419,22 @@ \texdefinition{btx:apa:pages:pages} \btxperiod \btxdoif {volume} { - \btxlabeltext{Volume} + \btxlabeltext{apa:Volume} \btxnbsp \btxflush{volume} \btxspace - \btxlabeltext{of} + \btxlabeltext{apa:of} \btxnbsp } } { \btxdoif {volume} { \btxcomma - \btxlabeltext{volume} + \btxlabeltext{apa:volume} \btxnbsp \btxflush{volume} \btxdoif {series} { \btxspace - \btxlabeltext{of} + \btxlabeltext{apa:of} \btxnbsp \texdefinition{btx:apa:italic}{series} } @@ -395,19 +462,19 @@ \doifmodeelse {btx:apa:edited-book} { \btxdoifelse {volume} { \btxspace - \btxlabeltext{number} + \btxlabeltext{apa:number} \btxnbsp \btxflush{volume} \btxdoifelse {series} { \btxspace - \btxlabeltext{in} + \btxlabeltext{apa:in} \btxnbsp \btxflush{series} \btxperiod } { \btxdoifelse {crossref} { \btxspace - \btxlabeltext{in} + \btxlabeltext{apa:in} \btxlbracket \btxsetup{btx:format:crossref} \btxrbracket @@ -430,11 +497,11 @@ } \texdefinition{btx:apa:pages:pages} \btxdoif {volume} { - \btxlabeltext{Volume} + \btxlabeltext{apa:Volume} \btxnbsp \btxflush{volume} \btxspace - \btxlabeltext{of} + \btxlabeltext{apa:of} \btxnbsp } \btxdoif {crossref} { @@ -445,12 +512,12 @@ } { \btxdoif {volume} { \btxcomma - \btxlabeltext{volume} + \btxlabeltext{apa:volume} \btxnbsp \btxflush{volume} \btxdoif {series} { \btxspace - \btxlabeltext{of} + \btxlabeltext{apa:of} \btxnbsp \texdefinition{btx:apa:italic}{series} } @@ -490,36 +557,48 @@ \startsetups btx:apa:incollection \texdefinition{btx:apa:author-and-year} - \btxdoif {arttitle} { - \btxflush{arttitle}\btxperiod + \btxdoifelse {arttitle} { + \btxflush{arttitle} + \btxperiod + } { + \btxdoif {title} { + \btxflush{title} + \btxperiod + } } - \btxlabeltext{In}\btxspace - \btxdoifelse {title} { - \btxflushauthor{editor} - \btxcomma - \texdefinition{btx:apa:italic}{title} + \btxlabeltext{apa:In} + \btxspace + \btxdoifelse {booktitle} { + \btxdoif {editor} { + \btxflushauthor{editor} + \btxcomma + } + \texdefinition{btx:apa:italic}{booktitle} \btxdoif {series} { \btxdoif {volume} { - \btxcomma - \btxlabeltext{number} + \btxspace + \btxlabeltext{apa:number} \btxspace \btxflush{volume} \btxspace - \btxlabeltext{in} + \btxlabeltext{apa:in} } + \btxspace \btxspace\btxflush{series} + \btxcomma } \btxdoif {chapter} { - \btxcomma - \btxflush{chapter} \btxspace + \btxflush{chapter} } + \btxspace \texdefinition{btx:apa:pages:pages} \btxdoif {edition} { \btxspace \btxflush{edition} \btxspace - \btxlabeltext{edition} + \btxlabeltext{apa:edition} + \btxspace } \texdefinition{btx:apa:wherefrom}{publisher} } { @@ -544,15 +623,16 @@ \btxflush{arttitle} \btxperiod } - \btxlabeltext{In}\btxspace + \btxlabeltext{apa:In} + \btxspace \btxdoifelse {title} { \btxdoif {editor} { \btxflush{btx:apa:format:editors} \btxcomma \btxsingularplural {editor} { - \btxlabeltext{editor} + \btxlabeltext{apa:editor} } { - \btxlabeltext{editors} + \btxlabeltext{apa:editors} } \btxcomma } @@ -560,10 +640,12 @@ \btxdoif {series} { \btxdoif {volume} { \btxcomma - \btxlabeltext{number}\btxspace\btxflush{crossref} + \btxlabeltext{apa:number} + \btxspace + \btxflush{crossref} \btxflush{volume} \btxspace - \btxlabeltext{in} + \btxlabeltext{apa:in} } \btxspace \btxflush{series} @@ -599,11 +681,11 @@ \texdefinition{btx:apa:italic}{title} \btxdoif {volume} { \btxcomma - \btxlabeltext{number} + \btxlabeltext{apa:number} \btxspace \btxflush{volume} \btxspace - \btxlabeltext{in} + \btxlabeltext{apa:in} \btxspace } \btxdoif {chapter} { @@ -624,7 +706,7 @@ \btxdoifelse {type} { \btxflush{type} } { - \btxlabeltext{\currentbtxcategory} + \btxlabeltext{apa:\currentbtxcategory} } \texdefinition{btx:apa:wherefrom}{school} \texdefinition{btx:apa:pages:p} @@ -650,8 +732,9 @@ } } { \btxspace - \btxlabeltext{technicalreport} + \btxlabeltext{apa:technicalreport} } + \btxcomma \texdefinition{btx:apa:wherefrom}{institution} \texdefinition{btx:apa:pages:p} \texdefinition{btx:apa:note} diff --git a/tex/context/base/publ-imp-aps.mkvi b/tex/context/base/publ-imp-aps.mkvi new file mode 100644 index 000000000..7af8efead --- /dev/null +++ b/tex/context/base/publ-imp-aps.mkvi @@ -0,0 +1,890 @@ +%D \module +%D [ file=publ-imp-aps, +%D version=2014.05.25, +%D title=APA bibliography style, +%D subtitle=Publications, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA ADE \& \CONTEXT\ Development Team}] +%C +%C This module is part of the \CONTEXT\ macro||package and is therefore copyrighted +%D by \PRAGMA. See mreadme.pdf for details. + +\startbtxrenderingdefinitions[aps] + +\setupbtxlabeltext + [en] + [aps:mastersthesis={Master's thesis}, + aps:phdthesis={PhD thesis}, + aps:technicalreport={Technical report}, + aps:editor=editor, + aps:editors=editors, + aps:edition=edition, + aps:volume=volume, + aps:Volume=Volume, + aps:number=number, + aps:Number=Number, + aps:in=in, + aps:of=of, + aps:In=In, + aps:p=p, + aps:pp=pp, + aps:pages=pages, + aps:and=and, + aps:others={et al.}] + +\setupbtxlabeltext + [fr] + [aps:mastersthesis={Thèse de master (DEA, DESS, master)}, + aps:phdthesis={Thèse de doctorat}, + aps:technicalreport={Rapport technique}, + aps:editor=éditeur, + aps:editors=éditeurs, + aps:edition=édition, + aps:volume=volume, + aps:Volume=Volume, + aps:number=numéro, + aps:Number=Numéro, + aps:in=dans, + aps:of=de, + aps:In=Dans, + aps:p=p, + aps:pp=pp, + aps:pages=pages, + aps:and=et, + aps:others={et al.}] + +\setupbtxlabeltext + [de] + [aps:mastersthesis={Masterarbeit}, + aps:phdthesis={Dissertation}, + aps:technicalreport={Technischer Bericht}, + aps:editor=Herausgeber, + aps:editors=Herausgeber, + aps:edition=Auflage, + aps:volume=Band, + aps:Volume=Band, + aps:number=Numer, + aps:Number=Numer, + aps:in=in, + aps:of=von, + aps:In=In, + aps:p=S, + aps:pp=S, + aps:pages=Seiten, + aps:and=und, + aps:others={et al.}] + +% \c!authoretallimit=4, +% \c!editoretallimit=4, +% \c!artauthoretallimit=4, +% \c!authoretaldisplay=1, +% \c!editoretaldisplay=1, +% \c!artauthoretaldisplay=1, +% \c!authoretaltext={ {\it et al.\/}}, +% \c!editoretaltext={ {\it et al.\/}}, +% \c!artauthoretaltext={ {\it et al.\/}}] + +\setvariables + [btx:aps:publisher] + [left=\btxspace, + right=\btxperiod] + +\setvariables + [btx:aps:organization] + [left=\btxspace, + right=\btxperiod] + +\setvariables + [btx:aps:school] + [left=\btxcomma, + right=\btxperiod, + otherwise=\btxperiod] + +\setvariables + [btx:aps:institution] + [left=\btxcomma, + right=\btxperiod, + otherwise=\btxperiod] + +% \def\insertEdition#1#2#3{% +% \begingroup +% \insertedition{#1}{\doifnumberelse{\csname @@pb@edition\endcsname}{% +% \ifcase \csname @@pb@edition\endcsname \or st\or nd\or rd\else th\fi +% }{}#2}{#3}% +% \endgroup +% } + +\starttexdefinition btx:aps:chapter + \btxdoif {chapter} { + \btxcomma + \btxdoifelse {type} { + \btxflush{type} + \btxspace + } { + \btxlabeltext{aps:chapter} + } + \btxspace + \btxflush{chapter} + } +\stoptexdefinition + +\starttexdefinition btx:aps:publisher + \btxdoif {publisher} { + \btxflush{publisher} + } + \btxdoif {city} { + \btxcomma + \btxflush{city} + } + \btxdoif {country} { + \btxcomma + \btxflush{country} + } + \btxperiod +\stoptexdefinition + +\starttexdefinition btx:aps:pages-p-or-pp + \btxoneorrange {pages} { + \btxlabeltext{aps:p} + } { + \btxlabeltext{aps:pp} + } +\stoptexdefinition + +\starttexdefinition btx:aps:pages + \btxif {pages} { + \btxcomma + \btxoneorrange {pages} { + \btxlabeltext{aps:p} + } { + \btxlabeltext{aps:pp} + } + \btxperiod + \btxnbsp + \btxflush{pages} + } +\stoptexdefinition + +\starttexdefinition btx:aps:italic #field + \begingroup + \it + \btxflush{#field} + \italiccorrection + \endgroup +\stoptexdefinition + +\starttexdefinition btx:aps:bold #field + \begingroup + \bf + \btxflush{#field} + \endgroup +\stoptexdefinition + +\disablemode[btx:aps:edited-book] % hm, ugly + +\starttexdefinition btx:aps:note + \btxdoif {note} { + \btxspace + \btxflush{note} + \btxperiod + } +\stoptexdefinition + +\starttexdefinition btx:aps:comment + \btxdoif {comment} { + \btxspace + \btxflush{comment} + \btxperiod + } +\stoptexdefinition + +\startsetups btx:aps:article + \btxdoif {author} { + \btxflushauthor {author} + \btxspace + \btxdoif {key} { + \btxsetup{btx:format:key} + \btxspace + } + } + \btxdoif {title} { + \btxflush{title} + \btxperiod + } + \btxdoifelse {journal} { + \btxcomma + \btxflush{journal} + } + \btxdoifelse {volume} { + \texdefinition{btx:aps:bold}{volume} + \btxdoif {pages} { + \btxcomma + \btxfirstofrange{pages} + } + } { + \btxdoif {pages} { + \btxspace + \btxfirstofrange{pages} + } + } + \btxdoif {year} { + \btxlparent + \btxflush{year} + \btxrparent + } + \btxperiod + \texdefinition{btx:aps:note} + \texdefinition{btx:aps:comment} +\stopsetups + +\disablemode[btx:apa:edited-book] % hm, ugly + +\startsetups btx:aps:book + \btxdoif {author} { + \btxflushauthor {author} + \btxspace + } { + \btxdoifelse {editor} { + \btxflush{editor} + \btxcomma + \btxsingularorplural {editor} { + \btxlabeltext{aps:editor} + } { + \btxlabeltext{aps:editors} + } + \btxspace + \setmode{btx:apa:edited-book} + } { + \btxdoif {key} { + \btxflush{key} + \btxperiod + } + } + } + \btxdoifelse {title} { + \btxcomma + \texdefinition {btx:apa:italic} { + \doifmode {btx:apa:edited-book} { + \resetmode{editedbook} + \btxdoifelse {volume} { + \btxlabeltext{aps:Number} + \btxnbsp + \btxflush{number} + \btxdoifelse {series} { + \btxlabeltext{aps:in} + \btxnbsp + \btxflush{series} + \btxperiod + } { + \btxdoif {crossref} { + \btxlabeltext{aps:in} + \btxnbsp + \btxflush{crossref} + \btxperiod + } + } + } { + \insertseries{ }{.}{} + } + } { + \btxdoif {crossref} { + \texdefinition {btx:aps:chapter} + \btxdoif {pages} { + \btxcomma + \btxflush{pages} + \texdefinition{btx:aps:pages-p-or-pp} + } + \btxperiod + \btxdoif {volume} { + \btxlabeltext{aps:Volume} + \btxnbsp + \btxflush{volume} + \btxspace + \btxlabeltext{aps:of} + \btxnbsp + }% + \btxflush{crossref} + } { + \btxdoif {volume} { + \btxcomma + \btxlabeltext{aps:volume} + \btxnbsp + \btxflush{volume} + \btxdoif {series} { + \btxspace + \btxlabeltext{aps:of} + \btxnbsp + \texdefinition {btx:aps:italic} { + \btxflush{series} + } + } + \btxif {chapter} { + \btxcomma + \btxflush{chapter} + } + \texdefinition{btx:aps:pages} + \btxperiod + } + } + } + } + } { + \btxspace + } + \btxdoif {year} { + \btxlparent + \texdefinition{btx:aps:publisher} + \btxflush{year} + \btxrparent + \btxdoif {edition} { + \btxcomma + \btxflush{edition} + \btxspace + \btxlabeltext{aps:edition}% ed + } + } + \btxperiod + \texdefinition{btx:aps:note} +\stopsetups + +\startsetups btx:aps:inbook + \btxdoifelse {authors} { + \btxflushauthor {author} + } { + \btxdoifelse {editor} { + \btxflush{editor} + \btxcomma + \btxsingularorplural { + \btxlabeltext{aps:editor} + } { + \btxlabeltext{aps:editors} + } + \setmode{btx:aps:edited-book} + } { + \btxdoif {key} { + \btxsetup{btx:format:key} + \btxperiod + } + } + } + \btxdoif {title} { + \btxcomma + \texdefinition{btx:aps:italic}{title} + \btxdoif {year} { + \btxlparent + \texdefinition{btx:aps:publisher} + \btxflush{year} + \btxrparent + \btxif {edition} { + \btxcomma + \btxflush{edition} + \btxspace + \btxlabeltext{aps:edition} + \btxperiod + } + } + \doifmodeelse {btx:aps:edited-book} { + \resetmode{btx:aps:edited-book} + \btxdoifelse {volume} { + \btxspace + \btxlabeltext{aps:volume}% vol. (todo: add period to abbreviation) + \btxnbsp + \btxflush{volume} + \btxdoifelse {series} { + \btxspace + \btxlabeltext{aps:in} + \btxnbsp + \btxflush{series} + } { + \btxdoifelse {crossref} { + \btxspace + \btxlabeltext{aps:in} + \btxnbsp + \btxflush{crossref} + } + } + \btxperiod + } { + {\insertseries{ }{.}{} }% + } + } { + \btxdoifelse {crossref} { + \btxif {chapter} { + \btxcomma + \btxflush{chapter} + } + \texdefinition{btx:aps:pages} + \btxperiod + \btxdoif {volume} { + \btxlabeltext{aps:Volume} + \btxnbsp + \btxflush{volume} + \btxspace + \btxlabeltext{aps:of} + \btxnbsp + } + % weird: + \btxflush{crossref} + } { + \btxdoif {volume} { + \btxcomma + \btxlabeltext{aps:volume}% vol. + \btxnbsp + \btxflush{volume} + \btxif {series} { + \btxnbsp + \btxlabeltext{aps:of} + \btxnbsp + \texdefinition{btx:aps:italic}{ + \btxflush{series} + } + } + } + \btxdoif {chapter} { + \btxcomma + \btxflush{chapter} + } + \btxdoif {pages} { + \btxcomma + \btxflush{pages} + \texdefinition{btx:aps:pages-p-or-pp} + } + \btxperiod + } + } + } + \texdefinition{btx:aps:note} +\stopsetups + +\startsetups btx:aps:booklet + \btxdoif {author} { + \btxflushauthor {author} + \btxspace + } { + \btxdoif {key} { + \btxsetup{btx:format:key} + \btxperiod + } + } + \btxdoif {title} { + \btxflush{title} + \btxdoif {series} { + \btxlparent + \btxflush{series} + \btxrparent + } + \btxperiod + } + \btxdoif {year} { + \btxlparent + \texdefinition{btx:aps:publisher} + \btxflush{year} + \btxrparent + \btxdoif {edition} { + \btxcomma + % todo: st nd rd th + \btxflush{edition} + \btxspace + \btxlabeltext{aps:edition} + } + \btxperiod + } + \btxdoif {pages} { + \btxflush{pages} + \texdefinition{btx:aps:pages-p-or-pp} + \btxperiod + } + \texdefinition{btx:aps:note} +\stopsetups + +\startsetups btx:aps:manual + \btxif {title} { + \texdefinition {btx:aps:italic} { + \btxflush{title} + } + \btxif {series} { + \btxlparent + \btxflush{series} + \btxrparent + } + \btxperiod + } + \btxdoifelse {year} { + \btxlparent + \btxif {organization} { + \btxflush{organization} + \btxcomma + } + \btxif {city} { + \btxflush{organization} + \btxcomma + } + \btxflush{year} + \btxrparent + % st\or nd\or rd\else th\fi + \btxif {edition} { + \btxcomma + \btxflush{edition} + \btxspace + \btxlabeltext{aps:edition}% ed + } + \btxperiod + } + \btxdoif {pages} { + \btxflush{pages} + \texdefinition{btx:aps:pages-p-or-pp} + \btxperiod + } + \texdefinition{btx:aps:note} +\stopsetups + +\startsetups btx:aps:incollection + \btxdoifelse {author} { + \btxflushauthor {author} + } { + \btxif {key} { + \btxsetup{ntx:format:key} + \btxcomma + } + } + \btxdoifelse {title} { + \btxcomma + \btxlabeltext{aps:in} + \btxspace + \texdefinition{btx:aps:italic} {title} + \btxdoifelse {editor} { + \btxcomma + \btxlabeltext{aps:edited} % edited by + \btxspace + \btxflush{edited} + } { + \btxdoif {series} { + \btxdoifelse {volume} { + \btxcomma + \btxlabeltext{aps:number} + \btxspace + \btxflush{volume} + \btxnbsp + \btxlabeltext{aps:in} + } { + \btxspace + } + \btxflush{series} + } + } + \btxif {chapter} { + \btxcomma + \btxflush{chapter} + } + \btxspace + \btxif {year} { + \btxlparent + \btxflush{year} + \btxrparent + \texdefinition{btx:aps:publisher} + \btxif {edition} { + \btxcomma + \btxflush{edition} + \btxlabeltext{aps:edition}% ed. + } + \texdefinition{btx:aps:pages} + } + \btxperiod + } { + \btxlabeltext{aps:In} + \btxif {crossref} { + \btxflush{crossref} + } + \btxif {chapter} { + \btxcomma + \btxflush{chapter} + \btxspace + } + \texdefinition{btx:aps:pages} + \btxperiod + } + \texdefinition{btx:aps:note} +\stopsetups + +\startsetups btx:aps:inproceedings + \btxdoif {author} { + \btxflushauthor{author} + \btxspace + } + \btxdoifelse {title} { + \texdefinition {btx:aps:italic} { + \btxflush{ title} + } + \btxdoif {editor} { + \btxcomma + \btxlabeltext{aps:edited}% edited by + \btxspace + \btxflush{editor} + } + \btxdoif {chapter} { + \btxcomma + \btxflush{chapter} + } + \btxdoif {year} { + \btxlparent + \btxflush{year} + \btxdoifelse {organization} { + \btxcomma + \btxflush{organization} + } + \texdefinition{btx:aps:publisher} + \btxdoif {city} { + \btxcomma + \btxflush{city} + } + \btxrparent + } + \btxdoif {series} { + \btxcomma + \btxdoif {volume} { + \btxlabeltext{aps:volume}% vol. + \btxspace + \btxflush{volume} + \btxspace + \btxlabeltext{aps:of} + } + \texdefinition {btx:aps:italic} { + \btxflush{series} + } + } + \texdefinition{btx:aps:pages} + \btxperiod + } { + \btxspace + \btxlabeltext{aps:In} + \btxdoif {crossref} { + \btxflush{crossref} + } + \btxdoif {chapter} { + \btxcomma + \btxflush{chapter} + } + \texdefinition{btx:aps:pages} + \btxperiod + } + \texdefinition{btx:aps:note} +\stopsetups + +\startsetups btx:aps:proceedings + \btxdoifelse {editor} { + \btxflush{editor} + \btxcomma + \btxsingularorplural {editor} { + \btxlabeltext{aps:editor}% ed + } { + \btxlabeltext{aps:editors}% eds + } + \setmode{btx:aps:edited-book} + } { + \btxdoif {key} { + \btxsetup{btx:format:key} + \btxspace + } + } + \btxdoif {title} { + \texdefinition {btx:aps:italic} { + \btxflush{title} + } + \btxdoif {series} { + \bxtif {volume} { + \btxcomma + \btxlabeltext{aps:number} + \btxspace + \btxflush{volume} + \btxnbsp + \btxlabeltext{aps:in} + } + \btxspace + \btxflush{series} + } + \btxdoif {chapter} { + \btxcomma + \btxflush{chapter} + \btxspace + } + \btxdoif {year} { + \btxlparent + \btxdoif {organization} { + \btxflush{organization} + \btxcomma + } + \texdefinition{btx:aps:publisher} + \btxflush{year} + \btxrparent + } + \texdefinition{btx:aps:pages} + \btxif {city} { + \btxcomma + \btxflush{city} + } + } + \texdefinition{btx:aps:note} +\stopsetups + +\starttexdefinition btx:aps:thesis #field + \btxdoif {author} { + \btxflushauthor {author} + \btxcomma + } + \btxdoifelse {type} { + \btxflush{type} + \btxcomma + } { + \btxlabeltext{aps:#field} + } + \texdefinition{btx:aps:publisher} + \btxdoifelse {year} { + \btxlparent + \btxflush{year} + \btxrparent + } + \btxdoifelse {pages} { + \btxcomma + \btxflush{pages} + } + \texdefinition{btx:aps:note} +\stoptexdefinition + +\startsetups btx:aps:mastersthesis + \texdefinition{btx:aps:thesis}{mastersthesis} +\stopsetups + +\startsetups btx:aps:phdthesis + \texdefinition{btx:aps:thesis}{phdthesis} +\stopsetups + +\startsetups btx:aps:techreport + \btxdoif {author} { + \btxflushauthor{author} + \btxcomma + } + \btxdoif {title} { + \texdefinition {btx:apa:italic} { + \btxflush{title} + \btxdoifelse {series} { + \btxcomma + \btxlparent + \btxflush{series} + \btxrparent + } { + \btxspace + } + } + } + \btxdoifelse {type} { + \btxflush{type} + } { + \btxlabeltext{aps:techreport} + } + \btxdoif {volume} { + \btxspace + \btxflush{volume} + } + \btxcomma + \texdefinition{btx:aps:publisher} + \btxdoif {year} { + \btxlparent + \btxflush{year} + \btxrparent + } + \btxdoif {pages} { + \btxlcomma + \btxflush{pages} + } + \texdefinition{btx:aps:note} +\stopsetups + +\startsetups btx:aps:misc + \btxdoifelse {author} { + \btxflushauthor{author} + \btxdoif {title} { + \btxcomma + \texdefinition {btx:aps:italic} { + \btxflush{title} + } + } + } { + \btxdoifelse {title} { + \btxdoifelse {key} { + \btxsetup{btx:format:key} + \btxcomma + } + \texdefinition {btx:aps:italic} { + \btxflush{title} + } + } { + \btxdoifelse {key} { + \btxsetup{btx:format:key} + } + } + } + \btxdoif {series} { + \btxlparent + \btxflush{series} + \btxrparent + } + \btxdoifelse {year} { + \btxlparent + \texdefinition{btx:aps:publisher} + \btxflush{year} + \btxrparent + } { + \btxif {published} { + \btxcomma + \btxflush{published} + } + } + \btxif {pages} { + \btxcomma + \btxflush{pages} + } + \btxif {print} { + % eprint + \btxcomma + \btxflush{print} + } + \texdefinition{btx:aps:note} +\stopsetups + +\startsetups btx:aps:unpublished + \btxdoif {author} { + \btxflushauthor{author} + } + \btxdoif {title} { + \texdefinition {btx:aps:italic} { + \btxspace + \btxflush{title} + \btxdoif {series} { + \btxlparent + \btxflush{series} + \btxrparent + } + } + } + \btxdoif {type} { + \btxlparent + \btxflush{type} + \btxrparent + } + \btxlparent + \btxlabeltext{aps:unpublished}% new label + \btxdoifelse {year} { + \btxcomma + \btxflush{year} + } + \btxrparent + \btxdoif {pages} { + \btxcomma + \btxflush{pages} + \btxspace + } + \texdefinition{btx:aps:note} +\stopsetups + +\stopbtxrenderingdefinitions diff --git a/tex/context/base/publ-imp-test.bib b/tex/context/base/publ-imp-test.bib new file mode 100644 index 000000000..50e887a88 --- /dev/null +++ b/tex/context/base/publ-imp-test.bib @@ -0,0 +1,63 @@ +% The fields. This file needs to be filled with dummy data. Either fake names +% or maybe something DEK. + +@article {test-article, + author = "...", + comment = "...", + crossref = "...", + editor = "...", + issue = "...", + journal = "...", + note = "...", + pages = "...", + title = "...", + volume = "...", + year = "...", +} + +@book {test-book, + author = "...", + comment = "...", + chapter = "...", + crossref = "...", + editor = "...", + series = "...", + pages = "...", + publisher = "...", + volume = "...", + year = "...", +} + +@inbook {test-inbook, +} + +@booklet {test-booklet, +} + +@manual {test-manual, +} + +@incollection {test-incollection, +} + +@inproceedings {test-inproceedings, +} + +@proceedings {test-proceedings, +} + +@mastersthesis {test-mastersthesis, +} + +@phdthesis {test-phdthesis, +} + +@techreport {test-techreport, +} + +@misc {test-misc, +} + +@unpublished {test-unpublished, +} + diff --git a/tex/context/base/publ-ini.lua b/tex/context/base/publ-ini.lua index 91ace76fa..1ec88521e 100644 --- a/tex/context/base/publ-ini.lua +++ b/tex/context/base/publ-ini.lua @@ -9,7 +9,7 @@ if not modules then modules = { } end modules ['publ-ini'] = { -- we could store the destinations in the user list entries local next, rawget, type, tostring, tonumber = next, rawget, type, tostring, tonumber -local match, gmatch, format, gsub = string.match, string.gmatch, string.format, string.gsub +local match, gmatch, format, gsub, find = string.match, string.gmatch, string.format, string.gsub, string.find local concat, sort, tohash = table.concat, table.sort, table.tohash local utfsub = utf.sub local formatters = string.formatters @@ -431,17 +431,43 @@ local function getdetail(dataset,tag,name) return d and d[name] end -function commands.btxsingularorplural(dataset,tag,name) -- todo: make field dependent +function commands.btxsingularorplural(dataset,tag,name) local d = datasets[dataset].details[tag] if d then d = d[name] end - if d then + if type(d) == "table" then d = #d <= 1 + else + d = false end commands.doifelse(d) end +function commands.oneorrange(dataset,tag,name) + local d = datasets[dataset].luadata[tag] -- details ? + if d then + d = d[name] + end + if type(d) == "string" then + d = find(d,"%-") + else + d = false + + end + commands.doifelse(not d) -- so singular is default +end + +function commands.firstinrange(dataset,tag,name) + local d = datasets[dataset].luadata[tag] -- details ? + if d then + d = d[name] + end + if type(d) == "string" then + context(match(d,"([^%-]+)")) + end +end + -- basic loading function commands.usebtxdataset(name,filename) diff --git a/tex/context/base/publ-ini.mkiv b/tex/context/base/publ-ini.mkiv index 2f25724a0..04c8d4aea 100644 --- a/tex/context/base/publ-ini.mkiv +++ b/tex/context/base/publ-ini.mkiv @@ -977,6 +977,12 @@ \unexpanded\def\btxsingularplural#1% {\ctxcommand{btxsingularorplural("\currentbtxdataset","\currentbtxtag","#1")}} +\unexpanded\def\btxoneorrange#1% + {\ctxcommand{btxoneorrange("\currentbtxdataset","\currentbtxtag","#1")}} + +\unexpanded\def\btxfirstofrange#1% + {\ctxcommand{btxfirstofrange("\currentbtxdataset","\currentbtxtag","#1")}} + \let\btxsingularorplural\btxsingularplural %D Loading variants: diff --git a/tex/context/base/spac-ver.lua b/tex/context/base/spac-ver.lua index 55c135cf6..cfcee0122 100644 --- a/tex/context/base/spac-ver.lua +++ b/tex/context/base/spac-ver.lua @@ -886,14 +886,11 @@ local specialmethod = 1 local properties = nodes.properties.data -specialmethods[1] = function(start,penalty) +specialmethods[1] = function(pagehead,pagetail,start,penalty) -- if penalty < special_penalty_min or penalty > special_penalty_max then return end - -- this can move to the caller - local pagehead = tonut(texlists.page_head) - local pagetail = find_node_tail(pagehead) -- no texlists.page_tail yet-- no texlists.page_tail yet local current = pagetail -- -- nodes.showsimplelist(pagehead,0) @@ -1075,6 +1072,14 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also -- -- todo: keep_together: between headers -- + local function getpagelist() + if not pagehead then + pagehead = tonut(texlists.page_head) + pagetail = find_node_tail(pagehead) -- no texlists.page_tail yet-- no texlists.page_tail yet + end + return pagehead, pagetail + end + -- local function flush(why) if penalty_data then local p = new_penalty(penalty_data) @@ -1112,6 +1117,26 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also penalty_order, penalty_data, natural_penalty = 0, nil, nil parskip, ignore_parskip, ignore_following, ignore_whitespace = nil, false, false, false end + -- + +-- quick hack, can be done nicer +-- local nobreakfound = nil +-- local function checknobreak() +-- local pagehead, pagetail = getpagelist() +-- local current = pagetail +-- while current do +-- local id = getid(current) +-- if id == hlist_code or id == vlist_code then +-- return false +-- elseif id == penalty_code then +-- return getfield(current,"penalty") >= 10000 +-- end +-- current = getprev(current) +-- end +-- return false +-- end + + -- if trace_vsnapping then report_snapper("global ht/dp = %p/%p, local ht/dp = %p/%p", texgetdimen("globalbodyfontstrutheight"), texgetdimen("globalbodyfontstrutdepth"), @@ -1119,9 +1144,15 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also ) end if trace then trace_info("start analyzing",where,what) end + while current do local id = getid(current) if id == hlist_code or id == vlist_code then + +-- if nobreakfound == nil then +-- nobreakfound = false +-- end + -- needs checking, why so many calls if snap then local list = getlist(current) @@ -1167,6 +1198,17 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also -- natural_penalty = getfield(current,"penalty") -- if trace then trace_done("removed penalty",current) end -- head, current = remove_node(head, current, true) + +-- if nobreakfound == nil then +-- nobreakfound = checknobreak() +-- end +-- if nobreakfound and getfield(current,"penalty") <= 10000 then +-- -- if trace then +-- trace_done("removed penalty",current) +-- -- end +-- head, current = remove_node(head, current, true) +-- end + current = getnext(current) elseif id == kern_code then if snap and trace_vsnapping and getfield(current,"kern") ~= 0 then @@ -1182,7 +1224,8 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also local sp = getattr(current,a_skippenalty) -- has no default, no unset (yet) if sp and sc == penalty then if where == "page" then - local p = specialmethods[specialmethod](current,sp) + local pagehead, pagetail = getpagelist() + local p = specialmethods[specialmethod](pagehead,pagetail,current,sp) if p then if trace then trace_skip("previous special penalty %a is changed to %a using method %a",sp,p,specialmethod) @@ -1190,6 +1233,12 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also special_penalty = sp sp = p end + +-- else +-- if nobreakfound == nil then +-- nobreakfound = checknobreak() +-- end + end if not penalty_data then penalty_data = sp @@ -1199,6 +1248,14 @@ local function collapser(head,where,what,trace,snap,a_snapmethod) -- maybe also penalty_data = sp end if trace then trace_skip("penalty in skip",sc,so,sp,current) end + +-- if nobreakfound then +-- penalty_data = 10000 +-- if trace then +-- trace_skip("nobreak found before penalty in skip",sc,so,sp,current) +-- end +-- end + head, current = remove_node(head, current, true) elseif not sc then -- if not sc then if glue_data then diff --git a/tex/context/base/status-files.pdf b/tex/context/base/status-files.pdf Binary files differindex 2801e2b05..7e431659c 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 dba0dc0b7..2e9d791a6 100644 --- a/tex/context/base/status-lua.pdf +++ b/tex/context/base/status-lua.pdf diff --git a/tex/context/base/syst-ini.mkiv b/tex/context/base/syst-ini.mkiv index a533f8a6a..e01b8315c 100644 --- a/tex/context/base/syst-ini.mkiv +++ b/tex/context/base/syst-ini.mkiv @@ -1016,12 +1016,18 @@ % \bindprimitive ifabsnum ifpdfabsnum %D We need to make sure that we start up in \DVI\ mode, so, after testing for running -%D \PDFTEX, we default to \DVI. - -\pdfoutput \zerocount -\pdfminorversion \plusfive -\pdfgentounicode \plusone -\pdfinclusioncopyfonts\plusone +%D \PDFTEX, we default to \DVI. Why? + +\pdfoutput \zerocount +\pdfminorversion \plussix +\pdfgentounicode \plusone +\pdfinclusioncopyfonts \plusone +\pdfinclusionerrorlevel \zerocount +\pdfdecimaldigits \plusten +\pdfhorigin 1 true in +\pdfvorigin \pdfhorigin +\pdfimageresolution 300 +\pdfpkresolution 600 \normalprotected\def\nopdfcompression {\pdfobjcompresslevel\zerocount \pdfcompresslevel\zerocount} \normalprotected\def\maximumpdfcompression{\pdfobjcompresslevel\plusnine \pdfcompresslevel\plusnine } |