结合 mdframed、xparse 和 cleveref

结合 mdframed、xparse 和 cleveref

受到这篇文章的启发: 排版定义,我想定义一些类似定理的奇特环境。

与这篇文章中给出的例子相反,我需要一个带有计数器和可选标题的定义环境,所以我使用了 xparse。

这是一个 MWE。

\documentclass{article}

\usepackage{mathtools, isomath}
\usepackage{amsthm}
\usepackage[framemethod=tikz]{mdframed}
\usepackage{xparse}
\usepackage{cleveref}

\newtheorem{theorem}{Theorem}

\newcommand{\thedefinition}{\arabic{theorem}}
\NewDocumentEnvironment{definition}{o}{%
    \refstepcounter{theorem}
    \begin{mdframed}[%
        singleextra={
            \node[
                overlay,
                anchor=west,
                xshift=7pt,
                fill=gray,
                rounded corners=2pt,
            draw] at (P-|O) {\bfseries
                \IfValueTF{#1}{%
                    Definition~\thedefinition~(#1)
                }{%
                    Definition~\thedefinition
                }
            };
        },
        firstextra={
            \node[
                overlay,
                anchor=west,
                xshift=7pt,
                fill=gray,
                rounded corners=2pt,
            draw] at (P-|O) {\bfseries
                \IfValueTF{#1}{%
                    Definition~\thedefinition~(#1)
                }{%
                    Definition~\thedefinition
                }
            };
        },
    ]
}{%
    \end{mdframed}
}

\begin{document}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod

\begin{definition}[Optional]
    \label{defi}
    Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
\end{definition}

\cref{defi}
\end{document}

我删除了部分风格,所以不用担心。

我的问题是最后一行带有cref,它给出的结果theorem 1是 而不是 , definition 1这是正常的,因为我没有做任何事情来改变它。我找到了一些指导使用crefaliasaliascnt包的答案,但我没有成功使用它们。任何帮助都将不胜感激。

附言:如果您有一些简化代码的建议,我会很乐意采纳。

答案1

如果我理解正确的话,您是否希望定理和定义共享相同的计数器,但在cleveref引用其中一个或另一个时使用不同的名称?在这种情况下,在环境中将类型作为可选参数给出就足够了definition

\documentclass{article}

\RequirePackage{mathtools, isomath}
\RequirePackage{amsthm}
\RequirePackage[framemethod=tikz]{mdframed}
\usepackage{xparse}
\usepackage{cleveref}

\newtheorem{theorem}{Theorem}

\newcommand{\thedefinition}{\arabic{theorem}}
\NewDocumentEnvironment{definition}{o}{%
    \refstepcounter{theorem}
    \begin{mdframed}[%
        singleextra={
            \node[
                overlay,
                anchor=west,
                xshift=7pt,
                fill=gray,
                rounded corners=2pt,
            draw] at (P-|O) {\bfseries
                \IfValueTF{#1}{%
                    Definition~\thedefinition~(#1)
                }{%
                    Definition~\thedefinition
                }
            };
        },
        firstextra={
            \node[
                overlay,
                anchor=west,
                xshift=7pt,
                fill=gray,
                rounded corners=2pt,
            draw] at (P-|O) {\bfseries
                \IfValueTF{#1}{%
                    Definition~\thedefinition~(#1)
                }{%
                    Definition~\thedefinition
                }
            };
        },
    ]
}{%
    \end{mdframed}
}

\begin{document}
Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod

\begin{definition}[Optional]
    \label[definition]{defi}
    Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
\end{definition}

\Cref{defi} and \cref{foo}

\begin{theorem}\label{foo}
  foo bar
\end{theorem}

\end{document}

在此处输入图片描述

更加自动化的解决方案使用以下aliascnt包:

\usepackage{aliascnt}
\usepackage{cleveref}

\newtheorem{theorem}{Theorem}
\newaliascnt{definition}{theorem}

\NewDocumentEnvironment{definition}{o}{%
    \refstepcounter{definition}

那么可选参数\label就没有必要了。

我认为definition环境的定义仍处于草案阶段(结果肯定不是您想要的)?您有理由使用\RequirePackage而不是吗\usepackage

相关内容