![更新时间 2019-01-14](https://linux22.com/image/388867/%E6%9B%B4%E6%96%B0%E6%97%B6%E9%97%B4%202019-01-14.png)
在 tabu 中使用某些数学环境时,我遇到了“错误的数学环境分隔符”问题。最小示例:
\documentclass[a4paper,12pt]{scrreprt}
\usepackage{xcolor}
\usepackage{tabu}
\begin{document}
\begin{table}[h!]
\begin{tabu}{ X }
\[ b \]
\end{tabu}
\end{table}
\end{document}
此错误仅在加载 xcolor 时显示,并且当 \[ 被替换为公式、对齐或收集环境时也会出现,但使用 $$ 时不会出现。上述示例一年前可以正常工作,最近在更新 MikTex 和所有软件包后出现了错误。
答案1
更新时间 2019-01-14
在 tabu 2.9 中已经应用了等效补丁,并已提交给 ctan。
这不是一个完整的解决方案,只是第一次尝试!!!
在代码中的某个地方tabu
检查“当前组类型”(存在哪些 mode 和 \currentgrouptype 的组合?)。
问题是数组向 p 列添加了一个额外的“颜色组”,以避免颜色泄漏。如果使用颜色包,则此颜色组处于活动状态。当 tabu 测试当前组类型时,它现在得到的答案与以前不同,因此采取了错误的代码路径。
解决该问题的一种可能性是在颜色组之前保存当前组类型,并在禁忌代码中使用该值。
注意力我怀疑会有更多地方需要调整。
\documentclass{article}
\usepackage{color,array,longtable}
%Save the currentgrouptype before the color@begingroup:
\makeatletter
\newcount\array@currentgrouptype
\def\@startpbox#1{\bgroup \array@currentgrouptype\currentgrouptype
\color@begingroup
\setlength\hsize{#1}\@arrayparboxrestore
\everypar{%
\vrule \@height \ht\@arstrutbox \@width \z@
\everypar{}}%
}
\makeatother
\usepackage{tabu}
\makeatletter
%Use the new \array@currentgrouptype
\def\tabu@verticalmeasure{\everypar{}%
%\showthe\currentgrouptype %14 in tl18, 5 in tl17
\ifnum \array@currentgrouptype>12 %
\setbox\tabu@box =\hbox\bgroup
\let\tabu@verticalspacing \tabu@verticalsp@lcr
\d@llarbegin % after \hbox ...
\else
\edef\tabu@temp{\ifnum\array@currentgrouptype=5\vtop
\else\ifnum\array@currentgrouptype=12\vcenter
\else\vbox\fi\fi}%
\setbox\tabu@box \hbox\bgroup$\tabu@temp \bgroup
\let\tabu@verticalspacing \tabu@verticalsp@pmb
\fi
}% \tabu@verticalmeasure
\usepackage{etoolbox}
\patchcmd\tabu@startpboxmeasure
{\aftergroup\tabu@endpboxmeasure}
{\aftergroup\tabu@endpboxmeasure
\color@begingroup
}{\typeout{tabu patched}}{\typeout{tabu patch failed!}}
\patchcmd\tabu@LT@startpbox
{\bgroup}{\bgroup\color@begingroup}
{\typeout{tabu patched}}{\typeout{tabu patch failed!}}
\makeatletter
\begin{document}
\begin{tabu}{X}
\[ b \]
\end{tabu}
\begin{longtabu}{X}
\[ b \]
\end{longtabu}
\end{document}