如何在 foreach 循环中创建编号命名的保存箱?

如何在 foreach 循环中创建编号命名的保存箱?

在此处输入图片描述

有没有创建编号保存框的主要方法?例如:\usebox{box-1}, \usebox{box-2}, \usebox{box-3}

以下 MWE 没有给出错误,但没有输出。PS
:这似乎很清楚为什么这行不通。所以问题是,如何让它工作(与进一步的错误分析相反)。

\documentclass{article}
\usepackage{tikz}
\begin{document}
\foreach \n in {1,2,3}{
\expandafter\newsavebox\csname box-\n\endcsname
\expandafter\savebox\csname box-\n\endcsname{The content No. \n}
}
Test: \expandafter\usebox\csname box-3\endcsname
\end{document}

答案1

您可以尝试xsavebox使用 PDF XObjects 在 PDF 中仅存储一次内容。此外,框不需要声明并且具有全局范围:

\documentclass{article}

\usepackage{tikz}
\usepackage{xsavebox}

\begin{document}
\foreach \n in {1,2,3}{
  \xsbox{box-\n}{The content No. \n}
}  
Test: \xusebox{box-3}
\end{document}

另外,还有一种expl3将内容保存在具有全局范围的 TeX 框中的方法:

\documentclass{article}

\usepackage{tikz}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \sboxx{<box name>}{<content>}
% \useboxx{<box name>}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\ExplSyntaxOn
\NewDocumentCommand{\sboxx}{mm}{
  \box_clear_new:c{cis-box-#1}\hbox_gset:cn{cis-box-#1}{#2}
}
\NewDocumentCommand{\useboxx}{m}{\box_use:c{cis-box-#1}}
\ExplSyntaxOff
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\begin{document}
\foreach \n in {1,2,3}{
  \sboxx{box-\n}{The content No. \n}
}%  
Test: \useboxx{box-3}

\foreach \n in {1,2,3}{ % Re-use existing boxes
  \sboxx{box-\n}{The content No. \n a}
}%  
Test: \useboxx{box-3}
\end{document}

答案2

pgf命令\foreach形成一个组,因此您会在循环结束时丢失所有定义。我会在这里使用该expl3函数\int_step_inline:nnnn,将其包装在文档命令中

\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand \ForEach { O { 1 } m O { 1 } +m }
  { \int_step_inline:nnnn {#1} {#3} {#2} {#4} }
\ExplSyntaxOff

\begin{document}
\ForEach{3}{
\expandafter\newsavebox\csname box-#1\endcsname
\expandafter\savebox\csname box-#1\endcsname{The content No. #1}
}
Test: \expandafter\usebox\csname box-1\endcsname
\end{document}

通过给出的参数规范,我们可以将起始值作为第一个可选参数,并将步长作为两个强制参数之间的可选参数。

答案3

从其他答案来看,:c参数签名似乎工作正常,因此一切都可以在 expl3 中完全完成:

盒子98

包括一个使用数字(比如说)或其他任意字符串的用户框访问函数(\myboxnum在示例中)。

平均能量损失

\documentclass{article}
\usepackage{tcolorbox}
\tcbuselibrary{skins,xparse}
\tcbuselibrary{listings}
\DeclareTCBListing{mybox}{ s O{} m }{%
colback=red!3!white,
colframe=red!75!blue,
fonttitle=\sffamily\bfseries,
bicolor,
colbacklower=yellow!20,
segmentation style={double=white,draw=blue,
double distance=1pt,solid},
listing options={style=tcblatex,numbers=left,numberstyle=\small\color{blue!75!black},numbersep=5pt},
title=\getegcounter\ -- #3,#2}



\ExplSyntaxOn
%==============================
\newcounter{ic_eg_count}[section]
\cs_new:Nn \ic_get_egnum: {
\refstepcounter{ic_eg_count}[\thesection.\theic_eg_count]
}

\cs_set_eq:NN \getegcounter \ic_get_egnum:
\ExplSyntaxOff


%========================================
\begin{document}

\section{Test}


%===================== 
\begin{mybox}{Box 4}
\ExplSyntaxOn
\cs_generate_variant:Nn \box_new:N { c }
\cs_set:Npn \ic_funcpp:n #1 { \box_new:c { l_myicppz#1_box }
 \hbox_set:cn { l_myicppz#1_box } { Contents ~ #1 }
 x\box_use:c { l_myicppz#1_box }y ~ : ~
 \box_show:c { l_myicppz#1_box }
}
\cs_set:Nn \ic_funcppb:  {
\int_step_function:nnnN { 97 } { 1 } { 99 } \ic_funcpp:n
}
\NewDocumentCommand { \mycmdppb } { } { \ic_funcppb: }
%
\cs_set:Npn \ic_funcpq:n #1 { \box_use:c { l_myicppz#1_box } }
\NewDocumentCommand { \myboxnum } { m } {  \box_use:c { l_myicppz#1_box } }
\ExplSyntaxOff
  \mycmdppb
  \par >>\myboxnum{98}<<
\end{mybox}
\bigskip





\end{document}

相关内容