如何根据 \ref 相对于 \label 的调用位置来更改其外观

如何根据 \ref 相对于 \label 的调用位置来更改其外观

我已经定义了一个\task分段命令和一个subtasks-list,如该MWE所示:

\documentclass{article}

\usepackage[hidelinks]{hyperref}

\usepackage[loadonly, explicit]{titlesec}

\titleclass{\task}[1]{straight}
\newcounter{task}
\titleformat{\task}
    [hang]{\normalfont\Large\bfseries}{Task \thetask:}{1ex}{#1}
\titlespacing*{\task}
    {0pt}{3.5ex plus 1ex minus .2ex}{0ex plus .2ex}

\usepackage{enumitem}

\newlist{subtasks}{enumerate}{1}
\setlist[subtasks]{label=\alph*),%
    ref=\thetask\,\alph*),%
    format=\normalfont\large\bfseries,%
    itemsep=1.5ex plus 1ex minus .2ex,%
    before=\newcommand{\subtask}{\item},%
    after=\vspace{0.5ex}}

\begin{document}


\task{first task}
\begin{subtasks}

    \subtask\label{some_subtask}
    Some subtask

    \subtask
    I am referencing \ref{some_subtask}.

\end{subtasks}

\task{another task}
I am referencing \ref{some_subtask} again.


\end{document}

上面的 MWE 的输出

我想要做的是让\ref以不同的方式显示,具体取决于它是否\task以与相同\label(就像“a)”)或不同(就像上面的“1 a)”一样)的方式调用。它也应该与 兼容hyperref

这可能吗?

答案1

重新订阅

\documentclass{article}

\usepackage[hidelinks]{hyperref}

\usepackage[loadonly, explicit]{titlesec}

\titleclass{\task}[1]{straight}
\newcounter{task}
\titleformat{\task}
    [hang]{\normalfont\Large\bfseries}{Task \thetask:}{1ex}{#1}
\titlespacing*{\task}
    {0pt}{3.5ex plus 1ex minus .2ex}{0ex plus .2ex}

\usepackage{enumitem}

\newlist{subtasks}{enumerate}{1}
\setlist[subtasks]{label=\alph*),%
    ref=\thetask.\alph*,%
    format=\normalfont\large\bfseries,%
    itemsep=1.5ex plus 1ex minus .2ex,%
    before=\newcommand{\subtask}{\item},%
    after=\vspace{0.5ex}}

\usepackage{xstring}
\makeatletter
\newcommand{\refsub}[1]% #1 = label name for subtasks
{\@ifundefined{r@#1}{??}{\begingroup%
  \edef\temp{\expandafter\detokenize\getrefnumber{#1}}%
  \StrCut{\temp}{.}\temptask\tempsub%
  \edef\templink{\getrefbykeydefault{#1}{anchor}{}}%
  \if\thetask\temptask\hyperlink{\templink}{\tempsub)}%
  \else\hyperlink{\templink}{\temptask\,\tempsub)}\fi
\endgroup}}
\makeatother

\begin{document}

\task{first task}
\begin{subtasks}

    \subtask\label{some_subtask}
    Some subtask

    \subtask
    I am referencing \refsub{some_subtask}.

\end{subtasks}

\task{another task}
I am referencing \refsub{some_subtask} again.

\end{document}

相关内容