Wie kann ich einen Zähler für das Ergebnis eines Befehls setzen?

Wie kann ich einen Zähler für das Ergebnis eines Befehls setzen?

Ich habe ein Dokument, in dem ich eine Anzahl von Zählern in Bezug auf andere Zähler definieren möchte.

Zu diesem Zweck habe ich einen Befehl erstellt, der die Beziehung zwischen diesen Zählern berechnet.

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

Wenn ich jedoch versuche, den Befehl zum Setzen von Zählern zu verwenden,

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

Der Compiler beschwert sich, dass im zweiten Feld des \setcounterBefehls keine Zahl steht.

Wie kann ich meinen zweiten Zähler per Befehl in Bezug auf den ersten setzen?

Antwort1

Sie benötigen erweiterbare Tests für die Verwendung in \setcounter, was \ifthenelsenicht der Fall ist.

Es gibt andere Lösungen mit etoolbox, aber ich stelle eine mit vor 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}

Bildbeschreibung hier eingeben

Antwort2

Die \ifthenelseAuswertungen sind nicht erweiterbar. Hier ist eine (La)TeX-Implementierung, die Erweiterbarkeit bietet:

Bildbeschreibung hier eingeben

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

verwandte Informationen