Я пытаюсь построить среду теоремы, которая выглядит примерно так:
1.1 Theorem Statement of the theorem. Here is some extra text so you can see how the
theorem body text should be indented (aligned with theorem head).
Заголовок теоремы должен быть жирным, без знаков препинания после. Интервал между thmnumber
и thmname
должен быть регулируемым. Основной текст обычный.
Я хочу иметь возможность использовать окружение также и для определений (которые не будут пронумерованы), поэтому должна быть возможность удалить номер, не влияя на выравнивание заголовка теоремы. Пример:
Definition Statement of the definition. It should be aligned the same way as a
theorem.
Here is some body text in the document. Note that the theorem numbers are not in the
margin.
1.1 Theorem Statement of the theorem. Here is some extra text so you can see how the
theorem body text should be indented (aligned with theorem head).
решение1
Вот способ сделать это; это также будет соответствовать спискам, таким как enumerate
в операторе, решения с которыми \hangindent
не будут соответствовать.
\documentclass{article}
\usepackage{showframe} % just for the example
\usepackage{amsthm}
\usepackage{enumitem}
\usepackage{xparse}
\usepackage{lipsum}
\newtheoremstyle{fctaylor}% name
{\topsep}% Space above
{\topsep}% Space below
{\normalfont}% Body font
{}% Indent amount (empty = no indent, \parindent = para indent)
{\bfseries}% Thm head font
{}% Punctuation after thm head
{0pt}% Space after thm head: " " = normal interword space;
{\makethmhead{#1}{#2}{#3}}
\newlength\fctaylortheoremindent
\AtBeginDocument{\setlength\fctaylortheoremindent{3em}} % <- customize here
\newlength\fctaylorlabelsep
\AtBeginDocument{\setlength\fctaylorlabelsep{1em}} % <- customize here
\makeatletter
\newcommand{\makethmhead}[3]{%
\gdef\thisthmhead{%
\makebox[\fctaylortheoremindent][l]{\bfseries#2}%
{\bfseries#1}%
\@ifnotempty{#3}{ (#3)}%
\hspace{\fctaylorlabelsep}%
}%
}
\makeatother
\newenvironment{fctayloritemize}
{\list{}{%
\leftmargin=\fctaylortheoremindent
\labelwidth=\dimexpr\fctaylortheoremindent-\labelsep\relax
\itemindent=0pt
}}
{\endlist}
\NewDocumentCommand{\newfctaylortheorem}{smomo}{%
\IfBooleanTF{#1}
{\newtheorem*{fctaylor@#2}{#4}}
{\IfNoValueTF{#3}
{\IfNoValueTF{#5}
{\newtheorem{fctaylor@#2}{#4}}
{\newtheorem{fctaylor@#2}{#4}[#5]}}
{\newtheorem{fctaylor@#2}[fctaylor@#3]{#4}}}%
\NewDocumentEnvironment{#2}{o}
{\IfNoValueTF{##1}{\begin{fctaylor@#2}}{\begin{fctaylor@#2}[##1]}%
\begin{fctayloritemize}\item[\thisthmhead\hfill]}
{\end{fctayloritemize}\end{fctaylor@#2}}%
}
\theoremstyle{fctaylor}
\newfctaylortheorem{thm}{Theorem}[section]
\newfctaylortheorem*{defn}{Definition}
\begin{document}
\section{One}
\begin{defn}
\lipsum*[2]
\end{defn}
\begin{thm}\label{A}
\lipsum*[2]
\end{thm}
\begin{thm}[Somebody]\label{B}
Something that should show how the text is split across line boundaries
and is correctly indented. And some equivalent conditions:
\begin{enumerate}[label=\upshape(\alph*),ref=(\alph*)]
\item a condition
\item another
\item and another
\end{enumerate}
which show the point made.
\end{thm}
\ref{A} and \ref{B}
\end{document}
решение2
Вот возможность использованияthmtools
как интерфейс дляamsthm:
Код (настройте параметры в соответствии с вашими потребностями; в частности, измените их так, \thmindent
чтобы получить желаемый висячий отступ для структур, подобных теоремам):
\documentclass{article}
\usepackage{amsmath}
\usepackage{amsthm}
\usepackage{thmtools}
\usepackage{lipsum}
\newlength\thmindent
\setlength\thmindent{2.5em}
\declaretheoremstyle[
spaceabove=6pt,
spacebelow=6pt,
headfont=\normalfont\bfseries,
notefont=\normalfont\bfseries,
notebraces={(}{)},
bodyfont=\normalfont,
postheadspace=0.5em,
numberwithin=section,
headformat={\makebox[\thmindent]{\NUMBER\hfill}\NAME\NOTE},
postheadhook=\hangindent=\thmindent
]{nuswapindented}
\declaretheoremstyle[
spaceabove=6pt,
spacebelow=6pt,
headfont=\normalfont\bfseries,
notefont=\normalfont\bfseries,
notebraces={(}{)},
bodyfont=\normalfont,
postheadspace=0.5em,
numbered=no,
headformat={\makebox[\thmindent]{\mbox{}\hfill}\NAME\NOTE},
postheadhook=\hangindent=\thmindent
]{unnuswapindented}
\declaretheorem[style=nuswapindented,name=Theorem]{theo}
\declaretheorem[style=unnuswapindented,name=Definition]{defi}
\begin{document}
\section{Test section}
\lipsum[4]
\begin{defi}
\lipsum[4]
\end{defi}
\lipsum[4]
\begin{theo}
\lipsum[4]
\end{theo}
\end{document}
решение3
Это можно сделать с помощью ntheorem
пакета и его change
Theoremstyle. Расстояние между именем теоремы и Theoremnumber можно отрегулировать, изменив стиль теоремы: Я ввожу новое измерение, thlabelsep
которое по умолчанию 0.5em
и может быть изменено в преамбуле:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{amsmath}
\usepackage[thmmarks, amsmath, thref]{ntheorem}
\usepackage{cleveref}
\newdimen\thlabelsep
\global\thlabelsep0.5em
\makeatletter
\renewtheoremstyle{change}%
{\item[\hskip\labelsep \theorem@headerfont ##2\hskip\thlabelsep##1\theorem@separator]}%
{\item[\hskip\labelsep \theorem@headerfont ##2\hskip\thlabelsep##1\ (##3)\theorem@separator]}
\makeatother
\theoremstyle{change}
\thlabelsep1.5em
\theoremheaderfont{\bfseries\upshape}
\theoremseparator{}
\theorembodyfont{\upshape}
\newtheorem{thm}{Theorem}[section]
\theoremstyle{nonumberplain}
\newtheorem{defn}{Definition}
\begin{document}
\section{Two Conjectures}
\begin{defn}
A Sophie Germain prime is a prime number $ p $ such that $ 2p + 1$ is also prime.
\end{defn}
\begin{thm}
There is an infinity of twin primes. Related: There is an infinity of Sophie Germain primes.
\end{thm}
\end{document}