为什么 \everypar 不起作用?

为什么 \everypar 不起作用?

我尝试在每个段落后添加一个 \P(¶ 符号)。因此,我选择了

\everypar={\P}

命令。首先,我发现 LaTeX 在之后重新定义了它

\begin{document}

因此,我将代码放在了文档环境中。

但是,我没有得到想要的效果。请找到最少的代码:

\documentclass{article}
\begin{document}
  \everypar={\P}
  \section{Intro} some text \par next paragraph \par\noindent even more
  \section{Outro} the end of my document
\end{document}

我的输出在部分编号之前显示 \P,这让我完全困惑。

我使用 MikTeX 2.9.4813 (x64) 和 TeXnicCenter 来构建我的文档。

答案1

LaTeX\everypar在各处使用它自身,管理节标题后的缩进(或不缩进),保存缩进列表结构的段落形状,它还在小页面、parbox 和表格p列中重置,因此设置\everypar很棘手。

除了该值可以随时被覆盖之外,部分标题(如大多数文本)内部是一个段落,因此正如\everypar您所观察到的触发。

您可以(小心)这样做,以避免您的定义在第一个标题后丢失,但它需要进行本地测试插入,以避免添加\P前节标题

\documentclass{article}
\begin{document}
  \let\oldep\everypar  \newtoks\everypar  \oldep{\the\everypar\P}

  \section{Intro} some text \par next paragraph \par\noindent even more
  \section{Outro} the end of my document
\end{document}

在此处输入图片描述

因此,这里有一个版本,其中定义了标题代码以删除标记:

在此处输入图片描述

\documentclass{article}
\begin{document}
  \let\oldep\everypar  \newtoks\everypar  \oldep{\the\everypar\hbox{\P}}

\makeatletter
\def\@sect#1#2#3#4#5#6[#7]#8{%
  \ifnum #2>\c@secnumdepth
    \let\@svsec\@empty
  \else
    \refstepcounter{#1}%
    \protected@edef\@svsec{\@seccntformat{#1}\relax}%
  \fi
  \@tempskipa #5\relax
  \ifdim \@tempskipa>\z@
    \begingroup
      #6{%
        \@hangfrom{\hskip #3\relax\@svsec}%
          \interlinepenalty \@M 
% remove indentation box, remove \P box put indentation box back
\leavevmode \setbox\z@\lastbox\setbox\tw@\lastbox\box\z@
#8\@@par}%
    \endgroup
    \csname #1mark\endcsname{#7}%
    \addcontentsline{toc}{#1}{%
      \ifnum #2>\c@secnumdepth \else
        \protect\numberline{\csname the#1\endcsname}%
      \fi
      #7}%
  \else
    \def\@svsechd{%
      #6{\hskip #3\relax
      \@svsec #8}%
      \csname #1mark\endcsname{#7}%
      \addcontentsline{toc}{#1}{%
        \ifnum #2>\c@secnumdepth \else
          \protect\numberline{\csname the#1\endcsname}%
        \fi
        #7}}%
  \fi
  \@xsect{#5}}

\makeatother

  \section{Intro} some text \par next paragraph \par\noindent even more
  \section{Outro} the end of my document
\end{document}

答案2

除了其他答案和评论中提到的内容外,\everypar还使用在每个段落的开头(或者更准确地说,当 TeX 从垂直模式变为水平模式时),因此它对于您尝试实现的目的是无用的。

为此,最好重新定义\par,如下所示:

\documentclass{article}

\begin{document}
\let\oldpar=\par
\def\par{\P\oldpar}
  \section{Intro} some text \par next paragraph \par\noindent even more
  \section{Outro} the end of my document
\end{document}

但即使这样也会产生不想要的结果,因为节标题在内部也\par以意想不到的方式使用。查看结果:

糟糕的结果

相关内容