如何使用 newcommand 动态生成循环长度

如何使用 newcommand 动态生成循环长度

带有变量计数器的 Latex 中的基本循环。我想插入 x 个空格...

\newcommand{\insertspace}[1]{
     \newcount\foo
     \foo={#1}
     \loop
         ~ 
         \advance \foo -1
    \ifnum \foo>0
    \repeat
}

此调用给我一个错误:Missing number, treated as zero.我认为这是由于 foo 计数器无法识别参数。(drawbox 在 MWE 中定义)

\drawbox{black!100}{5.2cm}{\insertspace{7} Hi im box}

结果:

结果

如果计数器是静态的,则 insertspace 循环会起作用。当我在其他地方引用该参数时,它也会显示该参数。这与数据类型有关吗?

梅威瑟:

\documentclass{article}

\usepackage{tikz}                                                           
\usetikzlibrary{positioning} 

\begin{document}

    \newcommand{\insertspace}[1]{
        \newcount\foo
        \foo={#1}
        \loop
            ~~ hi 
             \advance \foo -1
        \ifnum \foo>0
        \repeat
        }

    \newcommand{\drawbox}[3]{ % 1->color ---- 2 -> width of box ----- 3-> text
        \begin{tikzpicture}
            \node[draw, fill={#1},rectangle,text width={#2}, text = white] {\color{white}\fontsize{6pt}{6pt}\selectfont #3};
        \end{tikzpicture}
    }

    \drawbox{black!100}{5.2cm}{\insertspace{7} Hi im box}

\end{document}

答案1

您几乎已经成功了。
只需进行一些修改即可使其正常工作:

\documentclass{article}

\usepackage{tikz}                                                           
\usetikzlibrary{positioning} 

\newcount\foo

\newcommand{\insertspace}[1]{%
    \foo=#1\relax
    \loop
       ~%
      \advance\foo-1 %
    \ifnum \foo>0 %
    \repeat
    \ignorespaces
}%

\newcommand{\drawbox}[3]{% 1->color ---- 2 -> width of box ----- 3-> text
    \begin{tikzpicture}
    \node[draw, fill={#1},rectangle,text width={#2}, text = white] {\color{white}\fontsize{6pt}{6pt}\selectfont #3};
    \end{tikzpicture}%
}%

\begin{document}
    \drawbox{black!100}{5.2cm}{\insertspace{7}Hi im box}

    \drawbox{black!100}{5.2cm}{\insertspace{7} Hi im box}
\end{document}

也许你对不使用 -register 的变体感兴趣\count

\documentclass{article}

\usepackage{tikz}                                                           
\usetikzlibrary{positioning} 

\newcommand{\insertspace}[1]{%
    \expandafter\insertspaceloop\romannumeral\number\number#1 000\relax
}%
\newcommand{\insertspaceloop}[1]{%
    \ifx\relax#1\ignorespaces\else~\expandafter\insertspaceloop\fi
}%
\newcommand{\drawbox}[3]{% 1->color ---- 2 -> width of box ----- 3-> text
    \begin{tikzpicture}
    \node[draw, fill={#1},rectangle,text width={#2}, text = white] {\color{white}\fontsize{6pt}{6pt}\selectfont #3};
    \end{tikzpicture}%
}%

\begin{document}
    \drawbox{black!100}{5.2cm}{\insertspace{7}Hi im box}

    \drawbox{black!100}{5.2cm}{\insertspace{7} Hi im box}
\end{document}

答案2

低级 TeX 计数器的语法是\foo <optional equal> <number> <space or \relax>并且没有括号(它不是参数)。但您不应该将其放入\newcount定义中,而应该将其放在定义之外。否则,每次调用宏时,您都会分配一个寄存器。

答案3

需要一个循环?

技巧:当前字体中的正常单词间距可用为\fontdimen2\font

使用下面的代码,\insertspaces{2.5}如果您愿意,您还可以说,甚至\insertspaces{-3}

\documentclass{article}

\usepackage{tikz}                                                           
\usetikzlibrary{positioning} 

\newcommand{\insertspace}[1]{\hspace*{#1\fontdimen2\font}\ignorespaces}

\newcommand{\drawbox}[3]{% 1->color ---- 2 -> width of box ----- 3-> text
  \begin{tikzpicture}
  \node[draw, fill={#1},rectangle,text width={#2}, text = white]
    {\color{white}\fontsize{6pt}{6pt}\selectfont #3};
  \end{tikzpicture}%
}

\begin{document}

\drawbox{black!100}{5.2cm}{\insertspace{0} Hi im box}

\drawbox{black!100}{5.2cm}{\insertspace{1} Hi im box}

\drawbox{black!100}{5.2cm}{\insertspace{2} Hi im box}

\drawbox{black!100}{5.2cm}{\insertspace{3} Hi im box}

\drawbox{black!100}{5.2cm}{\insertspace{4} Hi im box}

\drawbox{black!100}{5.2cm}{\insertspace{5} Hi im box}

\drawbox{black!100}{5.2cm}{\insertspace{6} Hi im box}

\drawbox{black!100}{5.2cm}{\insertspace{7} Hi im box}

\end{document}

在此处输入图片描述

相关内容