更改 \cref 中的格式

更改 \cref 中的格式

抱歉,如果这个问题重复了,但我找不到任何解决方案。我想定义一个带有两个参数的命令,它执行以下操作

\newcommand{ThecommandIwant}[2]{#1.\cref{#2}}

现在这并没有产生我想要的结果。例如,它会产生 #1.定理/命题,对应于 #2 的数字。相反,我想要的是产生定理/命题 #1.对应于 #2 的数字的东西。

编辑:#2 代表所引用项目的标签(比如定理)。#1 是我最终想要在“定理”和所引用数字之间添加的内容。例如,如果\cref{#2}生成“定理 1.2”,我希望我的命令生成“定理 #1.1.2”。

以下是一个例子

\usepackage{amsmath,cleveref}
%here I define my command called "ThecommandIwant"
\begin{document}
\begin{theorem}\label{a}
\end{theorem}
\begin{theorem}\label{b}
\end{theorem}
\ThecommandIwant{Train}{a} %prints theorem Train.1
\ThecommandIwant{Plane}{b} %prints theorem Plane.2
\end{document}

提前致谢。

答案1

在此处输入图片描述

我不确定这是否可以通过\crefformat任何技巧\creflabelformat来实现,但我提供了一个解决方案,它可以提取文件存储的信息并根据所需的输出重建输出。cleverefcrossreftoolscleveref.aux

底层计数器由自动检测(!!!!)\crtcrefcounter并移交给\crtcrefname根据\crefname等设置打印交叉引用名称。

hyperref下面提供的解决方案也 知道是否使用链接。

\documentclass{article}

\usepackage{amsthm}
\usepackage{hyperref}
\usepackage{cleveref}
\usepackage{crossreftools}

\newtheorem{theorem}{Theorem}

\makeatletter
\newcommand{\ThecommandIwant}[2]{%
  \@ifundefined{r@#2}{}{%
    \if@crt@hyperrefloaded
    \hyperlink{\crtrefanchor{#2}}{\crtcrefname{\crtcrefcounter{#2}} #1.\crtcrefnumber{#2}}%
    \else
    \crtcrefname{\crtcrefcounter{#2}} #1.\crtcrefnumber{#2}%
    \fi
  }%
}
\makeatother

\begin{document}

\begin{theorem}\label{a}
\end{theorem}

\clearpage
\begin{theorem}\label{b}
\end{theorem}

\clearpage
\ThecommandIwant{Train}{a} %prints theorem Train.1
\ThecommandIwant{Plane}{b} %prints theorem Plane.2

\end{document}

答案2

使用cleveref,定义一个合适的\crefformat

\documentclass{article}
\usepackage{cleveref}

\makeatletter
\let\omarlabel\@gobble
\makeatother
\newcommand{\foo}[2]{%
  \begingroup
  \def\omarlabel{#1}%
  \cref{#2}%
  \endgroup
}
\crefdefaultlabelformat{#2\omarlabel.#1#3}

\newtheorem{theorem}{Theorem}

\begin{document}

\section{Test}\label{0}

\begin{theorem}\label{a}
\end{theorem}

\begin{theorem}\label{b}
\end{theorem}

\foo{Whatever}{0}

\foo{Train}{a} %prints theorem Train.1

\foo{Plane}{b} %prints theorem Plane.2

\cref{0}

\cref{a}

\cref{b}

\end{document}

默认情况下,该\omarlabel命令会吞噬句点,但\foo将其重新定义为规定的附加标签。

在此处输入图片描述

答案3

我发现 Christian Hupfer 和 egreg 的答案有点复杂;第一个需要额外的包,第二个重新定义所有标签,这很烦人。我建议简单一点

\newcommand*{\omaref}[2]{\namecref{#2}~#1.\labelcref{#2}}

或为了更好地互动hyperref

\newcommand*{\omaref}[2]{%
    \hyperref[#2]{\namecref{#2}~#1.\labelcref*{#2}}
}

相关内容