在页边空白处对段落和定理进行编号

在页边空白处对段落和定理进行编号

我想创建一个特殊的段落环境,并对其进行编号,并将编号放在页边距中。这个问题,我想到了一个使用 来实现这一点的方法\llap。但是,有一个问题:如果段落以定理环境开头,那么段落开头就会出现不必要的换行符。

以下是我所拥有的:

\documentclass{book}
\usepackage{lipsum}
\usepackage{amsthm}

\newtheorem*{theorem}{Theorem}
\newcounter{para}
\newenvironment{para}[1][]{%
  \vskip\baselineskip\noindent%
  \refstepcounter{para}%
  \llap{\makebox[6em][r]{[\thepara]\hspace{.75cm}}}%
}{}

\begin{document}

The following is correct:

\begin{para}
\lipsum[2]
\end{para}

\vskip\baselineskip
The following is incorrect:

\begin{para}
\begin{theorem}
\lipsum[2]
\end{theorem}
\end{para}

\vskip\baselineskip
The above should look like this:

\begin{para}
\textbf{Theorem.} \itshape \lipsum[2]
\end{para}


\end{document}

示例输出

解决此问题的一种方法是定义一个没有前导空格的定理环境的替代版本,并在这些段落的开头使用它。这并不理想,因为如果您在定理之前添加/删除文本,您必须记住将定理环境更改为正确的环境。有没有更好的方法?

答案1

所有定理、列表和对齐(例如center)环境均源自trivlist环境,并对trivlist“下一个”段落执行一些复杂的事情。

以下示例使用了新支持的钩子para/begin(自 LaTeX2e 2021-06-01 起,请参阅文档texdoc ltpara),但我不知道为什么\mbox{}需要它。

\documentclass{book}
\usepackage{lipsum}
\usepackage{amsthm}

\newtheorem*{theorem}{Theorem}
\newcounter{para}
\newenvironment{para}[1][]{%
  \vskip\baselineskip
  \refstepcounter{para}%
  \AddToHookNext{para/begin}{%
    \llap{\normalfont[\thepara]\hspace{.75cm}}\mbox{}%
    \OmitIndent % more or less equivalent to \noindent
  }%
}{}

\begin{document}

The following is correct:

\begin{para}
  \lipsum[2]
\end{para}

\bigskip
The following is incorrect:

\begin{para}
  \begin{theorem}
    \lipsum[2]
  \end{theorem}
\end{para}

\bigskip
The above should look like this:

\begin{para}
  \textbf{Theorem.} \itshape \lipsum[2]
\end{para}


\end{document}

在此处输入图片描述

答案2

一个简单的解决方案是在定理之前添加相关的负垂直间距:

\documentclass{book}
\usepackage{lipsum}
\usepackage{amsthm}

\newtheorem*{theorem}{Theorem}
\newcounter{para}
\newenvironment{para}[1][]{%
  \vskip\baselineskip\noindent%
  \refstepcounter{para}%
  \llap{\makebox[6em][r]{[\thepara]\hspace{.75cm}}}%
}{}

\begin{document}

The following is correct:

\begin{para}
\lipsum[2]
\end{para}

\vskip\baselineskip
The following is also correct:

\begin{para}\vspace*{-\dimexpr\baselineskip+\topsep}
\begin{theorem}
\lipsum[2]
\end{theorem}

\end{para}

\end{document}

在此处输入图片描述

相关内容