Overleaf 和 VSCode 的结果不同吗?

Overleaf 和 VSCode 的结果不同吗?

我的问题主要是想解决为什么我在 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 结果

Overleaf 结果

VSCode 结果

VS 代码结果

答案1

这是标签更新的问题。您的代码需要了解页面,因此仅运行一次无法正常工作。因此,如果您查看日志信息,您会发现它告诉您

LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right.

所以你需要第二次编译,然后 VS Code 和 Overleaf 的结果是一样的。Overleaf 巧妙地通过使用 做到了这一点latexmk,如果你不想仔细选择运行 LaTeX、BibTeX 或 Biber 的次数,这也是你在 VS Code 中执行此操作的一种方便方式。使用latexmkVS Code 中的 LaTeX-Workshop 扩展也非常方便。(记得添加选项-pdf)。

相关内容