如何使命令\ref{pb:p1}
起作用。
\documentclass[onecolumn,a4paper,10pt]{article}
\usepackage{tcolorbox}
\usepackage{geometry}
\geometry{left=3.18cm,right=3.18cm,top=2.54cm,bottom=2.54cm}
\usepackage{hyperref}
\newcounter{problem}[section]
\newcommand{\rproblem}[1]
{
\stepcounter{problem}
\addcontentsline{toc}{subsection}{\textbf{Problem \arabic{problem}}}
\vspace{1em}
\begin{tcolorbox}[colback=black!20!white,colframe=black!50!white,title=\textbf{Problem \arabic{problem}}]
#1
\end{tcolorbox}
}
\begin{document}
\rproblem{\label{pb:p1}
My problem xxx.
}
This is answer \ref{pb:p1}.
\end{document}
答案1
我建议使用\newtcolorbox
宏来创建环境rproblem
,或者\newtcbox
生成一个基本与\rproblem
OP 的宏一样的框宏
计数器从定义开始就用作,problem
并且use counter=problem
将list of=toc
框添加到通常的 ToC,作为小节条目,因为\l@problem
被定义为\l@subsection
。
标签在\rproblem
with的可选参数中给出label=...
。
我提供了两种方法:使用\newtcbox
和\newtcolorbox
\documentclass[onecolumn,a4paper,10pt]{article}
\usepackage{tcolorbox}
\usepackage{geometry}
\geometry{left=3.18cm,right=3.18cm,top=2.54cm,bottom=2.54cm}
\usepackage{hyperref}
\newcounter{problem}[section]
\makeatletter
\let\l@problem\l@subsection
\makeatother
\tcbset{rproblem/.style={colback=black!20!white,
colframe=black!50!white,
title=\textbf{Problem \theproblem},
before skip=1em}
}
\newtcbox[use counter=problem,number within={section},list inside=toc]{\rproblem}[1][]{
rproblem,
#1
}
\newtcolorbox[use counter=problem,number within={section},list inside=toc]{rproblemenv}[1][]{
rproblem,
#1
}
\begin{document}
\tableofcontents
\section{Problems}
\rproblem[label={pb:p1}]{%
My problem xxx.
}
\begin{rproblemenv}[label={pb:p2}]
My problem xxx.
\end{rproblemenv}
This is answer \ref{pb:p1} or \ref{pb:p2}
\end{document}
答案2
如果您不想使用该tcolorbox
方法,则需要用 进行\stepcounter
替换\refstepcounter
。
这样做的原因是\label
使用\@currentlabel
来找出要引用的内容。基本上\refstepcounter
设置这个宏并增加计数器值。