自定义计数器,交叉引用环境

自定义计数器,交叉引用环境

我想对环境中自己定义的计数器进行交叉引用。到目前为止,我尝试了以下方法,

\documentclass{book}
\newcounter{entryc}[subsection]
\newcommand{\thetheorem}{\thesubsection.\arabic{entryc}}
\newenvironment{qd}[1]{\refstepcounter{entryc}\noindent\textbf{Quasi Definition \thetheorem.}\begin{itshape}}
{\end{itshape}}
%
\begin{document}

\chapter{First chapter}
This is the first chapter.

\section{First section}
This is the first section.

\subsection{First subsection}
This is the first subsection.

\begin{qd}{}\label{qd:emp} This is my environment. \end{qd}

\noindent In quasi definition \ref{qd:emp} it \dots

\end{document}

发生的事情是

截屏

但我更喜欢“...在准定义 1.1.1.1 中”。有人对如何解决这个问题有什么建议吗?以及如何避免在文本继续之前出现 \noindent 问题?

附加信息:如果可能的话我会尝试不使用 ntheorem。

答案1

这是一个不需要修改的解决方案。由于您已经通过\@currentlabel定义了计数器,因此只需将以下三行代码添加到您的序言中即可:entryc\newcounter

\makeatletter
\renewcommand{\p@entryc}{\thesubsection.}
\makeatother

默认情况下,宏\p@entryc为空,但可以通过语句更改\renewcommand为(几乎)任何其他内容 - 例如\thesubsection.。的值\p@entryc作为值的前缀,\label以创建当发生对实体(例如您的环境)的交叉引用时将生成的字符串,qd从而增加计数器entryc

以下修改后的 MWE 形式实现了这个想法。它还对环境的定义进行了一些小的更改qd(例如使用显式\par语句),并使用@karlkoeller 的想法来加载noindentafter包并执行\NoIndentAfterEnv{qd}

在此处输入图片描述

\documentclass{book}
\newcounter{entryc}[subsection]
\makeatletter
\renewcommand{\p@entryc}{\thesubsection.} % "prefix" for cross-referencing
\makeatother
\newenvironment{qd}
   {\par\refstepcounter{entryc}
    \noindent\textbf{Quasi Definition \thesubsection.\arabic{entryc}.}
    \em}  % suggest you use \em instead of \begin/\end {itshape}
   {\par} % use explicit \par statements to play it safe 
\usepackage{noindentafter}
\NoIndentAfterEnv{qd}
\usepackage[colorlinks=true]{hyperref}

\begin{document}
\chapter{First chapter}
  This is the first chapter.
\section{First section}
  This is the first section.
\subsection{First subsection}
  This is the first subsection.
\begin{qd}\label{qd:emp} This is my environment. \end{qd}
In quasi definition \ref{qd:emp}, it is shown that \dots
\end{document}

答案2

问题是您必须定义\@currentlabel才能为您的 赋予正确的值\label

entryc因此,通过为计数器分配新值后\refstepcounter,需要添加\protected@edef\@currentlabel{\thetheorem}(在这种情况下可能\def\@currentlabel{\thetheorem}就足够了)。

换句话说,将你的环境定义更改为

\makeatletter
\newenvironment{qd}{%
  \refstepcounter{entryc}\protected@edef\@currentlabel{\thetheorem}%
  \noindent\textbf{Quasi Definition \thetheorem.}\itshape}{}
\makeatother

请注意,由于您没有使用它,我已删除该参数。

平均能量损失

\documentclass{book}
\newcounter{entryc}[subsection]
\newcommand{\thetheorem}{\thesubsection.\arabic{entryc}}

\makeatletter
\newenvironment{qd}{%
  \refstepcounter{entryc}\protected@edef\@currentlabel{\thetheorem}%
  \noindent\textbf{Quasi Definition \thetheorem.}\itshape}{}
\makeatother


\begin{document}

\chapter{First chapter}
This is the first chapter.

\section{First section}
This is the first section.

\subsection{First subsection}
This is the first subsection.

\begin{qd}\label{qd:emp} This is my environment. \end{qd}

\noindent In quasi definition \ref{qd:emp} it \dots

\end{document} 

输出:

在此处输入图片描述


附录

我刚刚意识到您要求一种避免\noindent在环境关闭后发出问题的方法......

为了实现这一点,您可以加载包noindentafter并发出命令

\NoIndentAfterEnv{qd}

以下 MWE 给出与上图相同的结果。

\documentclass{book}
\newcounter{entryc}[subsection]
\newcommand{\thetheorem}{\thesubsection.\arabic{entryc}}

\makeatletter
\newenvironment{qd}{%
  \par\refstepcounter{entryc}\protected@edef\@currentlabel{\thetheorem}%
  \noindent\textbf{Quasi Definition \thetheorem.}\itshape}{}
\makeatother

\usepackage{noindentafter}
\NoIndentAfterEnv{qd}

\begin{document}

\chapter{First chapter}
This is the first chapter.

\section{First section}
This is the first section.

\subsection{First subsection}
This is the first subsection.

\begin{qd}\label{qd:emp} This is my environment. \end{qd}

In quasi definition \ref{qd:emp} it \dots

\end{document} 

请注意,现在您甚至可以删除环境之前和之后的空行......

相关内容