迭代循环宏

迭代循环宏

我试图制作一个根据可选参数 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}

得出的结果为:

enter image description here

答案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}

enter image description here

答案3

mwe

\documentclass{article}
\usepackage{tikz}
\newcommand\C[1]{C\foreach \ii in {1,...,#1}{{}'}}
\begin{document} 
$\C{1}$ $\C{3}$ $\C{8}$ 
\end{document}

相关内容