我的问题主要是想解决为什么我在 VSCode 和 Overleaf 中得到不同的结果。当我将此代码粘贴到 Overleaf vs VSCode/LaTeX Workshop 中时,我得到了不同的结果。代码来自先前的答案关于根据页面内容级别更新标题。
在 Overleaf 中,结果的第 3-4 页都有一个“第 3 级”标题,这是理所当然的,因为第 3 级段落从第 3 页延伸到第 4 页。
在 VSCode 中,第 4 页的页眉不会继承跨页段落中的“第 3 级”,而是使用第 4 页的最高级别“第 2 级”页眉。
背页:This is pdfTeX, Version 3.141592653-2.6-1.40.23 (TeX Live 2021)
VSCode:This is pdfTeX, Version 3.141592653-2.6-1.40.23 (TeX Live 2022/dev)
平均能量损失
\documentclass{article}
\usepackage{afterpage}
\usepackage{lipsum}
\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyhf{}
\newcounter{pagelevel}
\newcounter{currentlevel}
\usepackage{atbegshi}
\usepackage{zref-user}
\usepackage{zref-abspage}
\newcounter{clscnt}
\makeatletter
% When we ship out the page, check if the paragraph spans the break.
\AtBeginShipout{%
\ifnum\zref@extract{markingenv-begin-\theclscnt}{abspage}
=\zref@extract{markingenv-end-\theclscnt}{abspage}
\setcounter{pagelevel}{0}%
\else
\setcounter{pagelevel}{\thecurrentlevel}%
\fi
}
\makeatother
\newcommand{\marking}[2]{%
\stepcounter{clscnt}%
\zlabel{markingenv-begin-\theclscnt}%
(#1 --- \thepagelevel)
\ifnum #1 > \thepagelevel%
\setcounter{pagelevel}{#1}%
\chead{Level \thepagelevel}%
\fi%
\setcounter{currentlevel}{#1}
#2
\zlabel{markingenv-end-\theclscnt}%
}
\newcommand{\VI}[1]{\marking{3}{(V) #1}}
\newcommand{\IMP}[1]{\marking{2}{(I) #1}}
\newcommand{\TRI}[1]{\marking{1}{(U) #1}}
\begin{document}
\TRI{\lipsum[1]\par}
\TRI{\lipsum[2]\par}
\TRI{\lipsum[3]\par}
\IMP{\lipsum[4]\par}
\TRI{\lipsum[5]\par}
\TRI{\lipsum[6]\par}
\TRI{\lipsum[7]\par}
\TRI{\lipsum[8]\par}
\IMP{\lipsum[9]\par}
\TRI{\lipsum[10]\par}
\TRI{\lipsum[11]\par}
\TRI{\lipsum[12]\par}
\TRI{\lipsum[13]\par}
\TRI{\lipsum[14]\par}
\TRI{\lipsum[15]\par}
\VI{\lipsum[16]\par}
\IMP{\lipsum[17]\par}
\TRI{\lipsum[18]\par}
\TRI{\lipsum[19]\par}
\TRI{\lipsum[20]\par}
\TRI{\lipsum[21]\par}
\TRI{\lipsum[22]\par}
\TRI{\lipsum[23]\par}
\TRI{\lipsum[24]\par}
\TRI{\lipsum[25]\par}
\TRI{\lipsum[26]\par}
\TRI{\lipsum[27]\par}
\TRI{\lipsum[28]\par}
\TRI{\lipsum[29]\par}
\end{document}
Overleaf 结果
VSCode 结果
答案1
这是标签更新的问题。您的代码需要了解页面,因此仅运行一次无法正常工作。因此,如果您查看日志信息,您会发现它告诉您
LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.
所以你需要第二次编译,然后 VS Code 和 Overleaf 的结果是一样的。Overleaf 巧妙地通过使用 做到了这一点latexmk
,如果你不想仔细选择运行 LaTeX、BibTeX 或 Biber 的次数,这也是你在 VS Code 中执行此操作的一种方便方式。使用latexmk
VS Code 中的 LaTeX-Workshop 扩展也非常方便。(记得添加选项-pdf
)。