pgfmathsetmacro 不起作用

pgfmathsetmacro 不起作用

请问这为什么不起作用:

\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,而你应该使用内部ifthenelsepgfmath 函数的代码。此外,手册中给出的示例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}

在此处输入图片描述

相关内容