使用 zref 和 latex3 获取绝对页码

使用 zref 和 latex3 获取绝对页码

在较大的项目中,我想设置一个等于当前绝对页码的字符串,如下所示

\documentclass[10pt]{article}

\usepackage{zref-abspage}
\usepackage{zref-user}

\ExplSyntaxOn

\NewDocumentEnvironment{intfig} { > { \SplitArgument { 1 } { , } } m!o }
{
  % Apparently, this is required because the page number isn't fixed until shipout.
  \zlabel{ randomname }

  % Error: "\zref doesn't match its definition."
  \str_set:Nx \l_intfig_filespec_str { \zref[abspage]{ randomname } }

  % This works as expected.
  \zref[abspage]{ randomname }
}{ }

\ExplSyntaxOff

\begin{document}
\begin{intfig}{bogus}
\end{intfig}
\end{document}

这里发生了一些事情,可能与扩展有关,但我不明白。主题,也许有人知道一份比该文档更具说明性的文档interface3,而该文档在您刚开始时是神秘的。

如果重要的话,在实际代码中,randomname上面使用的也将是一个字符串,如\l_intfig_figname_str。我想让示例保持简洁。

答案1

\zref在这种情况下,您需要使用 的可扩展版本\zref@extractdefault

\documentclass[10pt]{article}
\usepackage[papersize={4cm,6cm},margin=1cm,bottom=2cm]{geometry}

\usepackage{zref-abspage}
\usepackage{zref-user}

\ExplSyntaxOn

\int_new:N \g__intfig_unique_int

\NewDocumentEnvironment{intfig} { > { \SplitArgument { 1 } { , } } m!o }
 {
  \int_gincr:N \g__intfig_unique_int
  \zlabel{ intfig-\int_to_arabic:n { \g__intfig_unique_int } }
  \str_set:Nx \l_intfig_filespec_str
   {
    \use:c { zref@extractdefault } { intfig-\int_to_arabic:n { \g__intfig_unique_int } } { abspage } { 0 }
   }
  \str_use:N \l_intfig_filespec_str
}{ }

\ExplSyntaxOff

\begin{document}
\begin{intfig}{bogus}
  Text
\end{intfig}

\clearpage
\pagenumbering{Roman}

\begin{intfig}{bogus}
  Text
\end{intfig}

\end{document}

geometry包装只是为了制作一张较小的图片。

整数变量用于为环境的每次调用提供唯一的标签。

在此处输入图片描述

答案2

\zref不可扩展,因此使用扩展x来获取参考值并不是可行的方法。zref它本身提供了许多其他替代方案,我认为最能立即完成您想要它做的事情的是\zref@def@extract(让 Oberdiek 为您处理扩展控制 ;-)。使用它的一个示例:

\documentclass[10pt]{article}

\usepackage{zref-abspage}
\usepackage{zref-user}

\makeatletter
\ExplSyntaxOn
% Ensure zref@unique exists
\zref@require@unique

\NewDocumentEnvironment{intfig} { > { \SplitArgument { 1 } { , } } m!o }
{
  % You probably want this (or some other dedicated counter)
  \refstepcounter { zref@unique }

  % If you only need abspage.
  \zref@labelbyprops { randomname } { abspage }
  % or \zlabel if you really need a full reference.
  % \zlabel{ randomname }

  % This will extract the abspage property and store it in the \l_tmpa_tl
  % variable.
  \zref@def@extract { \l_tmpa_tl } { randomname } { abspage }

  % For demonstration purposes only.
  \tl_show:N \l_tmpa_tl
}{ }

\ExplSyntaxOff
\makeatother

\begin{document}
\begin{intfig}{bogus}
  Foo
\end{intfig}
\end{document}

相关内容