请问这为什么不起作用:
\newcommand\bareme[1]
{\ifthenelse{\equal{#1}{1}}{5}{}
\ifthenelse{\equal{#1}{2}}{8}{}
\ifthenelse{\equal{#1}{3}}{7}{}
\ifthenelse{\equal{#1}{4}}{9}{}
\ifthenelse{\equal{#1}{5}}{1}{}}
\pgfmathsetmacro{\points}{\bareme{1}}
谢谢
答案1
您的代码的主要问题是您没有使用正确的语法。如果您查看当前pgf 手册(版本 3.0.1a),那么你会发现 pgf 提供了一个\pgfmathifthenelse{x}{y}{z}
命令,你可以在\pgfmathparse
或内使用\pgfmathsetmacro
它作为函数ifthenelse(x,y,z)
。因此,你的代码使用的是独立宏的语法\pgfmathifthenelse
,而你应该使用内部ifthenelse
pgfmath 函数的代码。此外,手册中给出的示例ifthenelse
是
\pgfmathparse{ifthenelse(5==4,"yes","no")} \pgfmathresult
因此您的使用\equal{...}
是不正确且不必要的。
其次,我认为定义一个宏并将其提供给 不是一个好主意\pgfmathsetmacro
。相反,我会直接设置宏\points
:
\newcommand\bareme[1]{%
\pgfmathsetmacro{\points}{ifthenelse(#1==1,5,
ifthenelse(#1==2, 8,
ifthenelse(#1==3, 7,
ifthenelse(#1==4, 9,
ifthenelse(#1==5, 1,"")))))}%
}
这当然可行。另一方面,有一种更简单的方法可以使用 TeX\ifcase
命令来执行您想要的操作:
\newcommand\Bareme[1]{%
\ifcase #1\or 5% have to skip 0
\or 8%
\or 7%
\or 9%
\or 1%
\else ?%
\fi%
}
为了完整起见,这里是完整的代码:
\documentclass{article}
\usepackage{pgfmath}
\newcommand\bareme[1]{%
\pgfmathsetmacro{\points}{ifthenelse(#1==1,5,
ifthenelse(#1==2, 8,
ifthenelse(#1==3, 7,
ifthenelse(#1==4, 9,
ifthenelse(#1==5, 1,"")))))}%
}
\newcommand\Bareme[1]{%
\ifcase #1\or 5% have to skip 0
\or 8%
\or 7%
\or 9%
\or 1%
\else ?%
\fi%
}
\begin{document}
\bareme{1} \points
\Bareme{1}
\Bareme{2}
\Bareme{3}
\end{document}
答案2
它不起作用,因为\ifthenelse{\equal{1}{#1}}{A}{B}
是一组指令印刷要么是 A,要么是 B,但结果却不是令人满意的形式\pgfmathsetmacro
(它不是完全可扩展)。
如果合法输入是1到5的整数,则可以使用数组:
\documentclass{article}
\usepackage{pgfmath}
\newcommand*{\baremeoutput}{{5,8,7,9,1}}
\newcommand*{\bareme}[1]{%
\pgfmathsetmacro{\points}{\baremeoutput[#1-1]}%
}
\begin{document}
\bareme{1}\points
\bareme{2}\points
\bareme{3}\points
\bareme{4}\points
\bareme{5}\points
\end{document}
由于 PGF 数组从零开始,因此必须移动索引。
采用不同的方法expl3
,也可以用于非连续索引。
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\bareme}{m}
{
\tl_set:Nf \points
{
\int_case:nn { #1 }
{
{1}{5}
{2}{8}
{3}{7}
{4}{9}
{5}{1}
}
}
}
\ExplSyntaxOff
\begin{document}
\bareme{1}\points
\bareme{2}\points
\bareme{3}\points
\bareme{4}\points
\bareme{5}\points
\end{document}