我正在尝试创建一个可引用的“系统”环境,该环境基本上显示带有自定义计数器的方程式。然后我想用 引用该环境autoref
,以便在引用它时将“系统 (S1)”作为输出。
\newcounter{system}\setcounter{system}{0}
\newenvironment{system}{\refstepcounter{system}\begin{equation*}}{\hfill(S\arabic{system})
\end{equation*}}
\hyperref[system]{System~\ref{system}}
\def\systemautorefname{System}
\begin{system}
\dot x=u(x),
\label{s1}
\end{system}
然而,当我这样做的时候
\autoref{s1}
我收到一条错误消息,提示引用s1
未定义。我遗漏了什么?
答案1
一些评论:
- 标签已使用名称
s1
,引用system
。标签名称必须匹配,下例使用s1
。 - use
equation*
表示可能amsmath
使用该包。 - 可以
amsmath
\tag
用来打印方程式编号。 - 重新定义
\p@system
有助于在引用数字时获得数字周围的括号。 - 我已将具有名称的
\label
外部环境equation
作为环境选项,system
以避免重新定义\label
内部环境的麻烦amsmath
。 - 的星号形式
\ref
避免了在带有 的行内的链接中使用链接\hyperref
。
例子:
\documentclass{article}
\usepackage{amsmath}
\usepackage{hyperref}
\newcounter{system}
\renewcommand*{\thesystem}{S\arabic{system}}
\newcommand*{\systemautorefname}{System}
\makeatletter
\renewcommand*{\p@system}{%
\expandafter\p@@system
}
\newcommand*{\p@@system}[1]{%
(#1)%
}
\makeatother
\newenvironment{system}[1][]{%
\refstepcounter{system}%
\ifx\\#1\\%
\else
\label{#1}%
\fi
\begin{equation}%
}{%
\tag{\thesystem}%
\end{equation}%
}
\begin{document}
\hyperref[s1]{System~\ref*{s1}}, \autoref{s1}
\begin{system}[s1]
\dot x=u(x),
\end{system}
\end{document}