summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarius <mariausol@gmail.com>2010-12-14 00:20:12 +0200
committerMarius <mariausol@gmail.com>2010-12-14 00:20:12 +0200
commitb809b01d48419c1cb3459db64b1252515c520705 (patch)
tree480da2554423a0bd58c37be714d9f41cde3a9c26
parent7c318ca9064f51e8b438791b98dd552327bb7a00 (diff)
downloadcontext-b809b01d48419c1cb3459db64b1252515c520705.tar.gz
beta 2010.12.13 22:59
-rw-r--r--tex/context/base/bibl-bib.mkiv3
-rw-r--r--tex/context/base/bibl-tra.mkiv5
-rw-r--r--tex/context/base/cont-new.tex2
-rw-r--r--tex/context/base/context.tex2
-rw-r--r--tex/context/base/strc-lst.lua53
-rw-r--r--tex/context/base/strc-lst.mkiv34
-rw-r--r--tex/generic/context/luatex-fonts-merged.lua2
7 files changed, 80 insertions, 21 deletions
diff --git a/tex/context/base/bibl-bib.mkiv b/tex/context/base/bibl-bib.mkiv
index a2d194eee..9f8e8c55b 100644
--- a/tex/context/base/bibl-bib.mkiv
+++ b/tex/context/base/bibl-bib.mkiv
@@ -616,11 +616,12 @@
\doifelse{\bibtexpublicationsparameter\c!method}\v!local
{\ctxlua{bibtex.hacks.reset(1)}}% function can take method
{\ctxlua{bibtex.hacks.reset(2)}}%
- \placestructurelist
+ \doplacestructurelist
{\currentbibtexsession}
{\currentbibtexcriterium}
{\namedlistparameter\currentbibtexsession\c!number}%
{\namedlistparameter\currentbibtexsession\c!extras}%
+ {\namedlistparameter\currentbibtexsession\c!order}%
\ctxlua{bibtex.hacks.flush("\bibtexpublicationsparameter\c!sorttype")}%
\doendoflist}
diff --git a/tex/context/base/bibl-tra.mkiv b/tex/context/base/bibl-tra.mkiv
index fba750d82..a6a594d7f 100644
--- a/tex/context/base/bibl-tra.mkiv
+++ b/tex/context/base/bibl-tra.mkiv
@@ -825,11 +825,12 @@
{\ctxlua{bibtex.hacks.filterall()}}
{\doif{\listparameter\c!criterium}\v!cite
{\setuplist[pubs][\c!criterium=\v!here]}%
- \placestructurelist
+ \doplacestructurelist
{pubs}%
{\listparameter\c!criterium}%
{\listparameter\c!number}%
- {\listparameter\c!extras}}%
+ {\listparameter\c!extras}%
+ {\listparameter\c!order}}%
\ctxlua{bibtex.hacks.flush("\@@pbsorttype")}%
\doendoflist}
diff --git a/tex/context/base/cont-new.tex b/tex/context/base/cont-new.tex
index 2d46457a9..d767b1f03 100644
--- a/tex/context/base/cont-new.tex
+++ b/tex/context/base/cont-new.tex
@@ -11,7 +11,7 @@
%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
%C details.
-\newcontextversion{2010.12.13 20:58}
+\newcontextversion{2010.12.13 22:59}
%D This file is loaded at runtime, thereby providing an
%D excellent place for hacks, patches, extensions and new
diff --git a/tex/context/base/context.tex b/tex/context/base/context.tex
index 9065429f9..dfecbb321 100644
--- a/tex/context/base/context.tex
+++ b/tex/context/base/context.tex
@@ -20,7 +20,7 @@
%D your styles an modules.
\edef\contextformat {\jobname}
-\edef\contextversion{2010.12.13 20:58}
+\edef\contextversion{2010.12.13 22:59}
%D For those who want to use this:
diff --git a/tex/context/base/strc-lst.lua b/tex/context/base/strc-lst.lua
index 5e154b1d6..8278a66d9 100644
--- a/tex/context/base/strc-lst.lua
+++ b/tex/context/base/strc-lst.lua
@@ -196,7 +196,22 @@ local splitter = lpeg.splitat(":")
-- this will become filtercollected(specification) and then we'll also have sectionblock as key
-local function filtercollected(names, criterium, number, collected, forced, nested) -- names is hash or string
+local sorters = {
+ [variables.command] = function(a,b)
+ if a.metadata.kind == "command" or b.metadata.kind == "command" then
+ return a.references.internal < b.references.internal
+ else
+ return a.references.order < b.references.order
+ end
+ end,
+ [variables.all] = function(a,b)
+ return a.references.internal < b.references.internal
+ end,
+}
+
+-- some day soon we will pass a table
+
+local function filtercollected(names, criterium, number, collected, forced, nested, sortorder) -- names is hash or string
local numbers, depth = documents.data.numbers, documents.data.depth
local result, nofresult, detail = { }, 0, nil
local block = false -- all
@@ -252,7 +267,7 @@ local function filtercollected(names, criterium, number, collected, forced, nest
end
elseif criterium == variables.current then
if depth == 0 then
- return filtercollected(names,variables.intro,number,collected,forced)
+ return filtercollected(names,variables.intro,number,collected,forced,false,sortorder)
else
for i=1,#collected do
local v = collected[i]
@@ -285,7 +300,7 @@ local function filtercollected(names, criterium, number, collected, forced, nest
elseif criterium == variables.here then
-- this is quite dirty ... as cnumbers is not sparse we can misuse #cnumbers
if depth == 0 then
- return filtercollected(names,variables.intro,number,collected,forced)
+ return filtercollected(names,variables.intro,number,collected,forced,false,sortorder)
else
for i=1,#collected do
local v = collected[i]
@@ -318,7 +333,7 @@ local function filtercollected(names, criterium, number, collected, forced, nest
end
elseif criterium == variables.previous then
if depth == 0 then
- return filtercollected(names,variables.intro,number,collected,forced)
+ return filtercollected(names,variables.intro,number,collected,forced,false,sortorder)
else
for i=1,#collected do
local v = collected[i]
@@ -351,11 +366,11 @@ local function filtercollected(names, criterium, number, collected, forced, nest
elseif criterium == variables["local"] then -- not yet ok
local nested = nesting[#nesting]
if nested then
- return filtercollected(names,nested.name,nested.number,collected,forced,nested)
+ return filtercollected(names,nested.name,nested.number,collected,forced,nested,sortorder)
elseif sections.autodepth(documents.data.numbers) == 0 then
- return filtercollected(names,variables.all,number,collected,forced)
+ return filtercollected(names,variables.all,number,collected,forced,false,sortorder)
else
- return filtercollected(names,variables.current,number,collected,forced)
+ return filtercollected(names,variables.current,number,collected,forced,false,sortorder)
end
else -- sectionname, number
-- not the same as register
@@ -393,13 +408,35 @@ local function filtercollected(names, criterium, number, collected, forced, nest
report_lists("criterium: %s, block: %s, found: %s",criterium,block or "*",#result)
end
end
+
+ if sortorder then -- experiment
+ local sorter = sorters[sortorder]
+ if sorter then
+ if trace_lists then
+ report_lists("sorting list using method %s",sortorder)
+ end
+ for i=1,#result do
+ result[i].references.order = i
+ end
+ table.sort(result,sorter)
+ end
+ end
+
return result
end
lists.filtercollected = filtercollected
function lists.filter(specification)
- return filtercollected(specification.names, specification.criterium, specification.number, lists.collected, specification.forced)
+ return filtercollected(
+ specification.names,
+ specification.criterium,
+ specification.number,
+ lists.collected,
+ specification.forced,
+ false,
+ specification.order
+ )
end
lists.result = { }
diff --git a/tex/context/base/strc-lst.mkiv b/tex/context/base/strc-lst.mkiv
index f037ea6ae..7e20d25ec 100644
--- a/tex/context/base/strc-lst.mkiv
+++ b/tex/context/base/strc-lst.mkiv
@@ -88,6 +88,7 @@
internal = \nextinternalreference,
block = "\currentstructureblock", % handy for lists, like bibl
section = structures.sections.currentid(),
+ % location = "\currentlistlocation",
},
metadata = {
kind = "\currentlisttype",
@@ -157,17 +158,18 @@
% \appendtoks
% \to \everystructurelist
-\unexpanded\def\placestructurelist#1#2#3#4%
+\unexpanded\def\doplacestructurelist#1#2#3#4#5% beware, not a user command
{\dostarttagged\t!list\empty
\ctxlua{structures.lists.process {
names = "#1",
criterium = "#2",
number = "#3",
- extras = "#4"
+ extras = "#4",
+ order = "#5"
}}%
\dostoptagged}
-\unexpanded\def\analyzestructurelist#1#2#3%
+\unexpanded\def\doanalyzestructurelist#1#2#3%
{\ctxlua{structures.lists.analyze {
names = "#1",
criterium = "#2",
@@ -389,6 +391,23 @@
\let\dowritetolist \gobblefourarguments
\let\dodowritetolist\gobblefourarguments
+
+%D Regular list entries are bound to a specific location in order to
+%D get the right pagenumber etc.\ associated. When pushing something
+%D inbetween (in mkiv) it ends up directtly in the list. This is the
+%D default because otherwise users will wonder why spacing might get
+%D messed up (due to an unseen but present node). It is possible to
+%D force a location by explicitly setting \type {location} to \type
+%D {here}.
+%D
+%D Another way to force a certain order is to set the \type {order}
+%D variable when placing a list. The \type {command} option only
+%D pushes commands into the right order, and \type {all} orders all
+%D entries (which might be too much). In this case no specific
+%D location is needed with the inbetween method. Maybe additional
+%D mechanisms show up some day. See \type {inbetween-001.tex} for an
+%D example.
+
% command : location=none
% userdata : location=none
% simple : location=here
@@ -405,7 +424,6 @@
\dostructurelistinject[#1][\c!type=command][command={#3}]%
\fi}}
-
\def\dowritedatatolist[#1][#2][#3]% we can overload location
{\doif{\namedlistparameter{#1}\c!state}\v!start
{\ifthirdargument
@@ -440,11 +458,12 @@
\edef\currentlist{\firststructureelementinlist{#1}}%
\the\everystructurelist
\doif{\listparameter\c!coupling}\v!on{\startlistreferences{#1}}%
- \placestructurelist
+ \doplacestructurelist
{#1}%
{\listparameter\c!criterium}%
{\number\listparameter\c!number}%
{\listparameter\c!extras}%
+ {\listparameter\c!order}%
\stoplistreferences
\endgroup
\dosetlistmode}
@@ -913,7 +932,7 @@
\dosetuplist[#1][#2]%
\edef\currentlist{\firststructureelementinlist{#1}}%
\the\everystructurelist
- \analyzestructurelist{#1}{\listparameter\c!criterium}{\number\listparameter\c!number}%
+ \doanalyzestructurelist{#1}{\listparameter\c!criterium}{\number\listparameter\c!number}%
\xdef\utilitylistlength{\structurelistsize}%
\endgroup
\dosetlistmode}
@@ -955,11 +974,12 @@
\doif{\combinedlistparameter\c!coupling}\v!on{\startlistreferences{#1}}%
\dobeginoflist
\normalexpanded{\noexpand\dosetuplist[\combinedlist][#2]}%
- \placestructurelist
+ \doplacestructurelist
{\combinedlist}%
{\combinedlistparameter\c!criterium}%
{\combinedlistparameter\c!number}%
{\combinedlistparameter\c!extras}%
+ {\combinedlistparameter\c!order}%
\doendoflist
\stoplistreferences
\endgroup
diff --git a/tex/generic/context/luatex-fonts-merged.lua b/tex/generic/context/luatex-fonts-merged.lua
index 6af528034..e2abae9eb 100644
--- a/tex/generic/context/luatex-fonts-merged.lua
+++ b/tex/generic/context/luatex-fonts-merged.lua
@@ -1,6 +1,6 @@
-- merged file : luatex-fonts-merged.lua
-- parent file : luatex-fonts.lua
--- merge date : 12/13/10 20:58:02
+-- merge date : 12/13/10 22:59:02
do -- begin closure to overcome local limits and interference