我试图制作一个根据可选参数 x、x-many'
符号给出的命令。
\documentclass[a4paper]{article}
\usepackage{ifthen}
\newcounter{i}%
\newcommand{\commu}[2][]{%
\setcounter{i}{1}%
\newtoks\striche%
\striche={'}%
\ifthenelse{\equal{#1}{}}{}{
\loop%
\ifnum\value{i}<#1%
\striche=\expandafter{\the\expandafter\striche '}%
\stepcounter{i}%
\repeat%
}%
{#2}\the\striche
}
\begin{document}
$\commu{\commu[2]{C}}$
\end{document}
我期望${{C}''}'$
但似乎外部\commu
将被忽略因为我只得到了${C}''$
。
问题是什么?
答案1
应该\newtoks
在你的宏之外。另外,你不需要使用 1 来特殊处理\ifthenelse
——只需为 #1 设置一个默认值:
\documentclass{article}
\begin{document}
\newcounter{i}%
\newtoks\striche%
\newcommand{\commu}[2][1]{%
\setcounter{i}{1}%
\striche={'}%
\loop%
\ifnum\value{i}<#1%
\striche=\expandafter{\the\expandafter\striche'}%
\stepcounter{i}%
\repeat%
{#2}\the\striche%
}
$\commu{\commu[2]{C}}$
$\commu[2]{C}$
$\commu{C}$
\end{document}
得出的结果为:
答案2
正如我在评论中所说的,您应该将 移到\newtoks
宏定义之外。如果您已经使用ifthen
包,则可以使用它\whiledo
代替低级 TeX \loop…\repeat
:
\documentclass[a4paper]{article}
\usepackage{ifthen}
\newcounter{i}%
\newtoks\striche%
\newcommand{\commu}[2][1]{%
\setcounter{i}{1}%
\striche={'}%
\whiledo{\not\equal{#1}{\value{i}}}{%
\striche=\expandafter{\the\expandafter\striche'}%
\stepcounter{i}%
}%
{#2}\the\striche
}
\begin{document}
$\commu{\commu[2]{C}}$
$\commu{C}$
$\commu[3]{C}$
\end{document}