
La pregunta se hace después del MWE.
\documentclass[10pt,a4paper]{article}
\usepackage{amsmath,amsfonts}
\usepackage[framemethod=tikz]{mdframed}
\usepackage[colorlinks=true, linktocpage=false]{hyperref}
\hypersetup{
citecolor = {blue}
}
\makeatletter
\newcommand{\manuallabel}[2]{\def\@currentlabel{#2}\label{#1}}
\makeatother
\newenvironment{ProblemSpecBox}[2]
{%
\begin{mdframed}[innerlinewidth=0.5pt,%
innerleftmargin=10pt, innerrightmargin=10pt,%
innertopmargin = 10pt, innerbottommargin=10pt,%
skipabove=\dimexpr\topsep+\ht\strutbox\relax,%
roundcorner=5pt, frametitle={#1},%
frametitlerule=true, frametitlerulewidth=1pt]
{#2}
\end{mdframed}
}
\begin{document}
This is a test example
\begin{ProblemSpecBox} \manuallabel{prob:ProblemO}{Problem O} % I think this is where the problem is.
{
Problem O for $\mathbb{C}$
}
{
\emph{Given} $a, b \in \mathbb{C}$; \emph{Find} $n \in \mathbb{Z}$ such that
\[
|a|^{n} = |b|
\]
}
\end{ProblemSpecBox}
\ref{prob:ProblemO} % This must display Problem O i.e., the second argument of \manuallabel which will be linked to it's source by hyperref.
\end{document}
Sin el comando comando \manuallabel
tras ProblemSpecBox
entorno, todo funciona bien. Sin embargo, si incluyo \manuallabel
cuál es la referencia posterior \ref{ProblemO}
como se responde en esta preguntaEstablecer valores de referencia manualmenteRecibo los siguientes errores:
! El argumento de \manuallabel tiene un }.
! El párrafo terminó antes de que se completara \manuallabel.
Agradecería si alguien pudiera ayudarme a resolver este problema.
Respuesta1
En lugar de definir un nuevo \label
comando, puede simplemente modificar el nombre de la etiqueta dentro de la declaración del entorno.
Además, no estás usando el \newenvironment
comando correctamente, ni tampoco estás usando este nuevo entorno correctamente porque lo colocaste \manuallabel
entre el inicio del entorno y su argumento obligatorio.
Aquí está el código con estos pocos problemas solucionados:
\documentclass[10pt,a4paper]{article}
\usepackage{amsmath,amsfonts}
\usepackage[framemethod=tikz]{mdframed}
\usepackage[colorlinks=true, linktocpage=false]{hyperref}
\hypersetup{
citecolor = {blue}
}
\makeatletter
\newenvironment{ProblemSpecBox}[1]{
\protected@edef\@currentlabelname{#1}
\protected@edef\@currentlabel{#1}
\begin{mdframed}[
innerlinewidth=0.5pt,
innerleftmargin=10pt,
innerrightmargin=10pt,
innertopmargin = 10pt,
innerbottommargin=10pt,
skipabove=\dimexpr\topsep+\ht\strutbox\relax,
roundcorner=5pt,
frametitle={#1},
frametitlerule=true,
frametitlerulewidth=1pt]
}{
\end{mdframed}
}
\makeatother
\begin{document}
This is a test example:
\begin{ProblemSpecBox}{Problem O}
\label{prob:ProblemO}
\emph{Given} $a, b \in \mathbb{C}$; \emph{Find} $n \in \mathbb{Z}$ such that
\[
|a|^{n} = |b|
\]
\end{ProblemSpecBox}
Reference: \ref{prob:ProblemO}
\end{document}
Apéndice
Según lo solicitado por @evansdoe, el título y el nombre de referencia deben ser diferentes, lo que la respuesta anterior no permite. El siguiente código funciona de la misma manera que el anterior, pero también permite un argumento opcional en la declaración del entorno que personalizará la etiqueta de referencia. Si no se especifica ninguna etiqueta de referencia personalizada, se utiliza el título.
\documentclass[10pt,a4paper]{article}
\usepackage{amsmath,amsfonts}
\usepackage[framemethod=tikz]{mdframed}
\usepackage[colorlinks=true, linktocpage=false]{hyperref}
\hypersetup{
citecolor = {blue}
}
\makeatletter
\def\ProblemSpecBox{
\@ifnextchar[\ProblemSpecBox@opt{\ProblemSpecBox@noopt}}
\def\ProblemSpecBox@opt[#1]#2{
\protected@edef\@currentlabelname{#1}
\protected@edef\@currentlabel{#1}
\begin{mdframed}[
innerlinewidth=0.5pt,
innerleftmargin=10pt,
innerrightmargin=10pt,
innertopmargin = 10pt,
innerbottommargin=10pt,
skipabove=\dimexpr\topsep+\ht\strutbox\relax,
roundcorner=5pt,
frametitle={#2},
frametitlerule=true,
frametitlerulewidth=1pt]
}
\def\ProblemSpecBox@noopt#1{
\ProblemSpecBox@opt[#1]{#1}
}
\def\endProblemSpecBox{
\end{mdframed}
}
\makeatother
\begin{document}
This is a test example:
\begin{ProblemSpecBox}[Problem 0]{Problem 0 in \(\mathbb{C}\)}
\label{prob:ProblemO}
\emph{Given} $a, b \in \mathbb{C}$; \emph{Find} $n \in \mathbb{Z}$ such that
\[
|a|^{n} = |b|
\]
\end{ProblemSpecBox}
Reference: \ref{prob:ProblemO}
\end{document}
Respuesta2
Con una pequeña modificación de la respuesta de @jpellis, esto resuelve el problema.
\documentclass[10pt,a4paper]{article}
\usepackage{amsmath,amsfonts}
\usepackage[framemethod=tikz]{mdframed}
\usepackage[colorlinks=true, linktocpage=false]{hyperref}
\hypersetup{
citecolor = {blue}
}
\makeatletter
\newenvironment{ProblemSpecBox}[2]{ % Takes two arguments and not one
\protected@edef\@currentlabelname{#2}
\protected@edef\@currentlabel{#2}
\begin{mdframed}[
innerlinewidth=0.5pt,
innerleftmargin=10pt,
innerrightmargin=10pt,
innertopmargin = 10pt,
innerbottommargin=10pt,
skipabove=\dimexpr\topsep+\ht\strutbox\relax,
roundcorner=5pt,
frametitle={#1},
frametitlerule=true,
frametitlerulewidth=1pt]
}{
\end{mdframed}
}
\makeatother
\begin{document}
This is a test example:
\begin{ProblemSpecBox}{Problem O for \mathbb{C}}{Problem O}
\label{prob:ProblemO}
\emph{Given} $a, b \in \mathbb{C}$; \emph{Find} $n \in \mathbb{Z}$ such that
\[
|a|^{n} = |b|
\]
\end{ProblemSpecBox}
Reference: \ref{prob:ProblemO}
\end{document}
Tenga en cuenta que en la respuesta de @jpellis el título y la referencia son los mismos que en
Sin embargo, la respuesta correcta producida por el código LaTeX anterior da
que responde a la pregunta.