抱歉,如果这个问题重复了,但我找不到任何解决方案。我想定义一个带有两个参数的命令,它执行以下操作
\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
来实现,但我提供了一个解决方案,它可以提取文件存储的信息并根据所需的输出重建输出。cleveref
crossreftools
cleveref
.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}}
}