有一些代码。我删除不相关的部分并得到测试一:
\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}