44

This one should be easy for the gurus…

Suppose I want to define a theorem environment which has a custom numbering scheme. That is, instead of being numbered according to some counter, it is numbered according to a passed parameter. So writing something like

\begin{customtheorem}{8}
   Text.
\end{custom theorem}

would produce

Theorem 8. Text.

I realize I could define a new environment on my own, but then the header will be bold, or small caps, or whatever I defined it to be, and so may differ from the rest of the document if I switch documentclass. So I would like something that also matches the regular theorem headers.

Thanks in advance for any ideas.

53

An easy way is

\documentclass{article}
%\usepackage{amsthm} %% uncomment to see the difference
\newtheorem{innercustomthm}{Theorem}
\newenvironment{customthm}[1]
  {\renewcommand\theinnercustomthm{#1}\innercustomthm}
  {\endinnercustomthm}

\begin{document}

\begin{customthm}{8}\label{eight}
Every theorem must be numbered by hand.
\end{customthm}

Here is a reference to theorem~\ref{eight}.
\end{document}

You can also use the optional argument for attribution:

\begin{customthm}{99}[Somebody]\label{ninetynine}
Statement.
\end{customthm}

A more generic interface for defining several of these environments; this doesn't respect theorem styles; it could be adapted, though.

\documentclass{article}
\usepackage{amsthm}

\newtheorem{innercustomgeneric}{\customgenericname}
\providecommand{\customgenericname}{}
\newcommand{\newcustomtheorem}[2]{%
  \newenvironment{#1}[1]
  {%
   \renewcommand\customgenericname{#2}%
   \renewcommand\theinnercustomgeneric{##1}%
   \innercustomgeneric
  }
  {\endinnercustomgeneric}
}

\newcustomtheorem{customthm}{Theorem}
\newcustomtheorem{customlemma}{Lemma}

\begin{document}

\begin{customthm}{8}\label{eight}
Every theorem must be numbered by hand.
\end{customthm}

Here is a reference to theorem~\ref{eight} and
one to the important lemma~\ref{life-universe-everything}

\begin{customlemma}{42}\label{life-universe-everything}
This lemma explains everything.
\end{customlemma}


\end{document}

enter image description here

  • 1
    I guess that's simpler than mine (and allows non numeric values too) – David Carlisle May 1 '12 at 16:48
  • @DavidCarlisle Yes, it uses the fact that innercustomthm is stepped, so the reference is established, but \theinnercustomthm is used, which can contain anything (well, almost). – egreg May 1 '12 at 16:50
  • 1
    @egreg and is it possible to extend this to definition, lemma? – athos Jul 3 '14 at 6:59
  • 1
    @athos \newtheorem{innercustomlemma}{Lemma} and \newenvironment{customlemma}[1]{\renewcommand\theinnercustomlemma{#1}\innercustomlemma}{\endinnercustomlemma} – egreg Jul 3 '14 at 8:00
  • 2
    @PhoemueX I'm not sure why you'd like to do that. You can do \makeatletter\newcommand\manuallabel[1]{\def\@currentlabel{#1}}\makeatletter and use \begin{customthm}{8}\manuallabel{-5}\label{abc} – egreg Jan 17 '18 at 11:41
9

You can just temporarily reset your theorem counter:

\documentclass{article}
\usepackage{amsthm}


\newtheorem{Theorem}{Theorem}



\makeatletter

\newenvironment{customTheorem}[1]
  {\count@\c@Theorem
   \global\c@Theorem#1 %
    \global\advance\c@Theorem\m@ne
   \Theorem}
  {\endTheorem
   \global\c@Theorem\count@}

\makeatother


\begin{document}


\begin{Theorem}
Dummy text
\end{Theorem}

\begin{customTheorem}{99}
Dummy text
\end{customTheorem}

\begin{Theorem}
Dummy text
\end{Theorem}


\end{document}

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.