\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}
问 自定义的行号生成命令在遇到行间公式时出现问题