我想要一个宏,如果像这样调用,它会产生 N 个空格
\mulspc{3} % Produces exactly 3 spaces
\newcommand{\mulspc}[1]{
\newcounter{ctra}
\setcounter{ctra}{0}
\whiledo {\value{ctra} < #1}%
{
\hspace*{2mm}
\stepcounter{ctra}
}
}
但是我遇到了一个问题,如果我调用零次,这个宏不会在表格单元格中产生 0mm 间距(就在单元格的开头!)\multspc{0}
。总是会有一些缩进,但这是从哪里来的呢?
我需要这个宏来在表格单元格中缩进一些算法,它很讨厌,但手动格式化给了我在长表中最好的结果,因为它有多页长......
感谢您的帮助!
答案1
不需要使用循环:
\newlength\Unit
\setlength\Unit{2mm}
\newcommand\mulspc[1]{\hspace*{#1\Unit}}
foo\mulspc{4}bar
答案2
当前宏的问题在于,由于缩进,它添加了不必要的空格。添加一些%
行尾来消除这些空格。但是,当前定义在使用\mulspc
多次后也会产生警告。这是因为计数器定义\newcounter{ctra}
包含在内\newcommand{\mulspc}
。而是定义计数器外部宏定义。另一个缺点是,提供的空间\mulspc{0}
应该不存在,即使您添加以删除不需要的空格,事实并非如此%
。例如,代码:
\documentclass{article}
\usepackage{xifthen}
\newcounter{ctra}%
\newcommand{\mulspc}[1]{
\setcounter{ctra}{0}%
\whiledo {\value{ctra} < #1}%
{\hspace*{2mm}\stepcounter{ctra}}%
}
\begin{document}
\fbox{\mulspc{0}}% Zero spaces
\fbox{}% Empty \fbox
\fbox{\mulspc{1}} % One space
\fbox{\mulspc{3}} % Produces exactly 3 spaces
\end{document}
生成:
为了消除这种间距,您可以对传递给的参数使用条件\mulspc
:
\newcommand{\mulspc}[1]{
\ifthenelse{#1>0}{%
\setcounter{ctra}{0}%
\whiledo {\value{ctra} < #1}%
{\hspace*{2mm}\stepcounter{ctra}}%
}{\unskip}%
}
\unskip
如果传递的参数值小于,则提供以下内容1
。这将产生:
另一种选择是使用multido
包裹,并定义(比如)
\usepackage{multido}% A loop facility for Generic TeX
...
\newcommand{\Mulspc}[1]{%
\multido{\iA=0+1}{#1}{\hspace*{2mm}}%
}
您可以以类似的方式使用它,并且代码更加简洁。
答案3
eTeX 现在随时可用,因此你可以简单地使用
\newcommand\mulspc[1]{\hspace*{#1\dimexpr2mm}}