我希望能够做这样的事情
\begin{exo}[Name][\Star\Star] Content \end{exo}
将会打印类似
**Exercise 7 (Name). Content
我希望 exo 的计数器与其他定理共享计数器,并能够使用 cref 引用它。如果可能的话,我想使用 amsthm 来尽量减少文件中的更改。
我想使用的代码示例
\documentclass{article}
\usepackage{amsthm}
\begin{document}
\newtheorem{eDef}{Def}
\newtheorem{eExo}[eDef]{Exo}
\begin{eDef}[Name]
Content
\end{eDef}
\begin{eExo}[Name][**]
Content
\end{eExo}
\begin{eExo}[Name][*]
Content
\end{eExo}
\begin{eExo}[Name][***]
Content
\end{eExo}
\end{document}
导致
Def 1 (Name). Content
**Exercise 2 (Name). Content
*Exercise 3 (Name). Content
***Exercise 4 (Name). Content
答案1
主要问题是双重可选参数。我建议使用不同的语法来区分它们。
\documentclass{article}
\usepackage{amsthm,xparse}
\theoremstyle{definition}
\newtheorem{eDef}{Def}
\newtheorem{eExoinner}[eDef]{\Exoname}
\newcommand{\Exoname}{Exo}
\NewDocumentEnvironment{eExo}{D(){}o}
{\renewcommand\Exoname{\makebox[0pt][r]{#1}Exo}%
\IfNoValueTF{#2}{\eExoinner}{\eExoinner[#2]}}
{\endeExoinner}
\begin{document}
\begin{eDef}[Name]
Content
\end{eDef}
\begin{eExo}[Name]
Content
\end{eExo}
\begin{eExo}(*)[Name]
Content
\end{eExo}
\begin{eExo}(**)[Name]
Content
\end{eExo}
\begin{eExo}(***)[Name]
Content
\end{eExo}
\begin{eExo}
Content
\end{eExo}
\begin{eExo}(*)
Content
\end{eExo}
\begin{eExo}(**)
Content
\end{eExo}
\begin{eExo}(***)
Content
\end{eExo}
\end{document}
不同的策略是定义四种不同的环境。
\documentclass{article}
\usepackage{amsthm}
\theoremstyle{definition}
\newtheorem{eDef}{Def}
\newtheorem{eExoinner}[eDef]{\makebox[0pt][r]{\Exostar}Exo}
\newcommand{\Exostar}{}
\newenvironment{eExo}{\eExoinner}{\endeExoinner}
\newenvironment{eExo*}{\renewcommand\Exostar{*}\eExoinner}{\endeExoinner}
\newenvironment{eExo**}{\renewcommand\Exostar{**}\eExoinner}{\endeExoinner}
\newenvironment{eExo***}{\renewcommand\Exostar{***}\eExoinner}{\endeExoinner}
\begin{document}
\begin{eDef}[Name]
Content
\end{eDef}
\begin{eExo}[Name]
Content
\end{eExo}
\begin{eExo*}[Name]
Content
\end{eExo*}
\begin{eExo**}[Name]
Content
\end{eExo**}
\begin{eExo***}[Name]
Content
\end{eExo***}
\begin{eExo}
Content
\end{eExo}
\begin{eExo*}
Content
\end{eExo*}
\begin{eExo**}
Content
\end{eExo**}
\begin{eExo***}
Content
\end{eExo***}
\end{document}