* \autoinsertedspace fails @ 2022-12-30 0:12 Rik Kabel via ntg-context 2023-01-04 22:10 ` Rik Kabel via ntg-context 0 siblings, 1 reply; 8+ messages in thread From: Rik Kabel via ntg-context @ 2022-12-30 0:12 UTC (permalink / raw) To: mailing list for ConTeXt users; +Cc: Rik Kabel [-- Attachment #1.1: Type: text/plain, Size: 1777 bytes --] Happy New Year all! Following up on the problem with \autoinsertnextspace (https://mailman.ntg.nl/pipermail/ntg-context/2022/107111.html) and the new \autoinsertedspace that came from that report, I see that there is still a problem, or perhaps a problem again after it was previously repaired. The following code, run under the latest (and recent previous) version, produces an incorrect result, with no space inserted where expected in many cases. As the first examples after \starttext show, the problem appears to be with \autoinsertedspace, but perhaps I am using it incorrectly in the macro as well. \starttexdefinition unexpanded BD \dodoublegroupempty \doBD \stoptexdefinition \starttexdefinition doBD #1#2 \removeunwantedspaces\ % insert a space ( \ifsecondargument #1|–|#2 \else\iffirstargument #1– \else {\red I NEED A DATE OR DATES!} \fi\fi ) \autoinsertedspace \stoptexdefinition \tt \starttext This\autoinsertedspace fails unexpectedly with autoinsertedspace.\par This\autoinsertedspace \emph{fails unexpectedly} with autoinsertedspace.\par This\autoinsertnextspace works with autoinsertnextspace.\par This\autoinsertnextspace \emph{fails} as expected with autoinsertnextspace.\par Saussure\BD{1857}{1913} works.\par Saussure \BD{1857}{1913} \emph{works}.\par Saussure \BD{1857}{1913}. Works.\par Chomsky\BD{1928} fails with LMTX, works with MkIV.\par Chomsky \BD{1928} \emph{fails with LMTX, works with MkIV}.\par Chomsky \BD{1928}. Works.\par \BD blah\par \contextversion\ \texenginename \stoptext -- Rik [-- Attachment #1.2: Type: text/html, Size: 2911 bytes --] [-- Attachment #2: Type: text/plain, Size: 496 bytes --] ___________________________________________________________________________________ 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 ___________________________________________________________________________________ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: \autoinsertedspace fails 2022-12-30 0:12 \autoinsertedspace fails Rik Kabel via ntg-context @ 2023-01-04 22:10 ` Rik Kabel via ntg-context 2023-01-04 23:45 ` Hans Hagen via ntg-context 0 siblings, 1 reply; 8+ messages in thread From: Rik Kabel via ntg-context @ 2023-01-04 22:10 UTC (permalink / raw) To: ntg-context; +Cc: Rik Kabel [-- Attachment #1.1: Type: text/plain, Size: 2534 bytes --] No change with the latest (2023.01.04). Is this a problem with what I am doing, or a bug? -- Rik On 2022-12-29 19:12, Rik Kabel via ntg-context wrote: > > Happy New Year all! > > Following up on the problem with \autoinsertnextspace > (https://mailman.ntg.nl/pipermail/ntg-context/2022/107111.html) and > the new \autoinsertedspace that came from that report, I see that > there is still a problem, or perhaps a problem again after it was > previously repaired. > > The following code, run under the latest (and recent previous) > version, produces an incorrect result, with no space inserted where > expected in many cases. As the first examples after \starttext show, > the problem appears to be with \autoinsertedspace, but perhaps I am > using it incorrectly in the macro as well. > > \starttexdefinition unexpanded BD > \dodoublegroupempty > \doBD > \stoptexdefinition > > \starttexdefinition doBD #1#2 > \removeunwantedspaces\ % insert a space > ( > \ifsecondargument > #1|–|#2 > \else\iffirstargument > #1– > \else > {\red I NEED A DATE OR DATES!} > \fi\fi > ) > \autoinsertedspace > \stoptexdefinition > > \tt > > \starttext > This\autoinsertedspace fails unexpectedly with autoinsertedspace.\par > This\autoinsertedspace \emph{fails unexpectedly} with > autoinsertedspace.\par > This\autoinsertnextspace works with autoinsertnextspace.\par > This\autoinsertnextspace \emph{fails} as expected with > autoinsertnextspace.\par > Saussure\BD{1857}{1913} works.\par > Saussure \BD{1857}{1913} \emph{works}.\par > Saussure \BD{1857}{1913}. Works.\par > Chomsky\BD{1928} fails with LMTX, works with MkIV.\par > Chomsky \BD{1928} \emph{fails with LMTX, works with MkIV}.\par > Chomsky \BD{1928}. Works.\par > \BD blah\par > \contextversion\ \texenginename > \stoptext > > > -- > Rik > > > > ___________________________________________________________________________________ > 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 > ___________________________________________________________________________________ [-- Attachment #1.2: Type: text/html, Size: 4613 bytes --] [-- Attachment #2: Type: text/plain, Size: 496 bytes --] ___________________________________________________________________________________ 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 ___________________________________________________________________________________ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: \autoinsertedspace fails 2023-01-04 22:10 ` Rik Kabel via ntg-context @ 2023-01-04 23:45 ` Hans Hagen via ntg-context 2023-01-05 3:21 ` Rik Kabel via ntg-context 0 siblings, 1 reply; 8+ messages in thread From: Hans Hagen via ntg-context @ 2023-01-04 23:45 UTC (permalink / raw) To: mailing list for ConTeXt users; +Cc: Hans Hagen [-- Attachment #1: Type: text/plain, Size: 1060 bytes --] On 1/4/2023 11:10 PM, Rik Kabel via ntg-context wrote: > No change with the latest (2023.01.04). > > Is this a problem with what I am doing, or a bug? well, it's new and not thtat tested ... we need to specify it This\optionalspace fails unexpectedly with autoinsertedspace.\par This\optionalspace \emph{fails unexpectedly} with autoinsertedspace.\par there can be more variants, like do we want to remove preceding spaces? we already have: This\optionalspace, fails unexpectedly with autoinsertedspace.\par This\optionalspace, \emph{fails unexpectedly} with autoinsertedspace.\par This\optionalspace fails unexpectedly with autoinsertedspace.\par This\optionalspace \emph{fails unexpectedly} with autoinsertedspace.\par ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl ----------------------------------------------------------------- [-- Attachment #2: spac-chr.lmt --] [-- Type: text/plain, Size: 12615 bytes --] if not modules then modules = { } end modules ['spac-chr'] = { version = 1.001, optimize = true, comment = "companion to spac-chr.mkiv", author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", copyright = "PRAGMA ADE / ConTeXt Development Team", license = "see context related readme files" } local byte, lower = string.byte, string.lower -- beware: attribute copying is bugged ... there will be a proper luatex helper -- for this -- to be redone: characters will become tagged spaces instead as then we keep track of -- spaceskip etc -- todo: only setattr when export / use properties local next = next local trace_characters = false trackers.register("typesetters.characters", function(v) trace_characters = v end) local trace_nbsp = false trackers.register("typesetters.nbsp", function(v) trace_nbsp = v end) local report_characters = logs.reporter("typesetting","characters") local nodes, node = nodes, node local nuts = nodes.nuts local getid = nuts.getid local getsubtype = nuts.getsubtype local setsubtype = nuts.setsubtype local getboth = nuts.getboth local getnext = nuts.getnext local getprev = nuts.getprev local getattr = nuts.getattr local setattr = nuts.setattr local getlanguage = nuts.getlanguage local setchar = nuts.setchar local setattrlist = nuts.setattrlist local getfont = nuts.getfont local isglyph = nuts.isglyph local setcolor = nodes.tracers.colors.set local insertnodebefore = nuts.insertbefore local insertnodeafter = nuts.insertafter local remove_node = nuts.remove local nextchar = nuts.traversers.char local nextglyph = nuts.traversers.glyph local copy_node = nuts.copy local nodepool = nuts.pool local new_penalty = nodepool.penalty local new_glue = nodepool.glue local new_kern = nodepool.kern local new_rule = nodepool.rule local nodecodes = nodes.nodecodes local gluecodes = nodes.gluecodes local glyph_code = nodecodes.glyph local glue_code = nodecodes.glue local spaceskip_code = gluecodes.spaceskip local chardata = characters.data local ispunctuation = characters.is_punctuation local canhavespace = characters.can_have_space local typesetters = typesetters local unicodeblocks = characters.blocks local characters = typesetters.characters or { } -- can be predefined typesetters.characters = characters local fonthashes = fonts.hashes local fontparameters = fonthashes.parameters local fontcharacters = fonthashes.characters local fontquads = fonthashes.quads local setmetatableindex = table.setmetatableindex local a_character = attributes.private("characters") local a_alignstate = attributes.private("alignstate") local c_zero = byte('0') local c_period = byte('.') local function inject_quad_space(unicode,head,current,fraction) if fraction ~= 0 then fraction = fraction * fontquads[getfont(current)] end local glue = new_glue(fraction) setattrlist(glue,current) setattrlist(current) -- why reset all setattr(glue,a_character,unicode) return insertnodeafter(head,current,glue) end local function inject_char_space(unicode,head,current,parent) local font = getfont(current) local char = fontcharacters[font][parent] local glue = new_glue(char and char.width or fontparameters[font].space) setattrlist(glue,current) setattrlist(current) -- why reset all setattr(glue,a_character,unicode) return insertnodeafter(head,current,glue) end local function inject_nobreak_space(unicode,head,current,space,spacestretch,spaceshrink) local glue = new_glue(space,spacestretch,spaceshrink) local penalty = new_penalty(10000) setattrlist(glue,current) setattrlist(penalty,current) setattrlist(current) -- why reset all setattr(glue,a_character,unicode) -- bombs head, current = insertnodeafter(head,current,penalty) if trace_nbsp then local rule = new_rule(space) local kern = new_kern(-space) local penalty = new_penalty(10000) setcolor(rule,"orange") head, current = insertnodeafter(head,current,rule) head, current = insertnodeafter(head,current,kern) head, current = insertnodeafter(head,current,penalty) end return insertnodeafter(head,current,glue) end local function nbsp(head,current) local para = fontparameters[getfont(current)] local attr = getattr(current,a_alignstate) or 0 if attr >= 1 and attr <= 3 then -- flushright head, current = inject_nobreak_space(0x00A0,head,current,para.space,0,0) else head, current = inject_nobreak_space(0x00A0,head,current,para.space,para.spacestretch,para.spaceshrink) end setsubtype(current,spaceskip_code) return head, current end -- assumes nuts or nodes, depending on callers .. so no tonuts here function characters.replacenbsp(head,original) local head, current = nbsp(head,original) return remove_node(head,original,true) end function characters.replacenbspaces(head) -- todo: wiping as in characters.handler(head) local wipe = false for current, char, font in nextglyph, head do -- can be anytime so no traversechar if char == 0x00A0 then if wipe then head = remove_node(h,current,true) wipe = false end local h = nbsp(head,current) if h then wipe = current end end end if wipe then head = remove_node(head,current,true) end return head end -- This initialization might move someplace else if we need more of it. The problem is that -- this module depends on fonts so we have an order problem. local nbsphash = { } setmetatableindex(nbsphash,function(t,k) -- this needs checking ! for i=unicodeblocks.devanagari.first,unicodeblocks.devanagari.last do nbsphash[i] = true end for i=unicodeblocks.kannada .first,unicodeblocks.kannada .last do nbsphash[i] = true end setmetatableindex(nbsphash,nil) return nbsphash[k] end) local methods = { -- The next one uses an attribute assigned to the character but still we -- don't have the 'local' value. -- maybe also 0x0008 : backspace -- Watch out: a return value means "remove"! [0x001E] = function(head,current) -- kind of special local next = getnext(current) if next and getid(next) == glue_code and getsubtype(next) == spaceskip_code then local nextnext = getnext(next) if nextnext then local char, font = isglyph(nextnext) if char and not canhavespace[char] then remove_node(head,next,true) end end else local char, font = isglyph(next) if char and canhavespace[char] then local p = fontparameters[font] head, current = insertnodebefore(head,current,new_glue(p.space,p.spacestretch,p.spaceshrink)) end end return head, current end, [0x001F] = function(head,current) -- kind of special local next = getnext(current) if next then local char, font = isglyph(next) if char and not ispunctuation[char] then local p = fontparameters[font] head, current = insertnodebefore(head,current,new_glue(p.space,p.spacestretch,p.spaceshrink)) end end return head, current end, [0x00A0] = function(head,current) -- nbsp local prev, next = getboth(current) if next then local char = isglyph(current) if not char then -- move on elseif char == 0x200C or char == 0x200D then -- nzwj zwj next = getnext(next) if next then char = isglyph(next) if char and nbsphash[char] then return false end end elseif nbsphash[char] then return false end end if prev then local char = isglyph(prev) if char and nbsphash[char] then return false end end return nbsp(head,current) end, [0x00AD] = function(head,current) -- softhyphen return insertnodeafter(head,current,languages.explicithyphen(current)) end, [0x2000] = function(head,current) -- enquad return inject_quad_space(0x2000,head,current,1/2) end, [0x2001] = function(head,current) -- emquad return inject_quad_space(0x2001,head,current,1) end, [0x2002] = function(head,current) -- enspace return inject_quad_space(0x2002,head,current,1/2) end, [0x2003] = function(head,current) -- emspace return inject_quad_space(0x2003,head,current,1) end, [0x2004] = function(head,current) -- threeperemspace return inject_quad_space(0x2004,head,current,1/3) end, [0x2005] = function(head,current) -- fourperemspace return inject_quad_space(0x2005,head,current,1/4) end, [0x2006] = function(head,current) -- sixperemspace return inject_quad_space(0x2006,head,current,1/6) end, [0x2007] = function(head,current) -- figurespace return inject_char_space(0x2007,head,current,c_zero) end, [0x2008] = function(head,current) -- punctuationspace return inject_char_space(0x2008,head,current,c_period) end, [0x2009] = function(head,current) -- breakablethinspace return inject_quad_space(0x2009,head,current,1/8) -- same as next end, [0x200A] = function(head,current) -- hairspace return inject_quad_space(0x200A,head,current,1/8) -- same as previous (todo) end, [0x200B] = function(head,current) -- zerowidthspace return inject_quad_space(0x200B,head,current,0) end, [0x202F] = function(head,current) -- narrownobreakspace return inject_nobreak_space(0x202F,head,current,fontquads[getfont(current)]/8) end, [0x205F] = function(head,current) -- math thinspace return inject_nobreak_space(0x205F,head,current,4*fontquads[getfont(current)]/18) end, -- The next one is also a bom so maybe only when we have glyphs around it -- [0xFEFF] = function(head,current) -- zerowidthnobreakspace -- return head, current -- end, } characters.methods = methods function characters.handler(head) local wipe = false for current, char in nextchar, head do local method = methods[char] if method then if wipe then head = remove_node(head,wipe,true) wipe = false end if trace_characters then report_characters("replacing character %C, description %a",char,lower(chardata[char].description)) end local h = method(head,current) if h then wipe = current end end end if wipe then head = remove_node(head,wipe,true) end return head end -- function characters.handler(head) -- local wiped = false -- for current, char in nextchar, head do -- local method = methods[char] -- if method then -- if wiped then -- wiped[#wiped+1] = current -- else -- wiped = { current } -- end -- if trace_characters then -- report_characters("replacing character %C, description %a",char,lower(chardata[char].description)) -- end -- local h = method(head,current) -- if h then -- head = h -- end -- end -- end -- if wiped then -- for i=1,#wiped do -- head = remove_node(head,wiped[i],true) -- end -- end -- return head -- end [-- Attachment #3: Type: text/plain, Size: 496 bytes --] ___________________________________________________________________________________ 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 ___________________________________________________________________________________ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: \autoinsertedspace fails 2023-01-04 23:45 ` Hans Hagen via ntg-context @ 2023-01-05 3:21 ` Rik Kabel via ntg-context 2023-01-05 7:38 ` Hans Hagen via ntg-context 2023-01-05 9:35 ` Hans Hagen via ntg-context 0 siblings, 2 replies; 8+ messages in thread From: Rik Kabel via ntg-context @ 2023-01-05 3:21 UTC (permalink / raw) To: mailing list for ConTeXt users; +Cc: Rik Kabel On 2023-01-04 18:45, Hans Hagen wrote: > On 1/4/2023 11:10 PM, Rik Kabel via ntg-context wrote: >> No change with the latest (2023.01.04). >> >> Is this a problem with what I am doing, or a bug? > well, it's new and not thtat tested ... we need to specify it > > This\optionalspace fails unexpectedly with autoinsertedspace.\par > This\optionalspace \emph{fails unexpectedly} with autoinsertedspace.\par > > there can be more variants, like do we want to remove preceding spaces? > > we already have: > > This\optionalspace, fails unexpectedly with autoinsertedspace.\par > This\optionalspace, \emph{fails unexpectedly} with autoinsertedspace.\par > This\optionalspace fails unexpectedly with autoinsertedspace.\par > This\optionalspace \emph{fails unexpectedly} with autoinsertedspace.\par \optionalspace works correctly (that is, as I want it to) for all of my use cases under both MkIV and LMTX. Is there any reason that this should not be used in user documents? I do wonder what characters are considered "punctuation" for the purpose of suppressing the next space. The standard six sentence termination characters (?!.:;,) are honored, and so are many others (quotation marks, including guillemot, square and curly braces, and parens). But sentence opening characters (¿¡) are as well. Vertical bars (|¦) and basic mathematical characters (+-=*) are not treated as punctuation. Where (in the source or manuals) are these to be found? As far as removing leading spaces, I do not see that it is necessary, but it may help create more readable sources. Thank you for the fix. -- Rik ___________________________________________________________________________________ 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 ___________________________________________________________________________________ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: \autoinsertedspace fails 2023-01-05 3:21 ` Rik Kabel via ntg-context @ 2023-01-05 7:38 ` Hans Hagen via ntg-context 2023-01-05 9:35 ` Hans Hagen via ntg-context 1 sibling, 0 replies; 8+ messages in thread From: Hans Hagen via ntg-context @ 2023-01-05 7:38 UTC (permalink / raw) To: ntg-context; +Cc: Hans Hagen On 1/5/2023 4:21 AM, Rik Kabel via ntg-context wrote: > > On 2023-01-04 18:45, Hans Hagen wrote: >> On 1/4/2023 11:10 PM, Rik Kabel via ntg-context wrote: >>> No change with the latest (2023.01.04). >>> >>> Is this a problem with what I am doing, or a bug? >> well, it's new and not thtat tested ... we need to specify it >> >> This\optionalspace fails unexpectedly with autoinsertedspace.\par >> This\optionalspace \emph{fails unexpectedly} with autoinsertedspace.\par >> >> there can be more variants, like do we want to remove preceding spaces? >> >> we already have: >> >> This\optionalspace, fails unexpectedly with autoinsertedspace.\par >> This\optionalspace, \emph{fails unexpectedly} with autoinsertedspace.\par >> This\optionalspace fails unexpectedly with autoinsertedspace.\par >> This\optionalspace \emph{fails unexpectedly} with autoinsertedspace.\par > > > \optionalspace works correctly (that is, as I want it to) for all of my > use cases under both MkIV and LMTX. Is there any reason that this should > not be used in user documents? depends ... it checks punctuation > I do wonder what characters are considered "punctuation" for the purpose > of suppressing the next space. The standard six sentence termination > characters (?!.:;,) are honored, and so are many others (quotation > marks, including guillemot, square and curly braces, and parens). But > sentence opening characters (¿¡) are as well. Vertical bars (|¦) and > basic mathematical characters (+-=*) are not treated as punctuation. > Where (in the source or manuals) are these to be found? we use unicode properties (collected in char-def.lua) > As far as removing leading spaces, I do not see that it is necessary, > but it may help create more readable sources. > > Thank you for the fix. ----------------------------------------------------------------- Hans Hagen | PRAGMA ADE Ridderstraat 27 | 8061 GH Hasselt | The Netherlands tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl ----------------------------------------------------------------- ___________________________________________________________________________________ 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 ___________________________________________________________________________________ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: \autoinsertedspace fails 2023-01-05 3:21 ` Rik Kabel via ntg-context 2023-01-05 7:38 ` Hans Hagen via ntg-context @ 2023-01-05 9:35 ` Hans Hagen via ntg-context 2023-01-06 2:05 ` Rik Kabel via ntg-context 1 sibling, 1 reply; 8+ messages in thread From: Hans Hagen via ntg-context @ 2023-01-05 9:35 UTC (permalink / raw) To: ntg-context; +Cc: Hans Hagen On 1/5/2023 4:21 AM, Rik Kabel via ntg-context wrote: > > On 2023-01-04 18:45, Hans Hagen wrote: >> On 1/4/2023 11:10 PM, Rik Kabel via ntg-context wrote: >>> No change with the latest (2023.01.04). >>> >>> Is this a problem with what I am doing, or a bug? >> well, it's new and not thtat tested ... we need to specify it >> >> This\optionalspace fails unexpectedly with autoinsertedspace.\par >> This\optionalspace \emph{fails unexpectedly} with autoinsertedspace.\par >> >> there can be more variants, like do we want to remove preceding spaces? >> >> we already have: >> >> This\optionalspace, fails unexpectedly with autoinsertedspace.\par >> This\optionalspace, \emph{fails unexpectedly} with autoinsertedspace.\par >> This\optionalspace fails unexpectedly with autoinsertedspace.\par >> This\optionalspace \emph{fails unexpectedly} with autoinsertedspace.\par > > > \optionalspace works correctly (that is, as I want it to) for all of my > use cases under both MkIV and LMTX. Is there any reason that this should > not be used in user documents? > > I do wonder what characters are considered "punctuation" for the purpose > of suppressing the next space. The standard six sentence termination > characters (?!.:;,) are honored, and so are many others (quotation > marks, including guillemot, square and curly braces, and parens). But > sentence opening characters (¿¡) are as well. Vertical bars (|¦) and > basic mathematical characters (+-=*) are not treated as punctuation. > Where (in the source or manuals) are these to be found? > > As far as removing leading spaces, I do not see that it is necessary, > but it may help create more readable sources. > > Thank you for the fix. Here is a more lmtx-ish variant: \starttexdefinition tolerant protected BD #=#*#= \removeunwantedspaces \space % insert a space ( \ifparameter#2\or #1|–|#2 \orelse\ifparameter#1\or #1– \else {\red I NEED A DATE OR DATES!} \fi ) \autoinsertedspace \stoptexdefinition 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 ----------------------------------------------------------------- ___________________________________________________________________________________ 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 ___________________________________________________________________________________ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: \autoinsertedspace fails 2023-01-05 9:35 ` Hans Hagen via ntg-context @ 2023-01-06 2:05 ` Rik Kabel via ntg-context 2023-01-06 7:53 ` Hans Hagen via ntg-context 0 siblings, 1 reply; 8+ messages in thread From: Rik Kabel via ntg-context @ 2023-01-06 2:05 UTC (permalink / raw) To: ntg-context; +Cc: Rik Kabel [-- Attachment #1.1: Type: text/plain, Size: 2992 bytes --] On 2023-01-05 04:35, Hans Hagen via ntg-context wrote: > On 1/5/2023 4:21 AM, Rik Kabel via ntg-context wrote: [ snipped by rik] > Here is a more lmtx-ish variant: > > \starttexdefinition tolerant protected BD #=#*#= > \removeunwantedspaces > \space % insert a space > ( > \ifparameter#2\or > #1|–|#2 > \orelse\ifparameter#1\or > #1– > \else > {\red I NEED A DATE OR DATES!} > \fi > ) > \autoinsertedspace > \stoptexdefinition > > Hans Thank you for that. This works for me with \optionalspace, but fails in some cases with \autoinsertedspace. I have now re-read lowlevel-macros.pdf and have a better understanding of what I read when first I approached it; I still have a way to go. /Tolerant/ removes the need for /dodoubleempty/ and friends and the two-step /macro/ and /doMacro/ dance. There was a small advantage to the two-step, however. I had two separate macros, BD and BDNP (no parens), as shown. The old code in full was: %-------------------- Birth and death dates -----------------------% % Ferdinand de Saussure\BD{1857}{1913} % Noam Chomsky \BD{1928} % % Perhaps this could be tied to an acronym-like database so that the % dates are printed only once per person. % \removeunwantedspaces allows this to directly follow, or follow % after whitespace, the associated name: Name\BD{1}{2} or % Name \BD{1}{2}. % Using the compound indication (|–|) allows hyphenation after the % endash. Omitting it and using a bare endash inhibits hyphenation % ‘twixt the endash and the paren. % By default, add parens around the dates. If none are needed due to % the context, use \BDNP. % \newif\ifBDParen \starttexdefinition unexpanded BD \BDParentrue \dodoublegroupempty \doBD \stoptexdefinition \starttexdefinition unexpanded BDNP \BDParenfalse \dodoublegroupempty \doBD \stoptexdefinition \starttexdefinition doBD #1#2 \removeunwantedspaces\ \ifBDParen(\fi \ifsecondargument #1|–|#2 \else\iffirstargument #1– \else {\red I NEED A DATE OR DATES!} \fi\fi \ifBDParen)\fi \autoinsertedspace \stoptexdefinition Both call the same doBD, but they set a flag (newif) to control insertion or not of the parens. While there is no performance benefit compared to having two fully separate macros, there is a maintenance benefit in having only one place, doBD, to make changes should they be required. Can you suggest a way to do this under the new one-step scheme, or am I over-thinking this? Finally, is there any reason to go back to previously written and properly functioning macros and convert them to the LMTX-only syntax? It does imply committing to LMTX-only (or -- Rik [-- Attachment #1.2: Type: text/html, Size: 4312 bytes --] [-- Attachment #2: Type: text/plain, Size: 496 bytes --] ___________________________________________________________________________________ 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 ___________________________________________________________________________________ ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: \autoinsertedspace fails 2023-01-06 2:05 ` Rik Kabel via ntg-context @ 2023-01-06 7:53 ` Hans Hagen via ntg-context 0 siblings, 0 replies; 8+ messages in thread From: Hans Hagen via ntg-context @ 2023-01-06 7:53 UTC (permalink / raw) To: Rik Kabel via ntg-context; +Cc: Hans Hagen On 1/6/2023 3:05 AM, Rik Kabel via ntg-context wrote: > > On 2023-01-05 04:35, Hans Hagen via ntg-context wrote: >> On 1/5/2023 4:21 AM, Rik Kabel via ntg-context wrote: > > [ snipped by rik] > >> Here is a more lmtx-ish variant: >> >> \starttexdefinition tolerant protected BD #=#*#= >> \removeunwantedspaces >> \space % insert a space >> ( >> \ifparameter#2\or >> #1|–|#2 >> \orelse\ifparameter#1\or >> #1– >> \else >> {\red I NEED A DATE OR DATES!} >> \fi >> ) >> \autoinsertedspace >> \stoptexdefinition >> >> Hans > > Thank you for that. This works for me with \optionalspace, but fails in > some cases with \autoinsertedspace. > > I have now re-read lowlevel-macros.pdf and have a better understanding > of what I read when first I approached it; I still have a way to go. > > /Tolerant/ removes the need for /dodoubleempty/ and friends and the > two-step /macro/ and /doMacro/ dance. There was a small advantage to the > two-step, however. I had two separate macros, BD and BDNP (no parens), > as shown. > > The old code in full was: > > %-------------------- Birth and death dates -----------------------% > % Ferdinand de Saussure\BD{1857}{1913} > % Noam Chomsky \BD{1928} > % > % Perhaps this could be tied to an acronym-like database so that the > % dates are printed only once per person. > % \removeunwantedspaces allows this to directly follow, or follow > % after whitespace, the associated name: Name\BD{1}{2} or > % Name \BD{1}{2}. > % Using the compound indication (|–|) allows hyphenation after the > % endash. Omitting it and using a bare endash inhibits hyphenation > % ‘twixt the endash and the paren. > % By default, add parens around the dates. If none are needed due to > % the context, use \BDNP. > % > \newif\ifBDParen > \starttexdefinition unexpanded BD > \BDParentrue > \dodoublegroupempty > \doBD > \stoptexdefinition > \starttexdefinition unexpanded BDNP > \BDParenfalse > \dodoublegroupempty > \doBD > \stoptexdefinition > \starttexdefinition doBD #1#2 > \removeunwantedspaces\ > \ifBDParen(\fi > \ifsecondargument > #1|–|#2 > \else\iffirstargument > #1– > \else > {\red I NEED A DATE OR DATES!} > \fi\fi > \ifBDParen)\fi > \autoinsertedspace > \stoptexdefinition > > Both call the same doBD, but they set a flag (newif) to control > insertion or not of the parens. While there is no performance benefit > compared to having two fully separate macros, there is a maintenance > benefit in having only one place, doBD, to make changes should they be > required. > > Can you suggest a way to do this under the new one-step scheme, or am I > over-thinking this? just remove the #* in the example i sent, \starttexdefinition tolerant protected BD #=#= 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 ----------------------------------------------------------------- ___________________________________________________________________________________ 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 ___________________________________________________________________________________ ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2023-01-06 7:53 UTC | newest] Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2022-12-30 0:12 \autoinsertedspace fails Rik Kabel via ntg-context 2023-01-04 22:10 ` Rik Kabel via ntg-context 2023-01-04 23:45 ` Hans Hagen via ntg-context 2023-01-05 3:21 ` Rik Kabel via ntg-context 2023-01-05 7:38 ` Hans Hagen via ntg-context 2023-01-05 9:35 ` Hans Hagen via ntg-context 2023-01-06 2:05 ` Rik Kabel via ntg-context 2023-01-06 7:53 ` Hans Hagen via ntg-context
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).