如何以特定方式使类定理环境的枚举不受交叉引用的影响

如何以特定方式使类定理环境的枚举不受交叉引用的影响

我正在写一篇数学论文,现在我正在使用

\newtheorem{theorem}{Theorem}[section]

列举定理、命题等。这样,每个陈述都显示章号、节号以及该节中陈述的编号。

这是相当标准的,但我想做一些不同的事情:我想在陈述命题时省略章节编号,但每次我在章节之外提到该命题时都显示它。

我已经在一些书上看到过它,有没有简单的方法可以做到这一点?

答案1

这就是你想要的

定理的标签

\renewcommand{\thetheorem}{\arabic{section}.\arabic{theorem}}

LaTex 使用前缀\p@counter进行交叉引用,即对定理的引用产生\p@theorem\thetheorem

在这种情况下,\p@theorem= null在章节内部和\p@theorem=chapter number外部。

\p@theorem=\ifnum\thechapter=chapter of theorem\else\thechapter.\fi

我们这样做

\renewcommand{\p@theorem}{\string\ifnum\string\thechapter=\thechapter\string\else\thechapter.\string\fi}

注意:\string对于辅助书写,无需扩展

\documentclass{book}
\newtheorem{theorem}{Theorem}[section]
\renewcommand{\thetheorem}{\arabic{section}.\arabic{theorem}}
\makeatletter
\renewcommand{\p@theorem}{\string\ifnum\string\thechapter=\thechapter\string\else\thechapter.\string\fi}
\makeatother
\begin{document}
\chapter{Foo}
bla bla bla
\section{Bar}
\begin{theorem}\label{th:first}
test
\end{theorem}
\ref{th:first}
\begin{theorem}\label{th:second}
test
\end{theorem}
\begin{theorem}\label{th:last}
test
\end{theorem}

\chapter{BAR}
bla bla bla
\section{Baz}
\begin{theorem}
test
\end{theorem}
\ref{th:first}
\end{document}

答案2

扩展 touhami 的想法,但使其也适用于非标准章节编号(例如附录中的定理),我将\p@theorem扩展为\compare@theorem{\thetheorem},其中\compare@theorem是一个受保护的宏;因此只有\thetheorem在写入文件时才会扩展.aux。宏\compare@theorem使用(在提供的\pdfstrcmp抽象下,因此代码也适用于 XeLaTeX 和 LuaLaTeX):使用它来比较字符串,而不是数字。\pdf@strcmppdftexcmds

\documentclass{book}
\usepackage{pdftexcmds}

\newtheorem{theorem}{Theorem}[section]

\renewcommand{\thetheorem}{\arabic{section}.\arabic{theorem}}

\makeatletter
\protected\def\compare@theorem#1{%
  \ifnum\pdf@strcmp{#1}{\thechapter}=\z@
  \else
    #1.%
  \fi
}
\renewcommand{\p@theorem}{\compare@theorem{\thechapter}}
\makeatother

\begin{document}
\chapter{Foo}
bla bla bla
\section{Bar}
\begin{theorem}\label{th:first}
test
\end{theorem}
\ref{th:first}
\begin{theorem}\label{th:second}
test
\end{theorem}
\begin{theorem}\label{th:last}
test
\end{theorem}

\chapter{BAR}
bla bla bla
\section{Baz}
\begin{theorem}
test
\end{theorem}
\ref{th:first}

\ref{th:app}

\appendix

\chapter{APP}

\section{Aps}

\begin{theorem}\label{th:app}
test
\end{theorem}

\ref{th:app}

\end{document}

答案3

以下解决方案比@touhami 相当聪明的方法更重要;作为交换,您可以获得有关定理界面更改的更多灵活性。

如何使用:使用 定义新定理环境后,\newtheorem您可以使用新命令\theoremnum指定独立于引用机制的编号。(同一章中引用的附加属性应显示与它们引用的定理相同的编号。)在您的例子中,您将声明:

\theoremnum{theorem}{\arabic{section}.\arabic{theorem}}

之后\newtheorem{theorem}{Theorem}[section]删除章节编号。

输出部分-1

输出部分-2

输出部分-3

完整代码

\documentclass{report}
\usepackage{xstring}

\makeatletter
\newcommand{\theoremnum}[2]{%
  \expandafter\let\csname the#1@\expandafter\endcsname\csname the#1\endcsname
  \expandafter\def\csname the#1\endcsname{#2}
  \expandafter\def\csname label@#1\endcsname##1{%
    \@bsphack
    \protected@write\@auxout{}%
      {\string\newlabel{##1}{{\csname the#1\endcsname}{\thepage}}}%
    \protected@write\@auxout{}%
      {\string\newlabel{##1@full}{{\csname the#1@\endcsname}{\thepage}}}%
    \@esphack%
  }
  \expandafter\g@addto@macro\csname #1\endcsname{%
    \expandafter\let\csname label\expandafter\endcsname\csname label@#1\endcsname%
  }
}
\let\orig@ref\ref
\renewcommand{\ref}[1]{%
  \NumBefore{\orig@ref{#1@full}}[\@refchapter]%
  \ifnum\thechapter=\@refchapter\relax
    \orig@ref{#1}
  \else
    \orig@ref{#1@full}
  \fi%
}
\def\NumBefore#1{%
  \kernel@ifnextchar[{\NumBefore@{#1}}{\NumBefore@{#1}[]}%
}
\def\NumBefore@#1[#2]{%
  \begingroup\edef\x{\endgroup\noexpand\find@sep#1.\relax}\x
  \StrBefore{#1}{\@sep}[#2]%
}
\def\find@sep#1#2\relax{%
  \if<\ifnum9<1#1<\else>\fi
    \expandafter\find@sep#2.\relax%
  \else
    \def\@sep{#1}%
  \fi
}
\makeatother

\newtheorem{theorem}{Theorem}[section]
\theoremnum{theorem}{\arabic{section}.\arabic{theorem}}

\begin{document}
\chapter{baz}
\section{zzzzz}

\noindent Reference to \verb|thm:test| \emph{outside} of chapter `foo': \ref{thm:test}

\chapter{foo}
\section{zzz}

\begin{theorem}
  \label{thm:test}
  Test theorem.
\end{theorem}

\noindent Reference to \verb|thm:test| \emph{inside} of chapter `foo': \ref{thm:test}

\chapter{bar}
\section{zzzz}

\noindent Reference to \verb|thm:test| \emph{outside} of chapter `foo': \ref{thm:test}
\end{document}

笔记:此解决方案使用交叉引用机制的重新定义,因此无法使用heyperref。如果这是标准,您最好采用其他解决方案。

相关内容