Etiquetado manual y referencias cruzadas en mdframed

Etiquetado manual y referencias cruzadas en mdframed

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 \manuallabeltras ProblemSpecBoxentorno, todo funciona bien. Sin embargo, si incluyo \manuallabelcuá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 \labelcomando, puede simplemente modificar el nombre de la etiqueta dentro de la declaración del entorno.

Además, no estás usando el \newenvironmentcomando correctamente, ni tampoco estás usando este nuevo entorno correctamente porque lo colocaste \manuallabelentre 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}

producción

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}

producción

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

ingrese la descripción de la imagen aquí

Sin embargo, la respuesta correcta producida por el código LaTeX anterior da

ingrese la descripción de la imagen aquí

que responde a la pregunta.

información relacionada