newsavebox 以计数器命名

newsavebox 以计数器命名

我正在尝试编写一个宏来自动创建一定数量的保存框。因此,我想使用字符串值和计数器的连接来命名保存框。我尝试了以下操作,每次尝试使用它时,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

相关内容