
他のカウンターに関していくつかのカウンターを定義したいドキュメントがあります。
これを実現するために、これらのカウンター間の関係を計算するコマンドを作成しました。
\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}