30 如何判断 section 是否位于某一页的页首,并与其它非页首的 section 进行不同处理?

发布于 2024-11-09 23:59:39

现在有一个需求是在 section 前加一条横线,MWE 如下:

\documentclass{ctexart}
\usepackage{zhlipsum}

\ExplSyntaxOn
\cs_set_eq:NN \section:nn \section

\RenewDocumentCommand{ \section }{ m } 
  {
    \noindent
    \rule{\textwidth}{0.4pt}
    \section:nn {#1}
  }
\ExplSyntaxOff

\begin{document}

\section{测试}
\zhlipsum[1-2]

\section{测试}
\zhlipsum[1]

\end{document}

但是有两个问题是

  1. 这个横线和 section 之间可能会分离,希望跨页的话也要一起
  2. 但是如果 section 在页面最上方,不要这个横线

问题 1 我尝试了 needspace,暂时能解决,不知道有没有更优的方案
问题 2 我的想法如果能判断当前位置前面是否有新页面的内容,之类的,然后加一个 bool 处理就行,但是不太知道如何判断好一些。

查看更多

关注者
0
被浏览
126
雾月
雾月 4天前
这家伙很懒,什么也没写!

问题 1,如果不用 needspace 或类似的方法,会有极少的概率不能正确判断是否已经分页,比如下面的第四个标题就有可能会判断失败。

看看这是不是你想要的:

\documentclass{ctexart}
\usepackage{zhlipsum}
%\usepackage{showframe}

\ExplSyntaxOn\makeatletter
\cs_set_eq:NN \section:nn \section
\cs_new_protected:Npn \__my_needspace_if_newpage:nTF #1
  {
    % 可以试试删掉 \begingroup 和 \endgroup 之间的内容,看看能否正确判断第四个标题
    \par \penalty-100\begingroup
    \setlength{\dimen@}{\dimexpr#1}
    \dimen@ii\pagegoal \advance\dimen@ii-\pagetotal
    \ifdim \dimen@>\dimen@ii
      \ifdim\dimen@ii>\z@ \vfil\fi
      \penalty-\@M
    \fi\endgroup
    % 上面这些是 \Needspace 的代码,可以直接用 \Needspace{\dimexpr#1} 或 \Needspace*{\dimexpr#1} 替代
    \bool_lazy_or:nnTF
      { \dim_compare_p:nNn { \pagegoal } = { \c_max_dim} }
      { \int_compare_p:nNn { \lastpenalty } < { -9999 } } % -\@M = -10000
  }

\RenewDocumentCommand{ \section }{ m } 
  {
    \__my_needspace_if_newpage:nTF { 1.5cm }
      { }
      { \hrule height0.4pt depth0pt }
    \section:nn {#1}
  }
\ExplSyntaxOff\makeatother

\begin{document}

\section{测试}
\zhlipsum[1-2]

\section{测试}
\zhlipsum[1]

\section{测试}
\zhlipsum[3-9][name=zhufu]

\section{测试}
\zhlipsum[1]

\end{document}
1 个回答

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览