[NTG-context] Font substitution for extensible symbols

2023-02-01 Thread Yaroslav Beltukov via ntg-context
Good day everyone,

I'm trying to replace the math radical symbol (with all its variants) in
one font with another one. Some fonts have too few radical symbols of
different sizes, which results in enormous spacing in radicals.

However, there is a bug in the new font replacement mechanism. Here is MWE:

% 0x221A is the radical symbol
\definefallbackfamily [MainFace] [mm] [TeX Gyre Pagella Math] [force=yes,
range=0x221A]
\definefontfamily [MainFace] [tf] [Cambria] % or [XITS]
\definefontfamily [MainFace] [mm] [Cambria Math] % or [XITS Math]
\setupbodyfont [MainFace]
\starttext
\startformula

\sqrt{\frac{1}{2}}\dorecurse{15}{+\sqrt{\blackrule[width=10pt,height=#1pt,depth=#1pt,color=gray]}}
\stopformula
\startformula
  \sqrt{\blackrule[width=10pt,height=100pt,depth=100pt,color=gray]}
\stopformula
\stoptext

It works in MKIV but it gives the following error in the latest LMTX:

...mkxl/math-vfu.lmt:675: attempt to get length of a nil value (global 'hp')

It is caused by the following loop in math-vfu.lmt:

local pv = olddata.parts
if pv then
pv = fastcopy(pv)
newdata.parts = pv
for i=1,#hp do
local pvi = pv[i]
...

One can see that #hp should be #pv. After this correction, the error
disappears and we get different sizes of radicals from the new font.
However, now the extended version of the radical does not work. Actually,
this loop is devoted to copying the parts of the extended symbol, and it
does not work as expected. Obviously, there is something deeper than the
correction of the typo. The same behaviour is for other extensible symbols
(e.g. parentheses).

I hope this issue can be resolved. A more deeper understanding is required
here.

Best regards,
Yaroslav

P.S. sometimes I get the following output. Maybe it is related:
otf reader  > cff > unknown local call ?, case 1 : [] n=0
___
If your question is of interest to others as well, please add an entry to the 
Wiki!

maillist : ntg-context@ntg.nl / https://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : https://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki : https://contextgarden.net
___


Re: [NTG-context] Wrong prefix in cross references to formulas in external document

2023-01-31 Thread Yaroslav Beltukov via ntg-context
Dear Hans,

Thank you for the nice and straightforward solution. I have tested it
locally and it works. I hope it will be in the next release (should I do
anything?).

By the way, I have a couple of other small issues. I will describe them in
detail in other threads of this mailing list if it is the right place to do
so.

Best regards,
Yaroslav


пн, 30 янв. 2023 г. в 12:52, Hans Hagen via ntg-context :

> 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.lmt2023-01-29 11:30:15.610309948 +0300
> > +++ strc-lst.lmt2023-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 extern

[NTG-context] Wrong prefix in cross references to formulas in external document

2023-01-29 Thread Yaroslav Beltukov via ntg-context
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.lmt2023-01-29 11:30:15.610309948 +0300
+++ strc-lst.lmt2023-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.lmt2023-01-29 11:30:15.823643904 +0300
+++ strc-ref.lmt2023-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