mdframed의 수동 라벨링 및 상호 참조

mdframed의 수동 라벨링 및 상호 참조

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}

환경 \manuallabel뒤에 명령 명령이 없으면 모든 것이 잘 작동합니다. 그러나 나중에 이 질문에 대한 답변 으로 참조할 항목을 ProblemSpecBox포함하면\manuallabel\ref{ProblemO}수동으로 참조 값 설정다음과 같은 오류가 발생합니다.

! \manuallabel의 인수에는 추가 }가 있습니다.

! \manuallabel이 완료되기 전에 단락이 끝났습니다.

누군가가 이 문제를 해결하도록 도와주시면 감사하겠습니다.

답변1

새 명령을 정의하는 대신 \label환경 선언 내에서 레이블 이름을 수정할 수 있습니다.

또한 환경의 시작과 필수 인수 사이에 배치했기 때문에 명령을 제대로 사용하지 않거나 \newenvironment이 새 환경을 제대로 사용하지 않는 것입니다 .\manuallabel

다음은 몇 가지 문제가 해결된 코드입니다.

\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}

산출

부록

@evansdoe의 요청에 따라 제목과 참조 이름은 위의 답변에서 허용되지 않는 달라야 합니다. 다음 코드는 위와 동일한 방식으로 작동하지만 참조 레이블을 사용자 정의하는 환경 선언에서 선택적 인수도 허용합니다. 사용자 정의 참조 레이블이 지정되지 않은 경우 제목이 사용됩니다.

\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}

산출

답변2

@jpellis 답변을 약간 수정하면 문제가 해결됩니다.

\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}

@jpellis의 답변에서 제목과 참조는 다음과 동일합니다.

여기에 이미지 설명을 입력하세요

그러나 위의 LaTeX 코드에서 생성된 정답은 다음과 같습니다.

여기에 이미지 설명을 입력하세요

질문에 답하는 것입니다.

관련 정보