自定义的行号生成命令在遇到行间公式时出现问题

发布于 2025-10-12 22:34:38

定义了如下命令用于在允许换页的tcolorbox中正确生成行号,在无行间公式的情况下可以正确生成,但是有行间公式时,行号只在公式后的文本处生成,公式前的文本则不生成,如何解决?

\documentclass{article}
\usepackage{ctex,lipsum}
\usepackage[most]{tcolorbox}
\usepackage{geometry}
\geometry{a4paper,left=2.5cm,right=2.5cm,top=2.5cm,bottom=2.5cm}

\makeatletter
\newsavebox\linebox%
%%
\newcommand{\@Line@Number}{%
    \def\@line@no{0}%
    \setbox\linebox\lastbox%
    \ifvoid\linebox%如果行文字盒子为空则什么都不执行
    \relax%
    \else%
    \unskip%
    \unpenalty%
    \unskip%
    \unskip%
    {\@Line@Number}%
    \xdef\@line@no{\number\numexpr\@line@no+1\relax}%
    \ifnum\numexpr(\@line@no/5)*5=\@line@no\relax%判断行号能否被5整除
    \noindent\llap{\mbox{\@line@no\hskip7.5mm\relax}}%
    \else%
    \ifnum\@line@no=1%判断行号是否等于1
    \noindent\llap{\mbox{\@line@no\hskip7.5mm\relax}}%
    \fi\fi%
    \box\linebox\par%
    \fi}
\makeatother

\begin{document}
    \makeatletter
    \noindent 不含行间公式
    \begin{tcolorbox}[breakable]    
        \lipsum
        \par\@Line@Number
    \end{tcolorbox}
    
    \clearpage
    \noindent 含行间公式
    \begin{tcolorbox}[breakable]    
    \lipsum[1]
    $$
    \int_\Omega x^2{\rm d}V=\frac{1}{5}
    $$
    \lipsum[2-8]
    \par\@Line@Number
    \end{tcolorbox}
    \makeatother

\end{document}

image.png

image.png

image.png

image.png

查看更多

关注者
1
被浏览
94
雾月
雾月 9小时前
这家伙很懒,什么也没写!
\documentclass{article}
\usepackage{ctex,lipsum}
\usepackage[most]{tcolorbox}
\usepackage{geometry}
\geometry{a4paper,left=2.5cm,right=2.5cm,top=2.5cm,bottom=2.5cm}

\makeatletter
\ExplSyntaxOn
\cs_new_protected:Npn \@Line@check@last
  {
    \int_case:nnTF { \tex_lastnodetype:D }
      {
        { 11 } { \tl_put_left:Ne \@Line@save { \vskip\the\lastskip\relax } \unskip }
        { 12 } { \tl_put_left:Ne \@Line@save { \kern\the\lastkern\relax } \unkern }
        { 13 } { \tl_put_left:Ne \@Line@save { \penalty\the\lastpenalty\relax } \unpenalty }
      }
      { \@Line@check@last }
      { \tl_set:Ne \@Line@last@type { \int_value:w \tex_lastnodetype:D } }
  }
\cs_new:Npn \@Line@is@print@number
  {
    \int_case:nnTF { \@Line@last@type }
      {
        { -1 } {}
        { 0 } {}
        { 1 } {}
        { 9 } {}
      }
      { 1~ } { 0~ }
  }
\ExplSyntaxOff

\newsavebox\linebox
\newcommand{\@Line@Number}{%
    \def\@line@no{0}
    \def\@Line@save{\nointerlineskip}%
    \def\@Line@last@type{-1}%
    \setbox\linebox\lastbox%
    \ifvoid\linebox%如果行文字盒子为空则什么都不执行
      \relax%
    \else%
      \@Line@check@last
      {\@Line@Number}%
      \@Line@save
      \ifcase\@Line@is@print@number\else
        \xdef\@line@no{\number\numexpr\@line@no+1\relax}%
        \ifnum\numexpr(\@line@no/5)*5=\@line@no\relax%判断行号能否被5整除
          \noindent\llap{\mbox{\@line@no\hskip7.5mm\relax}}%
        \else%
          \ifnum\@line@no=1%判断行号是否等于1
            \noindent\llap{\mbox{\@line@no\hskip7.5mm\relax}}%
      \fi\fi\fi
      \box\linebox\par
    \fi}
\makeatother

\begin{document}

    \makeatletter
    \noindent 不含行间公式
    \begin{tcolorbox}[breakable]
        \lipsum
        \par\@Line@Number
    \end{tcolorbox}
    
    \clearpage
    \noindent 含行间公式
    \begin{tcolorbox}[breakable]    
    \lipsum[1]
    \begin{align}% 不能用 equation 和 $$
    \int_\Omega x^2{\rm d}V=\frac{1}{5}
    \end{align}
    \lipsum[2-8]
    \par\@Line@Number
    \end{tcolorbox}
    \makeatother

\end{document}
1 个回答

撰写答案

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

发布
问题

分享
好友

手机
浏览

扫码手机浏览