定义了如下命令用于在允许换页的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}
\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}
非常感谢大佬的回答!还想请问大佬,用equation环境写公式以及插入图片后,公式和图片的对齐会出现问题,有什么方法可以解决吗?
@u75521 建议新开一个问题,不要泛泛而谈,让别人猜测究竟是什么样的对齐问题(或者应该补上新的mwe)。
@u75521 技术限制,不能用 equation。图片用
\minipage{\linewidth}
包裹。@u10307 这个实现方式本就有很多没法解决的问题。
@u10307 好的,感谢大佬指教!