自动为每个段落分配一个编号

自动为每个段落分配一个编号

我想在每段文字中添加一个边际数字(不知道正确的术语;德语中是“Randnummer”)。除了手动输入每个数字外,我没有其他解决方案\marginpar。这是不可能的,尤其是当你写较长的文本时。有人知道一个好的解决方案吗?

这张图片展示了我想要实现的目标。(来自:德国基本法论坛在此处输入图片描述

答案1

我不认为覆盖\everypar会给你带来你想要的结果(至少不会通过改变很多其他\par在你不想编号的地方产生 s 的命令来得到)。

一个简单的解决方案,不过需要在每个段落中输入三个额外的字符,即定义一个小命令(例如\p),插入带有计数器的 marginpar。这样,您可以轻松指定要编号的段落。例如:

\documentclass{book}
\usepackage{mparhack}   % get marginpars to always show up on the correct side (need to compile twice)
\usepackage{lipsum}     % for dummy text

% change this to get the formatting you want
\newcommand{\parnum}{\bfseries\arabic{parcount}}

\newcounter{parcount}
\newcommand\p{%
    \stepcounter{parcount}%
    \leavevmode\marginpar[\hfill\parnum]{\parnum}%
}

\begin{document}    
\p \lipsum[1]

\p \lipsum[2]

\section{A section}

\p \lipsum[3-4]

\begin{enumerate}
  \item \p \lipsum[3-4]
  \item \p \lipsum[5]
\end{enumerate}
\end{document}

\everypar或者,您可以通过创建环境来保留本地的定义:

\documentclass{book}
\usepackage{mparhack}   % get marginpars to always show up on the correct side (need to compile twice)
\usepackage{lipsum}     % for dummy text

% change this to get the formatting you want
\newcommand{\parnum}{\bfseries\arabic{parcount}}

\newcounter{parcount}
\newenvironment{parnumbers}{%
   \par%
   \everypar{\stepcounter{parcount}\leavevmode\marginpar[\hfill\parnum]{\parnum}}%
}{}

\begin{document}
\begin{parnumbers}
    \lipsum[1-10]
\end{parnumbers}

\section{A section}

\begin{parnumbers}
  \lipsum[4-5]
\end{parnumbers}
\end{document}

请记住,在parnumbers环境中不应使用任何复杂的格式(如列表等)。

答案2

正如另一个答案中所述,\everypar它用于 LaTeX 核心中的多种用途。它经常在一个词汇范围或另一个词汇范围中重新定义,因此使用它来可能可以工作,但你需要一直与特殊情况作斗争,这意味着它可能不够强大。不过,如果你确实设法让它工作了(我可能有些悲观),我希望看到这一点。

如果我没记错的话,每个段落的钩子非常有用,我认为 LaTeX 3 应该支持它,但显然现在这无济于事。

当我必须做类似的事情时,我只需定义一个简单的宏,在每个段落的开头调用它:

\newcounter{paranum}
% The following isn't quite right,
% as it seems to slightly change the spacing after the first line,
% in some circumstances.
% Good enough for the moment, however.
\newcommand\p{\refstepcounter{paranum}%
  \hskip0pt
  \vadjust{%
    \vbox to 0pt{%
      \vss
      \ifodd\thepage
        \hbox to \textwidth{%
          \hfil
          \hbox to 0pt{\quad\emph{\tiny\theparanum}\hss}}
      \else
        \hbox to \textwidth{%
          \hbox to 0pt{\hss\emph{\tiny\theparanum}\quad}\hfil}
      \fi
      \vskip3pt}}}

正如评论所述,这并不理想,但对我来说,它很管用,而且比我预期的更充分,所以我从未被迫改进它。有一个明确的\p宏来调用并不像让它自动发生那么好,但这意味着我永远不会得到一个段落被无端编号的情况。

\refstepcounter意味着段落是可标记的。

测试\ifodd很可能在页面顶部附近失败。TeX 常见问题解答解释问题并指出可能的解决方案。

已编辑添加偶数/奇数区别。

答案3

我认为黑客攻击\everypar并不是一个好主意,因为它可能会破坏各种其他东西。在我看来,你需要对段落进行明确的标记。这是一个使用该titlesec包的示例。

\documentclass[twoside]{report}
\usepackage{titlesec}
\usepackage{chngcntr}
\usepackage{lipsum} % for dummy text
\titleclass{\numpar}{straight}[\section]
\newcounter{numpar}
\renewcommand{\thenumpar}{\arabic{numpar}}
\counterwithout{numpar}{section} % from the chngcntr package
\titleformat{name=\numpar,page=odd}[rightmargin] {\normalfont
\bfseries\filright}
{\thenumpar}{.5em}{}
\titleformat{name=\numpar,page=even}[leftmargin] {\normalfont
\bfseries\filleft}
{\thenumpar}{.5em}{}
\titlespacing{\numpar}
{1pc}{0ex plus .1ex minus .2ex}{1pc}
\newcommand*{\newpar}{\numpar{}}
\begin{document}
\chapter{}
\section{A section}
\newpar\lipsum[1]
\newpar\lipsum[2]
\newpar\lipsum[3]
\newpar\lipsum[4]
\newpar\lipsum[5]
\end{document}

这样设置是为了将数字放在双面文档的外边缘(这对于书籍来说是正常的)。

答案4

这是将段落置于环境中的另一种答案。

\documentclass{article}
\usepackage{lipsum}
\usepackage[excludeor]{everyhook}
\newcounter{parcount}
\newif\ifnumberedpars
\newenvironment{numberedpars}{%
        \PushPreHook{par}{%
                \ifnumberedpars
                        \stepcounter{parcount}%
                        \numberedparsfalse
                        \marginpar{\arabic{parcount}}%
                        \numberedparstrue
                \fi
        }%
        \numberedparstrue
}{%
        \PopPreHook{par}%
}
\begin{document}
\begin{numberedpars}
\lipsum
\end{numberedpars}
\end{document}

在此处输入图片描述

代码相当简单。在环境开始时,它会推送一个新的钩子\everypar。在环境结束时,它会弹出该钩子。

相关内容