summaryrefslogtreecommitdiff
path: root/tex/context/base
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base')
-rw-r--r--tex/context/base/back-ini.mkiv2
-rw-r--r--tex/context/base/back-pdf.lua11
-rw-r--r--tex/context/base/back-pdf.mkiv123
-rw-r--r--tex/context/base/char-utf.lua515
-rw-r--r--tex/context/base/cont-new.mkiv2
-rw-r--r--tex/context/base/context-version.pdfbin4323 -> 4348 bytes
-rw-r--r--tex/context/base/context.mkiv2
-rw-r--r--tex/context/base/file-lib.lua54
-rw-r--r--tex/context/base/file-mod.lua25
-rw-r--r--tex/context/base/hand-ini.mkiv8
-rw-r--r--tex/context/base/lpdf-col.lua2
-rw-r--r--tex/context/base/lpdf-ini.lua86
-rw-r--r--tex/context/base/meta-ini.mkiv28
-rw-r--r--tex/context/base/page-txt.mkvi10
-rw-r--r--tex/context/base/publ-imp-apa.bib29
-rw-r--r--tex/context/base/publ-imp-apa.mkvi175
-rw-r--r--tex/context/base/publ-imp-aps.mkvi890
-rw-r--r--tex/context/base/publ-imp-test.bib63
-rw-r--r--tex/context/base/publ-ini.lua32
-rw-r--r--tex/context/base/publ-ini.mkiv6
-rw-r--r--tex/context/base/spac-ver.lua67
-rw-r--r--tex/context/base/status-files.pdfbin24884 -> 24885 bytes
-rw-r--r--tex/context/base/status-lua.pdfbin246770 -> 246860 bytes
-rw-r--r--tex/context/base/syst-ini.mkiv18
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
index 6bf00b133..7ffefbcfc 100644
--- a/tex/context/base/context-version.pdf
+++ b/tex/context/base/context-version.pdf
Binary files differ
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
index 2801e2b05..7e431659c 100644
--- a/tex/context/base/status-files.pdf
+++ b/tex/context/base/status-files.pdf
Binary files differ
diff --git a/tex/context/base/status-lua.pdf b/tex/context/base/status-lua.pdf
index dba0dc0b7..2e9d791a6 100644
--- a/tex/context/base/status-lua.pdf
+++ b/tex/context/base/status-lua.pdf
Binary files differ
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 }