自定义一个环境,自己弄计数器,希望显示效果是第x个,总y个,在本网站上抄到一段代码
\usepackage{atveryend}
\AfterLastShipout{%
\immediate\write\@auxout
{\string\newlabel{ProbdailyTotal}{
{\int_use:N \g_probdaily_counter_int}{}}}
}
\int_new:N \g_probdaily_counter_int
\NewDocumentCommand{\mytest}{ +m}{
\int_add:Nn \g_probdaily_counter_int {1}
#1 ,test
\end{zljbox}
}
前一半atveryend这部分是抄的,实际我不是很明白After那个后面的东西,只是替换了一下.发现的问题是这部分代码和hyperref冲突,我原来自己的包里面有两行
\RequirePackage{hyperref}
\hypersetup{colorlinks=true,linkcolor=violet}
注释掉以后前面计数器正常的,但是如果两者在一起,那么计数器无法显示总数,可以编译通过,但是显示的是“总??个”
请问能共存吗?或者有更好的方式在保留hyperref的情况下实现计数器总y个的实现
第一次提问,谢谢
使用 hyperref
宏包后,\newlabel
的第二个参数需要5个值。
\makeatletter
\bgroup\catcode`\ =9 \endlinechar=-1 % 简单模拟LaTeX3环境
\newcounter{probdaily} % \int_new:N \g_probdaily_counter_int
\AfterLastShipout{
\immediate\write\@auxout
{\string\newlabel{ProbdailyTotal}
{
{\the\c@probdaily} % \int_use:N \g_probdaily_counter_int
{}
{}
{}
{}
}
}
}
\egroup
\makeatother
在 LaTeX2e 2020-10-01
版本之后,ateveryend
宏包是不需要的,\AfterLastShipout
已原生提供。
\documentclass{article}
\usepackage{hyperref}
\makeatletter
\bgroup\catcode`\ =9 \endlinechar=-1
\newcounter{probdaily}
\AfterLastShipout{
\immediate\write\@auxout
{\string\newlabel{ProbdailyTotal}
{
{\the\c@probdaily}
{}
{}
{}
{}
}
}
}
\egroup
\makeatother
\begin{document}
Hello, \LaTeXe.
\stepcounter{probdaily}
\stepcounter{probdaily}
\ref{ProbdailyTotal} = 3
\stepcounter{probdaily}
\end{document}
补充:
不必再加载
atveryend
宏包是因为hyperref
已经加载了该宏包。另外,在较新的 LaTeX2e 版本中,
atveryend
宏包被自动替换为了atveryend-ltx
宏包(使用\declare@file@substitution{atveryend.sty}{atveryend-ltx.sty}
),该宏包使用了新的钩子机制。\AfterLastShipout
实际上就是\AddToHook{enddocument/afterlastpage}
。因此可以直接写
\AddToHook{enddocument/afterlastpage}{<code>}
。