在一个宏中定义部分和标签

在一个宏中定义部分和标签

我想定义一个部分(或其他内容)并同时为其贴上标签。到目前为止,我得到了以下信息:

\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}

相关内容