带有别名计数器的新命令

带有别名计数器的新命令

我正在尝试创建一个命令,它将创建一个新的定理环境并将其计数器链接到指定的其他计数器。例如,我希望能够做一些事情,使我的定理、命题、定义等环境都具有相同的计数器。我尝试了以下方法:

\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

aliascnt-package 手册说:

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}

在此处输入图片描述

相关内容