我正在尝试将环境启动的第一个页面存储在商店中l3props
。
我努力了
\let\current_page_int\c@page
\cs_generate_variant:Nn \prop_gput:Nnn {Nne}
\prop_new:N \g__environments_prop
\DeclareDocumentEnvironment{foobar}{}{
\prop_gput:Nne \g__environments_prop {foobar/startpage} \current_page_int
}{
}
\begin{foobar}
...
\end{foobar}
但是,foobar/startpage
在环境启动后,会继续更新每一页,而不是持久存储第一页。我以为这意味着它会在那一刻e
扩展到值。我错过了什么?\current_page_int
答案1
\c@page
是 的符号名称\count0
;因此它不可扩展。所以
\prop_gput:Nnn \g_jason_environments_prop {foobar/startpage} { \g_jason_current_page_int }
和
\prop_gput:Nne \g_jason_environments_prop {foobar/startpage} { \g_jason_current_page_int }
完全等价。它们将存储\g_jason_current_page_int
在属性列表中,而不是其当前值。
你可能会使用
\prop_gput:Nne \g_jason_environments_prop {foobar/startpage} { \thepage }
但这不一定会存储实际的页码,因为不知道何时foobar
开始(除非您确定它从新页面开始,即它\clearpage
在该\begin
部分中。
如果你想要实际的页码,你必须使用基于\label
和 的可扩展方法\ref
。比如
\RequirePackage{refcount}
\int_new:N \g_jason_ref_int
\NewDocumentEnvironment{foobar} { }
{
\int_gincr:N \g_jason_ref_int
\label{foobar_ \int_to_roman:n { \g_jason_ref_int } _ref}
\prop_gput:Nne \g__environments_prop {foobar/startpage}
{
\getpagerefnumber {foobar_ \int_to_roman:n { \g_jason_ref_int } _ref}
}
}
{}
但只有执行代码时这才是可靠的后一些与环境有关的文本已经排版,否则页面引用可能会指向以前的页面。
我使用是refcount
因为目前没有到-机制expl3
的接口。\label
\ref
需要注意的另一点是每次调用foobar
都会更新存储的值,因此目的并不十分明确。