I found a solution, but it's tricky (and there's no check on reference existence in structures.references.collected). \directlua{ function userdata.printrange(singular, plural, label) local coll_ref = structures.references.collected[""] local pagestart = coll_ref[label .. ":start"].references.realpage local pagestop = coll_ref[label .. ":stop"].references.realpage if pagestart == pagestop then context(singular) else context(plural) end context("~") context.ref({"page"}, {label .. ":start"}) if pagestart ~= pagestop then context("-") context.ref({"page"}, {label .. ":stop"}) end end function userdata.printpagerange(label) userdata.printrange("page", "pages", label) end } \def\printpagerange#1{\ctxlua{userdata.printpagerange("#1")}} \starttext Tufte quote at \printpagerange{tufte}. % start of quote reference \pagereference[tufte:start] \input{tufte} %\page % comment/uncomment this to toggle from page range to single page \input{tufte} % end of quote reference \pagereference[tufte:stop] \stoptext