Como posso definir um contador para o resultado de um comando?

Como posso definir um contador para o resultado de um comando?

Tenho um documento onde gostaria de definir vários contadores em termos de outros contadores.

Para fazer isso criei um comando que calcula o relacionamento entre esses contadores.

\newcommand{\modifier}[1]{
 \ifthenelse{\value{#1} < 9}{-1}{
 \ifthenelse{\value{#1} < 13}{0}{
 \ifthenelse{\value{#1} < 16}{1}{2}}}
}

No entanto, quando tento usar o comando para definir contadores

\newcounter{strength}
\setcounter{strength}{11}
\newcounter{dexterity}
\setcounter{dexterity}{15}
\newcounter{str}    
\setcounter{str}{\modifier{strength}}
\newcounter{dex}
\setcounter{dex}{\modifier{dexterity}}

O compilador reclama que não há número no segundo campo do \setcountercomando.

Como posso definir meu segundo contador em relação ao primeiro usando um comando?

Responder1

Você precisa de testes expansíveis para uso no \setcounter, o que \ifthenelsenão é.

Existem outras soluções com etoolbox, mas vou apresentar uma com expl3.

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn

\NewExpandableDocumentCommand{\modifier}{m}
 {
  \int_compare:nTF { \value{#1} < 9 }
   { -1 }
   {
    \int_compare:nTF { \value{#1} < 13 }
     { 0 }
     {
      \int_compare:nTF { \value{#1} < 16 }
       { 1 }
       { 2 }
     }
   }
 }
\ExplSyntaxOff

\newcounter{strength}
\newcounter{dexterity}
\newcounter{str}    
\newcounter{dex}

\begin{document}

\setcounter{strength}{11}
\setcounter{dexterity}{15}
\setcounter{str}{\modifier{strength}}
\setcounter{dex}{\modifier{dexterity}}

strength: \arabic{strength}

dexterity: \arabic{dexterity}

str: \arabic{str}

dex: \arabic{dex}

\end{document}

insira a descrição da imagem aqui

Responder2

As \ifthenelseavaliações não são expansíveis. Aqui está uma implementação de (La)TeX que oferece capacidade de expansão:

insira a descrição da imagem aqui

\documentclass{article}

\newcommand{\modifier}[1]{%
  \ifnum\value{#1}<9 -1
  \else\ifnum\value{#1}<13 0
  \else\ifnum\value{#1}<16 1
  \else 2
  \fi\fi\fi
}

\begin{document}

\newcounter{strength}
\setcounter{strength}{11}
\newcounter{dexterity}
\setcounter{dexterity}{15}
\newcounter{str}    
\setcounter{str}{\modifier{strength}}
\newcounter{dex}
\setcounter{dex}{\modifier{dexterity}}

strength: \thestrength

dexterity: \thedexterity

str: \thestr

dex: \thedex

\end{document}

informação relacionada