我正在尝试制作一个命令,为我必须管理的一些列表中的条目创建自动递增的 ID。它们必须遵循特定的格式(例如,第一个字符必须是当前章节的第一个字母)。IDcleveref
也应该兼容,这样我就可以\cref
显示相应的标签和自定义引用。
以下代码可以编译:
\documentclass[12pt,a4paper]{report}
\usepackage{xstring}
\usepackage{fmtcount}
\usepackage{arrayjob}
\usepackage{etoolbox}
\usepackage{xpatch}
\usepackage{cleveref}
% entry counter
\newcounter{globalcounter}
\setcounter{globalcounter}{0}
\newcounter{localcounter}
\setcounter{localcounter}{0}
% chaptername tracker
\xpretocmd{\@chapter}
{%
\setcounter{localcounter}{0}%
\def\currentchapter{#1}%
%
}{}{}
% chapter number generator
\newcommand{\chapnumber}
{%
\StrLeft{\thesection}{1}\StrRight{\thesection}{1}
}
% entrycode
\newcommand{\entrycode}
{
\StrLeft{\currentchapter}{1}\chapnumber\padzeroes[2]{\decimal{localcounter}}
}
\newcommand{\cmust}[1]{%
\refstepcounter{globalcounter}%
\stepcounter{localcounter}%
\label{#1}%
\def\current{\entrycode}%
\current
}
\begin{document}
\chapter{Testchapter}
\cmust{test}
\cmust{test2}
\end{document}
并返回
这基本上就是我想要的。但我不知道如何cleveref
在引用时使用我的“特殊”编号系统,所以我尝试使用包arrayjob
,创建一个数组,其中计数器cleveref
作为索引,我的编号作为值。但不幸的是,当我尝试在数组保存值之前评估我的表达式时,整个代码都中断了( )。当我将下面的定义中的\expandarrayelementtrue
更改为时,也会发生同样的情况,但我只是不明白为什么。有人知道吗\def
\cmust
\edef
- 为什么
edef
或expandarrayelementtrue
破坏代码? - 是否有其他方法可以说服
cleveref
我选择我的引用风格? - 是否有更简单的方法来保存表达式的计算结果而不是可计算表达式本身?
提前致谢,
莫拉克斯诺