定义命令以便 \label 正常工作

定义命令以便 \label 正常工作

我有类似的东西:

\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在开头添加一个显式,并将\medskipand\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}

相关内容