更新时间 2019-01-14

更新时间 2019-01-14

在 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}

相关内容