使用 l3props 存储 `\c@page` 的值

使用 l3props 存储 `\c@page` 的值

我正在尝试将环境启动的第一个页面存储在商店中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都会更新存储的值,因此目的并不十分明确。

相关内容