使用 zref 返回值作为计数器的输入

使用 zref 返回值作为计数器的输入

我正在尝试创建一个新的计数器,用于计算页码以存储它们并在以后重复使用。我总是删除文档开头未编号的 3 页,然后将此值添加到我\CurrPage的计数器中。到目前为止,我已经设法使用从 Roman 中提取页码zref,但无法将此值添加到我的计数器中。

\documentclass[a4paper, fontsize = 12pt,headsepline]{scrartcl}
% Page Numbering Roman
\pagenumbering{Roman}
\usepackage{lipsum}
\usepackage{calc}
\usepackage[abspage,user,lastpage]{zref}


\makeatletter
\newcommand*{\CurrPage}{%
\zlabel{page.num} 
\number\numexpr
\zref@extract{page.num}{abspage}%
-3%
\relax
}
\makeatother

\begin{document}
% Counter Definition Framework
\newcounter{Page.Num.Framework}
\lipsum[1-25]

Current Page Num: {\CurrPage}

%\addtocounter{Page.Num.Framework}{\CurrPage}

\end{document}

如果取消注释,\addtocounter命令将返回错误:

Missing number, treated as zero. \addtocounter{Page.Num.Framework}{\CurrPage}

答案1

您有两个问题:一个是一般问题,另一个是使用问题calc

首先是一般方法:\CurrPage首先扩展为设置标签,然后使用标签生成的值。设置标签不是数字,因此添加\zlabel{…}到计数器总是会失败。这个问题可以通过简单的更改来解决\CurrPage

\newcommand*{\CurrPage}{%
  \number\numexpr
  \zref@extract{page.num}{abspage}%
  -3%
  \relax
  \zlabel{page.num}%
}

现在,\CurrPage首先得到一个数字,然后生成一个标签。使用这个:

\documentclass[a4paper, fontsize = 12pt,headsepline]{scrartcl}
% Page Numbering Roman
\pagenumbering{Roman}
\usepackage{lipsum}
%\usepackage{calc}
\usepackage[abspage,user,lastpage]{zref}


\makeatletter
\newcommand*{\CurrPage}{%
  \number\numexpr
  \zref@extract{page.num}{abspage}%
  -3%
  \relax
  \zlabel{page.num}%
}
\makeatother

\begin{document}
% Counter Definition Framework
\newcounter{Page.Num.Framework}
\lipsum[1-25]

Current Page Num: {\CurrPage}

Before: \arabic{Page.Num.Framework}
\addtocounter{Page.Num.Framework}{\CurrPage}
After: \arabic{Page.Num.Framework}

\end{document}

可以工作(但仍然很丑)。

使用的特殊问题calc是,calc允许在包中进行计算,\addtocounter并且的参数\addtocounter必须是数字表达式,而没有不扩展为数字的命令。所以

\documentclass[a4paper, fontsize = 12pt,headsepline]{scrartcl}
% Page Numbering Roman
\pagenumbering{Roman}
\usepackage{lipsum}
\usepackage{calc}
\usepackage[abspage,user,lastpage]{zref}


\makeatletter
\newcommand*{\CurrPage}{%
  \number\numexpr
  \zref@extract{page.num}{abspage}%
  -3%
  \relax
  \zlabel{page.num}%
}
\makeatother

\begin{document}
% Counter Definition Framework
\newcounter{Page.Num.Framework}
\lipsum[1-25]

Current Page Num: {\CurrPage}

Before: \arabic{Page.Num.Framework}
\addtocounter{Page.Num.Framework}{\CurrPage}
After: \arabic{Page.Num.Framework}

\end{document}

仍然失败,您必须拆分\CurrPage标签生成和标签使用:

\documentclass[a4paper, fontsize = 12pt,headsepline]{scrartcl}
% Page Numbering Roman
\pagenumbering{Roman}
\usepackage{lipsum}
\usepackage{calc}
\usepackage[abspage,user,lastpage]{zref}


\makeatletter
\newcommand*{\StoreCurrPage}{\zlabel{page.num}}
\newcommand*{\UseCurrPage}{%
  \numexpr
  \zref@extract{page.num}{abspage}%
  -3%
  \relax
}
\makeatother

\begin{document}
% Counter Definition Framework
\newcounter{Page.Num.Framework}
\lipsum[1-25]

Before: \arabic{Page.Num.Framework}
\StoreCurrPage\addtocounter{Page.Num.Framework}{\UseCurrPage}
After: \arabic{Page.Num.Framework}

\end{document}

相关内容