在同一节中缩写 \ref

在同一节中缩写 \ref

给出示例代码

\section{One}
\begin{enumerate}
\item\label{li:one}
\end{enumerate}

\section{Two}
\begin{enumerate}
\item\label{li:two}
\end{enumerate}

I am referencing \ref{li:one} and \ref{li:two}

我希望这呈现为

我引用的是(A.1)和(1)

也就是说,当引用其他部分的标签时,我想包含部分编号,但对于同一部分内的标签,则省略部分编号。我该怎么做?

编辑:我正在enumitem使用hyperref

答案1

如果您不使用hyperref,则可以使用以下命令:

\documentclass{article}
\usepackage{enumitem}% to demonstrate compatability
\usepackage{xstring}

\renewcommand{\thesection}{\Alph{section}}% is this the default?

\makeatletter
\newcommand{\refitem}[1]% #1 = label name
{\@ifundefined{r@#1}{??}{\begingroup%
  \edef\temp{\expandafter\detokenize\ref{#1}}%
  \StrCut{\temp}{.}\tempsection\tempitem%
  \if\thesection\tempsection\relax(\tempitem)%
  \else(\tempsection.\tempitem)%
  \fi
\endgroup}}
\makeatother

\begin{document}
\section{One}
\begin{enumerate}[ref=\thesection.\arabic*]
\item\label{li:one}
\end{enumerate}

\noindent I am referencing  \refitem{li:one} and \refitem{li:two}.

\section{Two}
\begin{enumerate}[ref=\thesection.\arabic*]
\item\label{li:two}
\end{enumerate}


\noindent I am referencing \refitem{li:one} and \refitem{li:two}.
\end{document}

裁剪页面

如果您正在使用hyperref,则需要将上述内容替换\refitem为:

\usepackage{hyperref}
\makeatletter
\def\autoref#1#2#3#4#5\@nil{\edef\anchor{#3}}
\newcommand{\getrefanchor}[1]{\expandafter\expandafter\expandafter\expandafter
    \expandafter\expandafter\expandafter\autoref
    \expandafter\expandafter\expandafter\@gobble
    \csname r@#1\endcsname{}\@nil}

\newcommand{\refitem}[1]% #1 = label name
{\@ifundefined{r@#1}{??}{\begingroup%
  \edef\temp{\expandafter\detokenize\getrefnumber{#1}}%
  \StrCut{\temp}{.}\tempsection\tempitem%
  \getrefanchor{#1}% saves as \anchor
  \if\thesection\tempsection\relax\hyperlink{\anchor}{(\tempitem)}%
  \else\hyperlink{\anchor}{(\tempsection.\tempitem)}%
  \fi
\endgroup}}
\makeatother

相关内容