我想定义一个部分(或其他内容)并同时为其贴上标签。到目前为止,我得到了以下信息:
\documentclass{article}
\usepackage{hyperref}
\usepackage{nameref,cleveref}
\makeatletter
\newcommand{\mySection}[1]{%
\cleardoublepage%
\section{#1}%
\@bsphack\begingroup%
\def\@currentlabel{#1}%
\label{#1}%
\endgroup\@esphack
%\protected@write \@auxout {}{\string \newlabel {#1}{{#1}{}}}%
}
\makeatother
\begin{document}
\mySection{Intro duction}
ref: \ref{Intro duction} foo\\
nameref: \nameref{Intro duction} bar\\
cref: \cref{Intro duction} foo\\
cref*: \cref*{Intro duction} bar\\
Cref: \Cref{Intro duction} foo\\
Cref*: \Cref*{Intro duction} bar\\
\end{document}
我得到:
ref:简介 foo
nameref:简介 bar
cref:第 1 节 foo
cref*:第 1 节 bar
Cref:第 1 节 foo
Cref*:第 1 节 bar
我认为问题出在\def\@currentlabel
零件上。有人能回答一下吗?
答案1
你把事情弄得太复杂了。你可以将定义简化为:
\NewDocumentCommand{\mySection}{+m}{
\cleardoublepage
\section{#1}
\label{#1}
}
\NewDocumentCommand
(您应该养成使用 而不是的习惯\newcommand
)。您可以进一步修改该命令,以允许在部分标题后指定可选参数来覆盖标签名称:
\NewDocumentCommand{\mySection}{+m !O{#1}}{
\cleardoublepage
\section{#1}
\label{#2}
}
(我使用了!O
而不是O
来要求可选参数必须紧跟在必需参数之后,这样您就可以有一个以括号开头的部分)。然后你可以写:
\mySection{Introduction}[intro]
\ref{intro}