![带标签包的 Expl3 循环](https://linux22.com/image/435660/%E5%B8%A6%E6%A0%87%E7%AD%BE%E5%8C%85%E7%9A%84%20Expl3%20%E5%BE%AA%E7%8E%AF.png)
我一直试图使用expl3
循环来输出带有包的一页标签labels
。
包装内labels
每个标签之间应以空行隔开。
我无法将空白行所需的任何内容放入expl3
循环中。
在 MWE 中,第一页显示了通过插入标签代码 33 次创建的标签页。第二页显示了我的循环代码如何不起作用 :)。
我怎样才能做到这一点?
% TeX Program = lualatex
\documentclass[a4paper]{article}
\pagestyle{empty}
\usepackage{emoji}
\usepackage[default]{sourcesanspro}
\usepackage[newdimens]{labels}
\LabelCols=3
\LabelRows=11
\LeftPageMargin=6.5mm
\RightPageMargin=6.5mm
\TopPageMargin=14mm
\BottomPageMargin=14mm
\InterLabelColumn=2.5mm
\InterLabelRow=0mm
\LeftLabelBorder=2mm
\RightLabelBorder=2mm
\TopLabelBorder=2mm
\BottomLabelBorder=2mm
\ExplSyntaxOn
\cs_new:Nn \dcp_format_label:
{
\centering\large
\emoji{glowing-star} ~ Well ~ Done ~ St ~ Paul ~ Stars! ~ \emoji{glowing-star}
}
\cs_new:Nn \dcp_output_labels:n
{
\int_set:Nn \l_tmpa_int {1}
\int_set:Nn \l_tmpb_int {#1}
\begin{labels}
\int_do_while:nn { \l_tmpa_int <= \l_tmpb_int }
{
\int_incr:N \l_tmpa_int
\dcp_format_label:
% somehow need whatever the label package sees as a blank line here (not \par)
}
\end{labels}
}
\cs_set_eq:NN \outputlabels \dcp_output_labels:n
\cs_set_eq:NN \formatlabel \dcp_format_label:
\ExplSyntaxOff
\begin{document}
\begin{labels}
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\end{labels}
\clearpage
\outputlabels{33}
\end{document}
答案1
环境labels
始于:
\def\start@@label{%
\begin{lrbox}{\this@label}%
\begin{minipage}{\area@width}\raggedright%
\catcode `\^^M =\active % <--- here
\@gobblecr%
}
这意味着它期望结束行字符为 catcode 13,因此您必须\char_set_catcode_active:n { `\^^M }
在定义\dcp_output_labels:n
命令之前执行此操作。
此外,环境使用由^^M
13分隔的宏来扫描其主体,因此您的\int_do_while:nn
循环将不起作用,因为它发生在环境已经启动之后:您需要将所有^^M
13放到位前环境启动。您可以使用:
\prg_replicate:nn {#1}
{ \dcp_format_label: \exp_not:N ^^M \exp_not:N ^^M }
在- 或 -扩展中使用时进行#1
复制。\dcp_format_label: ^^M ^^M
e
x
将所有这些放在一起得到两个页面:
\documentclass[a4paper]{article}
\pagestyle{empty}
\usepackage{emoji}
\usepackage[default]{sourcesanspro}
\usepackage[newdimens]{labels}
\LabelCols=3
\LabelRows=11
\LeftPageMargin=6.5mm
\RightPageMargin=6.5mm
\TopPageMargin=14mm
\BottomPageMargin=14mm
\InterLabelColumn=2.5mm
\InterLabelRow=0mm
\LeftLabelBorder=2mm
\RightLabelBorder=2mm
\TopLabelBorder=2mm
\BottomLabelBorder=2mm
\ExplSyntaxOn
\cs_new_protected:Nn \dcp_format_label:
{
\centering\large
\emoji{glowing-star} ~ Well ~ Done ~ St ~ Paul ~ Stars! ~ \emoji{glowing-star}
}
\group_begin:
\char_set_catcode_active:n { 13 }
\cs_new_protected:Nn \dcp_output_labels:n
{
\use:x
{
\exp_not:N \begin{labels}
\prg_replicate:nn {#1}
{ \dcp_format_label: \exp_not:N ^^M \exp_not:N ^^M }
\exp_not:N \end{labels}
}
}
\group_end:
\cs_new_eq:NN \outputlabels \dcp_output_labels:n
\cs_new_eq:NN \formatlabel \dcp_format_label:
\ExplSyntaxOff
\begin{document}
\begin{labels}
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\formatlabel
\end{labels}
\clearpage
\outputlabels{33}
\end{document}