安装新更新后,我在编译文档时收到这些错误
<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}