TransWikia.com

How do I make `item` labels to be computed modulo 4 (to see it on a small example)

TeX - LaTeX Asked on November 1, 2021

How do I make item labels to be computed modulo 4 (to see it on a small example) .
Then I change it to modulo 1000 in my final project.

documentclass{article}

usepackage[no-math]{fontspec}
 
newfontfamilyngg{Segoe UI Historic}[Ligatures=TeX]
 
usepackage{enumitem}
begin{document}
begin{enumerate}[ label=largenggsymbol{numexpr "13000+value{enumi}}]

item this label should be {nggsymbol{"13001}} and is such
item this label should be {nggsymbol{"13002}} and is such
item this label should be {nggsymbol{"13003}} and is such
item this label should be {nggsymbol{"13001}} but is {nggsymbol{"13004}}
item this label should be {nggsymbol{"13002}} but is {nggsymbol{"13005}}
item this label should be {nggsymbol{"13003}} but is {nggsymbol{"13006}}
item this label should be {nggsymbol{"13001}} but is {nggsymbol{"13007}}
item etc. 13000+i modulo 4
end{enumerate}
end{document}

I apologize for a small typo (in my intended modulo 4 operation) but the idea
should be clear.

enter image description here

3 Answers

Hook properly in enumitem. I used modulo 3, which is what you actually have in your example.

documentclass{article}

usepackage[no-math]{fontspec}
 
newfontfamilyngg{SegoeUIHistoric.ttf}[Ligatures=TeX,Scale=1.2]

usepackage{enumitem,xparse}

ExplSyntaxOn
NewDocumentCommand{nggcounter}{m}
 {
  group_begin:
  ngg
  symbol
   {
    int_eval:n { "13001 + int_mod:nn { value{#1} - 1 } { 3 } } % change here the modulus
   }
  group_end:
 }
ExplSyntaxOff

makeatletter
newcommand{@nggcounter}[1]{#1}
AddEnumerateCounter{nggcounter}{@nggcounter}{{nggsymbol{"13001}}}
makeatother

begin{document}

begin{enumerate}[label=nggcounter*]

item this label should be {nggsymbol{"13001}}
item this label should be {nggsymbol{"13002}}
item this label should be {nggsymbol{"13003}}
item this label should be {nggsymbol{"13001}}
item this label should be {nggsymbol{"13002}}
item this label should be {nggsymbol{"13003}}
item this label should be {nggsymbol{"13001}}
item etc. 13000+i modulo 3

end{enumerate}

end{document}

enter image description here

Answered by egreg on November 1, 2021

Here an example that can grow. But I didn't check if your font has 1000 consecutive glyphs starting from 13000, so it is quite possible that you will get missings glyphs somewhere in the middle:

documentclass{article}

usepackage[no-math]{fontspec}

newfontfamilyngg{Segoe UI Historic}[Ligatures=TeX]

usepackage{enumitem}
ExplSyntaxOnmakeatletter
cs_new_protected:Npn @moduloitem #1
  {
   ngg
    char
     int_eval:n
      {
        int_mod:nn{int_use:c{#1}}{modulolength}
        +
        exp_args:Noint_from_hex:n{modulostart}
      }
  }
newcommandmoduloitem[1]{@moduloitem{c@#1}}  
newcommandmodulostart{13000}   %adapt
newcommandmodulolength{3}      %adapt
AddEnumerateCounter{moduloitem}{@moduloitem}{AA}
ExplSyntaxOffmakeatother
begin{document}
begin{enumerate}[ label=moduloitem*]

item this label should be {nggsymbol{"13001}} and is such
item this label should be {nggsymbol{"13002}} and is such
item this label should be {nggsymbol{"13003}} and is such
item this label should be {nggsymbol{"13001}} but is {nggsymbol{"13004}}
item this label should be {nggsymbol{"13002}} but is {nggsymbol{"13005}}
item this label should be {nggsymbol{"13003}} but is {nggsymbol{"13006}}
item this label should be {nggsymbol{"13001}} but is {nggsymbol{"13007}}
item etc. 13000+i modulo 4
end{enumerate}
end{document}

Answered by Ulrike Fischer on November 1, 2021

Firstly, by your example, what you want is modulo 3, not 4. Here is an example making use of enumitem's AddEnumerateCounter.

documentclass{article}

usepackage[no-math]{fontspec}

newfontfamilyngg{Segoe UI Historic}[Ligatures=TeX]
 
usepackage{enumitem}
makeatletter
defhistoricCnt#1{expandafter@historicCntcsname c@#1endcsname}
def@historicCnt#1{%
  ifcase#10or1or2or3%
  else
    expandafter@historicCntexpandafter{numexpr#1-3relax}%
  fi
}

AddEnumerateCounter{historicCnt}{@historicCnt}{XX}
makeatother


begin{document}
begin{enumerate}[label=largenggsymbol{numexpr "13000+historicCnt*relax}]

item this label should be {nggsymbol{"13001}} and is such
item this label should be {nggsymbol{"13002}} and is such
item this label should be {nggsymbol{"13003}} and is such
item this label should be {nggsymbol{"13001}} but is {nggsymbol{"13004}}
item this label should be {nggsymbol{"13002}} but is {nggsymbol{"13005}}
item this label should be {nggsymbol{"13003}} but is {nggsymbol{"13006}}
item this label should be {nggsymbol{"13001}} but is {nggsymbol{"13007}}
item etc. 13000+i modulo 4
end{enumerate}
end{document}

enter image description here

Update

A new latex3 flavored function iten_mod:nn is defined, it accepts two integers #1 and #2, and returns #1 mod #2 if (#1 mod #2) > 0, otherwise #2. You can use it to accomplish "mod 1000" or similar tasks.

documentclass{article}
usepackage{enumitem}
usepackage[no-math]{fontspec}

newfontfamilyngg{Segoe UI Historic}[Ligatures=TeX]


makeatletter
ExplSyntaxOn

% register historicCnt as a new counter representation
AddEnumerateCounter{historicCnt}{@historicCnt}{XX}

% define historicCnt
defhistoricCnt#1{
  expandafter@historicCntcsname c@#1endcsname
}

def@historicCnt#1{
  item_mod:nn {#1}{3}
}

% return (#1 mod #2) if (#1 mod #2) > 0 else #2
cs_new:Nn item_mod:nn
  {
    1 + int_mod:nn {#1-1}{#2}
  }

makeatother
ExplSyntaxOff


begin{document}
begin{enumerate}[label=largenggsymbol{numexpr "13000+historicCnt*relax}]

item this label should be {nggsymbol{"13001}} and is such
item this label should be {nggsymbol{"13002}} and is such
item this label should be {nggsymbol{"13003}} and is such
item this label should be {nggsymbol{"13001}} but is {nggsymbol{"13004}}
item this label should be {nggsymbol{"13002}} but is {nggsymbol{"13005}}
item this label should be {nggsymbol{"13003}} but is {nggsymbol{"13006}}
item this label should be {nggsymbol{"13001}} but is {nggsymbol{"13007}}
item etc. 13000+i modulo 3
end{enumerate}

end{document}

Answered by muzimuzhi Z on November 1, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP