![定义命令以便 \label 正常工作](https://linux22.com/image/235638/%E5%AE%9A%E4%B9%89%E5%91%BD%E4%BB%A4%E4%BB%A5%E4%BE%BF%20%5Clabel%20%E6%AD%A3%E5%B8%B8%E5%B7%A5%E4%BD%9C.png)
我有类似的东西:
\newcounter{Def}
\newcommand{\printDef}{\thechapter.\thesection.\theDef}
\newenvironment{Expl}
{\small\narrower\medskip\stepcounter{Def}\noindent\ignorespaces \textsc{Example \printDef.}}
{\par\normalsize\medskip}
进而:
\begin{Expl} \label{myref}
blahblahblah
\end{Expl}
假设当前部分是 2.4,那么它将打印类似以下内容:
例 2.4.1。
但是,当我这样做时\ref{myref}
,它只会打印 2.4。1 完全消失了!有人可以帮忙吗?谢谢!
答案1
您需要更改一些代码才能使其工作:
- 您应该重新定义,
\theDef
而不是使用\printDef
。它用于内部代码。您可以添加旧定义,以\arabic{Def}
将计数器值打印为正常(即阿拉伯数字)。 - 使用
\refstepcounter
而不是。这将设置所使用的\stepcounter
内部宏。然后 的当前值将在 中使用。\@currentlabel
\label
\theDef
\ref
还:
- 请注意,根据所使用的文档类,
\thesection
宏已包含\thechapter
。例如,report
章节号将被打印两次。(因此我在示例中禁用了它)。 - 应该
\ignorespaces
放在最后才能有效。 - 您不需要在最后将字体改回正常,因为无论如何所有的更改都只是环境内容的本地更改。
- 您应该
\par
在开头添加一个显式,并将\medskip
and\noindent
放在其后。它们也可以在当前位置工作,但这样会更简洁。
工作代码如下:
\documentclass{report}
\newcounter{Def}
\renewcommand{\theDef}{%\thechapter.
\thesection.\arabic{Def}}
\newenvironment{Expl}
{\par\medskip\noindent\small\narrower\refstepcounter{Def}\textsc{Example~\theDef.}\ignorespaces}
{\par\medskip}
\begin{document}
\chapter{Test}
\chapter{Test}
\section{A}
\begin{Expl}\label{test}
Test
\end{Expl}
See \ref{test}.
\begin{Expl}\label{test2}
Test2
\end{Expl}
See \ref{test2}.
\end{document}