回忆录和 tcolorbox A应该在这里

回忆录和 tcolorbox A应该在这里

安装新更新后,我在编译文档时收到这些错误

<box> 应该在这里。

<box> 应该在这里。\setcounter

删除了尽可能多的内容,只剩下这个文档

\documentclass[twocolumn]{memoir}

\usepackage{tcolorbox}

\begin{document}

tekst

\end{document}

这会导致这个错误

<box> 应该在这里。\end{document}

用书或文章替换“回忆录”没有错误,删除两列没有错误

我更新了所有内容并重新安装了 MikTex,但问题仍然存在。

有任何想法吗?

答案1

该问题似乎是 mparhack 和 shipout/background hook 之间不兼容。

在问题解决之前,您可以采取以下解决方法:抑制软件包的加载:

\makeatletter
\disable@package@load{mparhack}{}
\makeatother
\documentclass[twocolumn]{memoir}
\usepackage{tcolorbox}
\begin{document}

blub

\end{document}

问题是 mparhack\hb@xt@在输出中重新定义,并且此命令在 中的其他位置之外的各个地方使用\put,这意味着 shipout/background 钩子中的代码失败。因此,另一个解决方法是:

\documentclass[twocolumn]{article}
\usepackage{mparhack}
\AddToHook{shipout/background}{\put (0,0){}}
\makeatletter
\long\def\put(#1,#2)#3{%
  \@killglue
  \@defaultunitsset\@tempdimc{#2}\unitlength
  \raise\@tempdimc
  \hbox to\z@{% <--- instead of \hb@xt@
    \@defaultunitsset\@tempdimc{#1}\unitlength
    \kern\@tempdimc
    #3\hss}%
  \ignorespaces}
\makeatletter  
\begin{document}

blub

\end{document}

答案2

正如 Ulrike 所说,这里的问题是该软件包mparhack试图修补内核命令\@dbloutputcol并向其中注入一些代码。为了简化操作,它只是重新定义了在那里使用的 \hb@xt@,并在某些条件下(当第一个参数是 时\columnwidth)用自己的代码替换它 --- 如果不是,它会尝试执行原始代码(基本上是\hbox to)。不幸的是,这在内核和软件包使用 的其他地方会非常严重地中断\hb@t@,即,每当使用它并且必须可扩展时,例如在\put代码如下所示的地方

   \raise \hb@xt@ ...  % means \raise\hbox to ...

mparhack行动之后现在看起来像

   \raise \def\mph@tempa{}\hbox to

an\def不是一个盒子,因此出现错误。

期中mparhack.sty需要正确的补丁(或者最终应该消失),短期内,这是我们应该从内核方面应用的急救措施,直到包得到修复。我没有做太多事情,只是确保它\hb@xt@仍然可扩展并正常扩展\hbox to(有更好的方法来解决这个问题):

\makeatletter
\def\mph@outputdblcol{%
    \def\mph@chk@dcl{0}%
    \def\hb@xt@##1##2{%
        \ifx##1\columnwidth
            \mph@step@cnt\mph@chk@dcl
            \protected@edef\mph@tempa{%
                \noexpand\write\noexpand\@auxout{%
                    \noexpand\string\noexpand\mph@setcol{%
                        \romannumeral\mph@chk@dcl:\noexpand\thepage%
                    }{%
                        \noexpand\string\noexpand\mph@nr%
                    }%
                }%
            }%
            \mph@orig@hb@xt@##1{##2\mph@tempa}%
        \else
            \mph@orig@hb@xt@##1{##2}%
        \fi
    }%
    \mph@orig@outputdblcol
    \def\hb@xt@{\mph@orig@hb@xt@}%
    \ifnum\mph@chk@dcl=0\relax
    \else
        \ifnum\mph@chk@dcl=2\relax
        \else
            \mph@error{\string\@outputdblcol}%
        \fi
    \fi
}

\AddToHook{package/after/mparhack}{\let\@outputdblcol\mph@outputdblcol}
\makeatother

%----- above needs to happen before mparhack is loaded or rather fixed there


\documentclass[twocolumn]{memoir}



\usepackage{tcolorbox}

\begin{document}

tekst

\end{document}

最后要说的是,特别是考虑到最新的 TeXLive 更新是否无法提供向后兼容功能?在评论中:

  • 是的,随着更多活动、错误修复和扩展功能,LaTex 的新版本可能会破坏一些东西(任何更改都有这种能力)
  • 但它通常只是显示隐藏在许多旧软件包中的隐藏错误或误用……说真的,你不能改变像底层这样的东西\hb@xt@并改变其语义,然后说这是 LaTeX 的错误,如果我们所做的只是按照内核定义使用它,那么它就会出问题。在这种特殊情况下,作者肯定在过去就看到了这个问题,因为他们试图为 eso-pic 修复它,而 eso-pic 或多或少实现了内核中现在作为标准功能提供的功能。
  • 是的,事情可能会出错,但很少是悄无声息的,但到目前为止,此类问题已经被软件包作者或我们修复了(通常都是更好的),因为通常真正的原因是一个刚刚显露出来的潜在问题

更新 2021-05-04

mparhack得到了必要的补丁,现在它出现在 TL 上。这意味着问题应该已经解决了。作为副作用,mparhack现在也应该可以在较旧的 LaTeX 版本中正常工作,例如在 TL18 中,它破坏了文档

\documentclass{article}
\usepackage{draftwatermark,mparhack} 
\begin{document} X \end{document} 

相关内容