我正在写一篇数学论文,现在我正在使用
\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@strcmp
pdftexcmds
\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]
删除章节编号。
完整代码
\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
。如果这是标准,您最好采用其他解决方案。