ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
* \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).