\ifcase 和宏扩展

\ifcase 和宏扩展

有一些代码。我删除不相关的部分并得到测试一:

\documentclass[a4paper,11pt]{extarticle}
\begin{document}

\newcommand{\mystrA}{%
  a%
  \or b%
  \or c%
  \else d%
}
\newcommand{\mystrB}{%
  e%
  \or f%
  \else g%
}
\newcommand{\mystr}{\mystrA}

\newcounter{str}

\newcommand{\usestr}{%
  \ifcase\value{str}\mystr\fi%
  \addtocounter{str}{1}%
}

\usestr,\usestr,\usestr,\usestr,\usestr
\end{document}

并使用 pdflatex 编译后我得到:

编译的本质

但我期望得到结果“a,b,c,d”......

那么问题来了。哪里出了问题?为什么 \ifcase 对大于零的计数器值不提供任何内容?

以及如何正确地重写代码以达到我的预期?

答案1

 \ifcase\value{str}\mystr\fi%

因此 TeX 会进行扩展\value以获取一个数字来进行测试,\ifcase如果该数字大于 0,则会跳过不扩大找到匹配的\or\fi并找到\fi所以的扩展为空。

我会用

\documentclass[a4paper,11pt]{extarticle}
\begin{document}

\newcommand{\mystrA}[1]{%
 \ifcase#1%
  a%
  \or b%
  \or c%
  \else d%
 \fi
}
\newcommand{\mystrB}[1]{%
 \ifcase#1%
  e%
  \or f%
  \else g%
 \fi
}
\newcommand{\mystr}{\mystrA}

\newcounter{str}

\newcommand{\usestr}{%
  \mystr{\value{str}}%
  \addtocounter{str}{1}%
}

\usestr,\usestr,\usestr,\usestr,\usestr
\end{document}

答案2

TeX 永远看不到\or,除非其str值为 0。

\mystr您可以在评估条件之前强制完全展开。请注意,如果\mystrA以数字开头,您将得到意想不到的结果。

\documentclass{article}

\newcommand{\mystrA}{%
  a%
  \or b%
  \or c%
  \else d%
}
\newcommand{\mystrB}{%
  e%
  \or f%
  \else g%
}
\newcommand{\mystr}{\mystrA}

\newcounter{str}

\newcommand{\usestr}{%
  \ifcase\number\value{str}\mystr\fi
  \addtocounter{str}{1}%
}

\begin{document}

\usestr,\usestr,\usestr,\usestr,\usestr

\end{document}

在此处输入图片描述

这是一个更灵活的设置:

\documentclass{article}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\definecasesmacro}{O{str}mmm}
 {
  \cs_new:Npn #2
   {
    \int_case:nnF { \value{#1} } { #3 } { #4 }
   }
 }
\ExplSyntaxOff

\newcounter{str}

\definecasesmacro{\mystr}
  {
   {0}{a}
   {1}{b}
   {2}{c}
   {4}{Hey!}
  }
  {d}

\newcommand{\usestr}{\mystr\stepcounter{str}}

\begin{document}

\usestr,\usestr,\usestr,\usestr,\usestr

\end{document}

在此处输入图片描述

相关内容