我想对环境中自己定义的计数器进行交叉引用。到目前为止,我尝试了以下方法,
\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}
请注意,现在您甚至可以删除环境之前和之后的空行......