
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コードによって生成される正しい答えは
質問に答えます。