![带有别名计数器的新命令](https://linux22.com/image/417147/%E5%B8%A6%E6%9C%89%E5%88%AB%E5%90%8D%E8%AE%A1%E6%95%B0%E5%99%A8%E7%9A%84%E6%96%B0%E5%91%BD%E4%BB%A4.png)
我正在尝试创建一个命令,它将创建一个新的定理环境并将其计数器链接到指定的其他计数器。例如,我希望能够做一些事情,使我的定理、命题、定义等环境都具有相同的计数器。我尝试了以下方法:
\usepackage{etoolbox}
\usepackage{aliascnt}
\DeclareDocumentCommand{\DeclareTheorem}{ m m m !o }{%
\theoremstyle{#1}%
\IfNoValueTF{#4} {%
\newtheorem{#2}{#3}%
}{%
\newaliascnt{#2}{#4}%
\newtheorem{#2}[#2]{#3}%
}%
}
这似乎不起作用。它不会抛出错误,只是无法编译或类似情况。如果我需要五个参数,如下所示,那么它就可以工作。
\DeclareDocumentCommand{\DeclareTheorem}{ m m m m !o }{%
\theoremstyle{#1}%
\IfNoValueTF{#5} {%
\newtheorem{#2}{#3}%
}{%
\newaliascnt{#4}{#5}%
\newtheorem{#2}[#4]{#3}%
}%
}
但是,我更希望别名计数器自动与定理环境同名,这样我就不必每次都输入五个不同的选项。有什么帮助吗?
答案1
1.2 语法
用户空间中的宏名包含包名,
aliascnt
以防止名称冲突。
\newaliascnt{⟨ALIASCNT⟩}{⟨BASECNT⟩}
别名计数器⟨ALIASCNT⟩创建时不会分配新的 TeX 计数器寄存器。它与计数器共享计数寄存器和清除列表⟨BASECNT⟩如果两个寄存器中任意一个的值发生改变,那么这个改变都会影响到两个寄存器。
\aliascntresetthe{⟨ALIASCNT⟩}
\newtheorem
这解决了如果它被同名的别名计数器欺骗就会出现的问题:\newtheorem{foo}{Foo}% counter "foo" \newaliascnt{bar}{foo}% alias counter "bar" \newtheorem{bar}[bar]{Bar} \aliascntresetthe{bar}
我想你需要\aliascntresetthe
:
\documentclass{article}
\usepackage{xparse}
%\usepackage{etoolbox}
\usepackage{aliascnt}
\usepackage{amsthm}
\usepackage{hyperref}
\makeatletter
\DeclareDocumentCommand{\DeclareTheorem}{ m m m !o }{%
% #1 = theoremstyle
% #2 = name of theorem-emvironment
% #3 = Phrase introducing the theorem.
% #4 = the counter to use instead of allocating a new counter
\theoremstyle{#1}%
\IfNoValueTF{#4}{%
\newtheorem{#2}{#3}%
}{%
% In case the counter to use is not defined define it:
\@ifundefined{c@#4}{\newcounter{#4}}{}%
\newaliascnt{#2}{#4}%
\newtheorem{#2}[#2]{#3}%
\aliascntresetthe{#2}%
}%
}%
\makeatother
\DeclareTheorem{plain}{ThmA}{A-theorem}
\newcommand\ThmAname{A-theorem}
\DeclareTheorem{plain}{ThmB}{B-theorem}[ThmA]
\newcommand\ThmBname{B-theorem}
\DeclareTheorem{plain}{ThmC}{C-theorem}[ThmA]
\newcommand\ThmCname{C-theorem}
\begin{document}
\begin{ThmA}
\label{ThmA1}This is an \ThmAname.
\end{ThmA}
\begin{ThmB}
\label{ThmB2}This is a \ThmBname.
\end{ThmB}
\begin{ThmC}
\label{ThmC3}This is a \ThmCname.
\end{ThmC}
Referencing:
\verb|\autoref{ThmA1}| yields: \autoref{ThmA1}
\verb|\autoref{ThmB2}| yields: \autoref{ThmB2}
\verb|\autoref{ThmC3}| yields: \autoref{ThmC3}
\end{document}