我正在尝试编写一个宏来自动创建一定数量的保存框。因此,我想使用字符串值和计数器的连接来命名保存框。我尝试了以下操作,每次尝试使用它时,LaTeX 都会抱怨“缺少插入的控制序列”。
\newcounter{saveboxCount}
\newsavebox{MyString\alpha{saveboxCount}}
答案1
下面将创建保存箱\MyStringa
:\MyStringz
\makeatletter
\count@=0
\loop\ifnum\count@<26
\advance\count@\@ne
\expandafter\newsavebox\csname MyString\@alph\count@\endcsname
\repeat
\makeatother
它也很简单(甚至更简单)expl3
:
\usepackage{expl3}
\ExplSyntaxOn
% loop from 1 to 26, #1 denotes the current value in the cycle
\int_step_inline:nn { 26 }
{
\exp_args:Nc \newsavebox { MyString \int_to_alph:n { #1 } }
}
\ExplSyntaxOff
在实际执行之前\exp_args:Nc
,我们跳过\newsavebox
并从括号内的参数中形成一个控制序列标记。\newsavebox
在日志文件中,我们会发现类似
\MyStringa=\box46
\MyStringb=\box47
\MyStringc=\box48
[...similar lines...]
\MyStringy=\box70
\MyStringz=\box71
确认分配已完成。
答案2
使用 时xsavebox
,框不需要声明而是即时创建,并且通过名称而不是命令来寻址:
\documentclass{article}
\usepackage{xsavebox}
\usepackage{pgffor}
\begin{document}
\noindent\foreach \idx in {a,b,...,z} {%
\xsbox{myString \idx}{That's what I saved: \idx}%
}%
%
\foreach \idx in {a,b,...,z} {%
\noindent\xusebox{myString \idx}\par
}
\end{document}
Pkgxsavebox
总共分配了 2 个 TeX box 寄存器:
\l_xsb_box=\box45
\l_xsb_raw_box=\box46