我想在每段文字中添加一个边际数字(不知道正确的术语;德语中是“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
。在环境结束时,它会弹出该钩子。