我想创建一个定理样式,使定理的缩进与 \hangindent 完全相同,期望缩进应该持续定理的所有段落。
例如:
Theorem 1.2.3: Lipsum Lorem ipsum dolor sit amet,
consectetuer adipiscing elit. Ut purus elit,
vestibulum ut, placerat ac, adipiscing vitae, felis.
Curabitur dictum gravida mauris. Nam arcu libero,
nonummy eget, consectetuer id, vulputate ...
我尝试了这个,但它不能正常工作:
\documentclass[parskip=half]{scrartcl}
\usepackage{amsthm,thmtools}
\usepackage{lipsum}
\usepackage{showframe}
\let\thm\relax
\declaretheoremstyle[
headfont=\bfseries,
bodyfont=\normalfont\leftskip2.5em,
headindent={-2.5em}
]{INDENTthm}
\declaretheorem[
within=section,
style=INDENTthm,
name=Theorem
]{thm}
\begin{document}
\begin{thm}
\lipsum[1]
\lipsum[2]
\end{thm}
\end{document}
所发生的情况是,定理标题突然相对于页面有一个负缩进,即从实际页面的左边开始,虽然我期望“2.5em-2.5em = 0em”...... :-)
答案1
我不喜欢这种缩进。但是,使用这种方法没有\leftskip
好的解决办法,因为定理是以列表的形式实现的;尝试enumerate
为你的定理添加一个环境,然后看看。
你的问题是你使用二不同的 em:中号系列和粗体系列是不同的。因此,这两个事实需要不同的解决方案。
\documentclass[a4paper]{scrartcl}
\usepackage{amsthm,thmtools}
\usepackage{lipsum}
\usepackage{showframe}
\declaretheoremstyle[
headfont=\kern-2.5em\bfseries,
bodyfont=\normalfont,
headindent=0pt,
]{INDENTthm}
\declaretheorem[
within=section,
style=INDENTthm,
name=Theorem
]{thm}
\usepackage{etoolbox}
\makeatletter
\AtBeginEnvironment{thm}{%
\patchcmd\@thm
{\trivlist}
{\list{}{\leftmargin2.5em\itemindent-15em}}
{}{}%
\patchcmd\thmt@original@endthm{\endtrivlist}{\endlist}{}{}%
}
\makeatother
\begin{document}
\begin{thm}
\lipsum*[2]
\begin{enumerate}
\item a
\item b
\end{enumerate}
\end{thm}
\end{document}
这只对环境进行了修补thm
。林真在评论中正确指出,
\patchcmd\thmt@original@endthm{\endtrivlist}{\endlist}{}{}%
定理的线lemma
应该变成
\patchcmd\thmt@original@endlemma{\endtrivlist}{\endlist}{}{}%
如果有多个类似定理的环境,并且所有环境都应该共享悬挂缩进,那么最好将过程抽象化。\xdeclaretheorem
下面定义的命令将执行此操作。
\documentclass[a4paper]{scrartcl}
\usepackage{amsthm,thmtools}
\usepackage{etoolbox}
\usepackage{lipsum}
\usepackage{showframe}
\makeatletter
\patchcmd\@thm
{\trivlist}
{\list{}{\leftmargin2.5em\itemindent-15em}}
{}{}
\newcommand{\xdeclaretheorem}[2][]{%
\declaretheorem[#1]{#2}%
\expandafter\patchcmd\csname thmt@original@end#2\endcsname
{\endtrivlist}{\endlist}{}{}%
}
\declaretheoremstyle[
headfont=\kern-2.5em\bfseries,
bodyfont=\normalfont,
headindent=0pt,
]{INDENTthm}
\xdeclaretheorem[
within=section,
style=INDENTthm,
name=Theorem
]{thm}
\xdeclaretheorem[
sibling=thm,
style=INDENTthm,
name=Lemma
]{lem}
\begin{document}
\begin{thm}
\lipsum*[2]
\begin{enumerate}
\item a
\item b
\end{enumerate}
\end{thm}
\begin{lem}
\lipsum*[2]
\begin{enumerate}
\item a
\item b
\end{enumerate}
\end{lem}
\end{document}
万一一些类似定理的环境应该有悬挂缩进代码
\AtBeginEnvironment{#2}{%
\patchcmd\@thm
{\trivlist}
{\list{}{\leftmargin2.5em\itemindent-15em}}
{}{}%
}
应添加到 的定义中\xdeclaretheorem
并删除全局补丁。当然,非缩进环境应使用\declaretheorem
。
答案2
我已经硬连线了缩进,但你应该能够将它们更改为参数,然后将其恢复为原始状态
\documentclass{article}
\parindent 0in
\parskip 1em
\let\svpar\par
\newenvironment{hang}{\hangindent 0.7in\def\par{\svpar\hangindent
0.7in\parindent 0.7in}}
{\let\par\svpar\parindent 0in}
\begin{document}
non-indented text
\begin{hang}
erew ewr ewr ew rwe fsgfkgwerlktmn gghlkrgtkj rgngmn
krwghj,gn ghrgtkrkltgrkgfremgrtgklrwtklrgfd,m srjhgksg
continuing test to new paragraph
finally ending test now
\end{hang}
non-indent
\end{document}