[NTG-context] Wrong prefix in cross references to formulas in external document
Hans Hagen
j.hagen at freedom.nl
Mon Jan 30 10:51:47 CET 2023
On 1/29/2023 5:03 PM, Yaroslav Beltukov via ntg-context wrote:
> Dear Hans and all contributors,
>
> I really appreciate ConTeXt for the right way to obtain high quality
> documents. I'm a theoretical physicist and I'm going to write a book. I
> think ConTeXt is the right choice to work with a number of formulas,
> figures and cross-references. The visual quality of formulas is better
> than in regular LaTeX. The new feature with formula autosplitting looks
> also very promising. For me it is important to obtain the high quality
> without a lot of manual tweaks of each formula for each given document
> format and figure placement.
>
> However, I have found a problem with references if I compile one
> component only. The references to formulas in other components have
> wrong prefixes, e.g. (2.1) instead of (3.1). Needless to say, the right
> formula references are very important.
>
> I started looking into this issue. The references to other components
> are taken from the whole product as from an external document. It turned
> out that this is a general problem with references with prefixes to
> external documents. The prefix is stored in a tuc file as a reference to
> a section as a sequential number of the header in the document. As a
> result, the prefix from the external document is calculated using the
> structure of the current document.
>
> Here is the MWE, which consists of two files:
> foo.tex:
>
> \defineenumeration[remark][prefix=yes, prefixsegments=chapter:section]
>
> \starttext
>
> Equations: \in[eq1], \in[eq2], \in[eq3], \in[eq4]
>
> Sections: \in[sec1], \in[sec2], \in[sec3], \in[sec4]
>
> Chapters: \in[chap1], \in[chap2], \in[chap3], \in[chap4]
>
> Remarks: \in[remark1], \in[remark2]
>
> \startbodymatter
>
> \chapter[chap1]{Chapter}
> \placeformula[eq1]\startformula x = y\stopformula
> \chapter[chap2]{Chapter}
> \section[sec1]{Section}
> \section[sec2]{Section}
> \placeformula[eq1]\startformula x = y\stopformula
> \placeformula[eq2]\startformula x = y\stopformula
>
> \stopbodymatter
>
> \startappendices
>
> \chapter[chap3]{Chapter}
> \section[sec3]{Section}
> \placeformula[eq3]\startformula x = y\stopformula
> \section[sec4]{Section}
> \startremark[remark1]\stopremark
> \placeformula[eq4]\startformula x = y\stopformula
> \startremark[remark2]\stopremark
> \chapter[chap4]{Chapter}
>
> \stopappendices
>
> \stoptext
>
>
> bar.tex:
>
> \starttext
>
> Equations: \in[foo::eq1], \in[foo::eq2], \in[foo::eq3], \in[foo::eq4]
>
> Sections: \in[foo::sec1], \in[foo::sec2], \in[foo::sec3], \in[foo::sec4]
>
> Chapters: \in[foo::chap1], \in[foo::chap2], \in[foo::chap3], \in[foo::chap4]
>
> Remarks: \in[foo::remark1], \in[foo::remark2]
>
> % any chapters and sections here
>
> \stoptext
>
> It is expected to have the same first page on these documents:
>
> Equations: 1.1, 2.2, A.1, A.2
> Sections: 2.1, 2.2, A.1, A.2
> Chapters: 1, 2, A, B
> Remarks: A.2.1, A.2.2
>
> However, the bar.tex produces wrong prefixes to formulas and remarks.
> The output depends on the document structure of bar.tex, not foo.tex.
>
> I started looking into the source code. Thanks to lua, it is not a big
> deal to track the problem. The prefixdata is complemented by the
> sectiondata after the loading the tuc file. So, the question is: is it
> possible to store the full prefixdata with all necessary prefix numbers
> in the tuc file? Here is my proposal to change the source code:
>
> --- strc-lst-old.lmt   2023-01-29 11:30:15.610309948 +0300
> +++ strc-lst.lmt     2023-01-29 12:10:08.864228923 +0300
> @@ -266,6 +266,16 @@
> Â Â Â if r and not r.section then
> Â Â Â Â Â r.section = structures.sections.currentid()
> Â Â Â end
> + Â Â -- store sectiondata in prefixdata (necessary for external files)
> + Â Â if t.prefixdata and r.section then
> + Â Â Â Â local sectiondata = structures.sections.collected[r.section]
> + Â Â Â Â if sectiondata then
> + Â Â Â Â Â Â for k, v in next, sectiondata do
> + Â Â Â Â Â Â Â Â t.prefixdata[k] = v
> + Â Â Â Â Â Â end
> + Â Â Â Â end
> + Â Â end
> + Â Â --
> Â Â Â local b = r and t.block
> Â Â Â if r and not b then
> Â Â Â Â Â local s = r.section
>
> --- strc-ref-old.lmt   2023-01-29 11:30:15.823643904 +0300
> +++ strc-ref.lmt     2023-01-29 12:07:45.697109862 +0300
> @@ -2318,7 +2318,17 @@
> Â Â Â if data then
> Â Â Â Â Â numberdata = lists.reordered(data) -- data.numberdata
> Â Â Â Â Â if numberdata then
> - Â Â Â Â Â Â helpers.prefix(data,prefixspec)
> + Â Â Â Â Â Â -- helpers.prefix(data,prefixspec)
> + Â Â Â Â Â Â -- use the actual numbers from prefixdata
> + Â Â Â Â Â Â local prefixdata = data.prefixdata
> + Â Â Â Â Â Â if prefixdata then
> + Â Â Â Â Â Â Â Â -- adapted from helpers.prefix (not sure)
> + Â Â Â Â Â Â Â Â if (prefixspec and prefixspec == no) or
> prefixdata.prefix == no then
> + Â Â Â Â Â Â Â Â Â Â prefixdata = false
> + Â Â Â Â Â Â Â Â end
> + Â Â Â Â Â Â Â Â sections.typesetnumber(prefixdata,"prefix", prefixspec
> or false, prefixdata)
> + Â Â Â Â Â Â end
> + Â Â Â Â Â Â --
>
> Â sections.typesetnumber(numberdata,"number",numberspec,numberdata)
> Â Â Â Â Â else
> Â Â Â Â Â Â Â local useddata = data.useddata
>
> After this small change, all the references are correct. However, I'm
> quite new to ConTeXt, so maybe here are some caveats. It would be great
> to fix the references to formulas, especially for the forthcoming
> document about maths.
that will bloat the already large tuc file, so here is an alternative (i
bet you can find where to patch):
strc-ref
local external = struc.references.collected -- direct references
local lists = struc.lists.collected -- indirect
references (derived)
local pages = struc.pages.collected -- pagenumber data
local sections = struc.sections.collected
and
if prefix == "" then
prefix = name -- this can clash!
end
local section = references.section
if section then
if sections then
references.sectiondata = sections[section]
else
-- warning
end
end
strc-pag:
local sectiondata = references.sectiondata or
sections.collected[references.section]
if not sectiondata then
return entry, false, "no section data"
end
there might be a few more such places where we can bind to the loaded data
Hans
-----------------------------------------------------------------
Hans Hagen | PRAGMA ADE
Ridderstraat 27 | 8061 GH Hasselt | The Netherlands
tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl
-----------------------------------------------------------------
More information about the ntg-context
mailing list