将 \def 与 \edef 互换时代码中断

将 \def 与 \edef 互换时代码中断

我正在尝试制作一个命令,为我必须管理的一些列表中的条目创建自动递增的 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

  • 为什么edefexpandarrayelementtrue破坏代码?
  • 是否有其他方法可以说服cleveref我选择我的引用风格?
  • 是否有更简单的方法来保存表达式的计算结果而不是可计算表达式本身?

提前致谢,

莫拉克斯诺

相关内容