コマンドの結果にカウンターを設定するにはどうすればよいですか?

コマンドの結果にカウンターを設定するにはどうすればよいですか?

他のカウンターに関していくつかのカウンターを定義したいドキュメントがあります。

これを実現するために、これらのカウンター間の関係を計算するコマンドを作成しました。

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

しかし、コマンドを使用してカウンターを設定しようとすると

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

コンパイラは、コマンドの 2 番目のフィールドに数値がないことを報告します\setcounter

コマンドを使用して、最初のカウンターを基準にして 2 番目のカウンターを設定するにはどうすればよいでしょうか?

答え1

での使用には拡張可能なテストが必要です\setcounterが、これは\ifthenelse実現されていません。

を使用した他のソリューションもありますetoolboxが、ここでは を使用したソリューションを紹介します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}

ここに画像の説明を入力してください

答え2

評価\ifthenelseは拡張できません。拡張性を提供する (La)TeX 実装を次に示します。

ここに画像の説明を入力してください

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

関連情報