是否可以设置段落编号的绝对位置?

是否可以设置段落编号的绝对位置?

我正在尝试使用以下示例这个问题对我的文档中的段落进行编号(稍作修改以\thesection.从段落编号中删除)。

这个例子:

\documentclass{article}
\usepackage[excludeor]{everyhook}
\usepackage{lipsum}
\newcounter{paragraphs}[section]
\begin{document}
\PushPostHook{par}{%
        \stepcounter{paragraphs}%
        \llap{\theparagraphs\ \kern\parindent}%
}
\section{Foo}
\lipsum
\section{Bar}
\lipsum
\end{document}

示例截图:

(添加颜色、形状和线条来说明垂直对齐)

Example screenshot



但是我遇到了两个我不知道如何解决的问题(一个与这篇文章的问题略微无关,但我认为更容易解决):

  1. 第一段之后的每个段落的编号都遵循这些段落的缩进。我希望所有段落的编号都与第一段的编号垂直对齐。是否可以设置这些数字的位置,使它们都像这样垂直对齐?如果可以,该怎么做?

  2. (不相关的问题):段落编号似乎包括章节标题作为第一段,因此第一段标记为2。我希望第一段以标签开头1。我尝试使用\setcounter{secnumdepth}{4}其他一些问题中所述的方法,例如这个。我也尝试过更改该值并将其放在序言中的不同位置,但没有成功。我不完全理解这个命令的工作原理,所以我可能只是用错了。



我考虑过的一些解决方案:

  1. 使用enumitem并设置itemindent为负值,但我确实不想将文档中的每个段落定义为列表项。

  2. 使用类似的方法marginpar将段落编号放在页边距中,但我准备multicols在我的文档中使用 - 显然不能一起使用marginparmulticols

  3. 学习如何TikZ工作并在页边空白处绘制段落编号。但我也读过类似这样的问题这个在环境中将文本放在边缘上充其量multicols也是有问题的。

答案1

实际上,我会在每个编号段落之前使用命令\para或类似的东西而不是这样做,但如果你想在“普通”段落中插入数字,这是可能的,但我只会在本地执行此操作以避免在章节标题和其他地方出现内部段落的问题。

这里环境内的段落paras被编号。

enter image description here

\documentclass{article}

\usepackage{lipsum}
\newcounter{paragraphs}[section]

\newcommand\doparas{%
\setbox8\lastbox% indentation box
\makebox[0pt][r]{\refstepcounter{paragraphs}%
\theparagraphs\qquad}%
\usebox{8}%re-insert indent
}

\newtoks\paraseverypar


\let\parassavedeverypar\everypar
\newenvironment{paras}{%
\paraseverypar\expandafter{\the\everypar}%%
\let\everypar\paraseverypar
\parassavedeverypar{\the\everypar\doparas}}{%
\ignorespacesafterend}

\begin{document}

\section{Foo}
\begin{paras}
\lipsum  
\end{paras}
\section{Bar}
\begin{paras}
\lipsum  
\end{paras}

\end{document}

答案2

我不认为\everypar标记列表在这里是完全正确的,因为 LaTeX(和其他格式)在很多地方使用段落来格式化一些文本(即使从 huma 的角度来看这不是一个“段落”)。这就是为什么您的代码在标题行显示一个数字,因为它被处理为一个段落。同样,假设 TOC 行的每一行都会在您的代码中获得一个数字。因此,您至少需要集成一些标志来打开和关闭。

至于位置,从代码开始的最简单方法是将数字放在缩进框之前,如下所示:

\PushPostHook{par}{%
        \stepcounter{paragraphs}%
        {\setbox0\lastbox                          % remove indentation if any
         \llap{\theparagraphs\ \kern\parindent}%   % place your number (spacing adlib)
         \box0                                     % reinsert indentation box
        }%                                         % group only to keep box0 local
}

无法在这里测试,但上面的模数拼写错误应该有效。为了避免在错误的地方出现数字,您可以定义一个 switch\newif ... 或 ifthen 包并将其集成,以便只有当 switch 为“真”时才会执行代码。当然,将其设置为打开和关闭是必须在文档中发生的事情。

相关内容