我已经定义了一个\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}
我想要做的是让\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}