¿Cómo puedo configurar un contador para el resultado de un comando?

¿Cómo puedo configurar un contador para el resultado de un comando?

Tengo un documento donde me gustaría definir una cantidad de contadores en términos de otros contadores.

Para hacer esto, he creado un comando que calcula la relación entre estos contadores.

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

Sin embargo, cuando intento utilizar el comando para configurar contadores

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

El compilador se queja de que no hay ningún número en el segundo campo del \setcountercomando.

¿Cómo puedo configurar mi segundo contador en términos del primero usando un comando?

Respuesta1

Necesita pruebas ampliables para su uso \setcounter, lo cual \ifthenelseno es así.

Hay otras soluciones con etoolbox, pero presentaré una con 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}

ingrese la descripción de la imagen aquí

Respuesta2

Las \ifthenelseevaluaciones no son ampliables. Aquí hay una implementación de (La)TeX que proporciona capacidad de expansión:

ingrese la descripción de la imagen aquí

\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}

información relacionada