hyperref 和 cleveref 与 enumitem 一起使用

hyperref 和 cleveref 与 enumitem 一起使用

我正在写讲座论文,经常参考类似定理的环境。我写下了一个简单的例子,我的布局可能看起来像这样:

\documentclass[a4paper]{article}
    % references
\usepackage{hyperref}
\usepackage[nameinlink]{cleveref}    
    % theorem-like environments
\usepackage{amsthm}
    % languages
\usepackage[utf8]{inputenc}
\usepackage[czech]{babel}

\usepackage{enumitem}
    % new theorem-like environments
\theoremstyle{definition}
    \newtheorem{_def}{Definice}[section]      

\theoremstyle{plain}
    \newtheorem{veta}[_def]{Věta}

\crefname{_def}{D.}{D.}

\begin{document}

\section{First section}

\begin{_def}
\label{sec:def:first}
First definition of this paper.
\end{_def}

\begin{veta}
First theorem with enumerate environment
\begin{enumerate}[label=(\roman*)]
    \item Item in the list\label{sec:th:li}
    \item Another item in the list
\end{enumerate}
\end{veta}

As you can see in \cref{sec:def:first} and together with \cref{sec:th:li}

\end{document}

该示例的输出如下:

当前结果

问题是对枚举环境中项目的引用。我希望\cref打印(红色框不是问题,它们不存在,因为我自己编写了这个输出,没有任何引用):

预期结果

谢谢!

附加问题

有没有办法选择应该\cref选择哪种形式的名称?例如,我想在以下两者之间进行选择:

附加问题

注意 A。我混合了两种语言。部分是为了让您理解,但也因为我需要它在我的母语中工作。这似乎不是什么大问题,但我认为是\autoref,它打印了名称,例如,Definition它在英语中工作得很好,但在我的母语中却不行——因为例如后缀会随着上下文而变化。

可能看起来我太在意了,但我认为这很重要。我主要以两种方式引用该定理:

  • 在句子中使用整个单词看起来更好,我认为,特别是在数学文本中,其中不乏符号和缩写。
  • 以上=、、==>等符号在证明、方程式中的作用……

注意 B。抱歉,图像质量不佳,我遵循了最简单的流程:prt sc然后切入Gimp

答案1

我认为您可以通过进行两项修改来实现您所述的目标。

  • 插入说明

    \makeatletter
    \renewcommand{\p@enumi}{\theveta~}
    \makeatother
    

    enumi在序言中。这指示 LaTeX在构建交叉引用时将veta 计数器的值“添加到” (第一级枚举) 计数器的前缀。

    请注意,如果您在更多地方使用第一级枚举,而不仅仅是“vetas”,这种方法可能会引起混淆。如果您的文档中出现这种情况,您可能应该“克隆”环境enumerate以创建一个新的专用枚举环境,该环境仅在 vetas 内出现。(有关如何克隆枚举环境的建议,请参阅,例如https://tex.stackexchange.com/a/180192/5001

  • 添加指令

    \crefname{enumi}{V.}{V.}
    

    序言部分也一样。我想您能猜到它的作用。

另外,请记住,加载hyperrefcleveref 最后的。特别是,cleveref应该在之后加载amsthm,但在您定义任何类似定理的环境之前(在您的例子中)_defveta

在此处输入图片描述

\documentclass[czech,a4paper]{article}
    % languages
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel,lmodern}

    % theorem-like environments
\usepackage{amsthm}

\usepackage{enumitem}

\makeatletter
\renewcommand{\p@enumi}{\theveta~} % prefix value of veta to enumi
\makeatother

    % cross-references
\usepackage[colorlinks=true]{hyperref}
\usepackage[nameinlink]{cleveref}


    % new theorem-like environments
\theoremstyle{definition}
    \newtheorem{_def}{Definice}[section]      
\theoremstyle{plain}
    \newtheorem{veta}[_def]{Věta}


\crefname{_def}{D.}{D.}
\crefname{enumi}{V.}{V.}

\begin{document}
\section{First section}

\begin{_def}
\label{sec:def:first}
First definition of this paper.
\end{_def}

\begin{veta}
First theorem with enumerate environment
\begin{enumerate}[label=(\roman*)]
    \item Item in the list\label{sec:th:li}
    \item Another item in the list
\end{enumerate}
\end{veta}

As you can see in \cref{sec:def:first} and together with \cref{sec:th:li}, \dots

\end{document}

附录:这是一个经过修改的解决方案,它使用包的veta\newlist和设置专用枚举环境以供在环境中使用。拥有这种专用环境的一个优点是您不必弄乱基本的 LaTeX环境。另一个优点是您可以一次性指定列表标签和交叉引用的形式。仅显示代码;结果将与上面显示的屏幕截图相同。\setlistenumitemenumerate

\documentclass[czech,a4paper]{article}
    % languages
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{babel,lmodern}

    % theorem-like environments
\usepackage{amsthm}

\usepackage{enumitem}
\newlist{venum}{enumerate}{1} % this creates a dedicated counter named 'venumi'
\setlist[venum,1]{label=(\roman*),
         ref=\theveta~(\roman{venumi})} 
% define appearance of labels and cross-references

    % cross-references
\usepackage[colorlinks=true]{hyperref}
\usepackage[nameinlink]{cleveref}

    % new theorem-like environments
\theoremstyle{definition}
    \newtheorem{_def}{Definice}[section]      
\theoremstyle{plain}
    \newtheorem{veta}[_def]{Věta}

\crefname{_def}{D.}{D.}
\crefname{venumi}{V.}{V.}

\begin{document}
\section{First section}

\begin{_def}
\label{sec:def:first}
First definition of this paper.
\end{_def}

\begin{veta}
First theorem with enumerate environment
\begin{venum}  % use 'venum' instead of 'enumerate' inside a veta env.
    \item Item in the list\label{sec:th:li}
    \item Another item in the list
\end{venum}
\end{veta}

As you can see in \cref{sec:def:first} and together with \cref{sec:th:li}, \dots
\end{document}

关于为定理、定义、推论等创建单独的专用枚举类环境的可取性或可取性的个人评论。我想不出一个令人信服的理由来解释为什么拥有大量这样的枚举类环境可能是有利的。如果您写“在 V 1.2 (i) 中”,而不是稍微冗长一点的“在 Veta 1.2 的项目 (i) 中”,这真的能提高文档的可读性和可理解性吗?就像生活中的几乎所有其他事情一样,简洁不一定是一种美德。

相关内容