tcolorbox: błąd z \ setototalheight podczas obliczania wysokości nagłówka przed przekazaniem go do pakietu geometrii

Nov 28 2020

Idąc za tą odpowiedzią , chciałbym wiedzieć, dlaczego poniższy kod się nie kompiluje i podaje ten błąd

! Nieokreślona sekwencja sterująca. \ tcb @ startbox ... x} {\ tcb @ w @ upper} \ tcb @ lua @ color {tcbcolupper} \ kvtcb @ fontup ...

\documentclass{exam}
\usepackage{graphicx}
\usepackage[xparse,breakable,raster,skins]{tcolorbox}
\usepackage{calc}

\newcommand{\exProgram}{3\textsuperscript{rd} Year}
\newcommand{\CourseName}{Engineering}
\newcommand*{\CourseCode}{311}
\newcommand*{\exMidFinal}{Midterm}
\newcommand*{\exSemester}{Fall}

\newcommand\headerBody{%
    \begin{tcolorbox}[
        raster multicolumn = 3
        ]
        \begin{tcbitemize}[
            raster force size=false,
            raster columns=2,
            valign=bottom,
            raster equal skip = 0mm,
            blankest,
            ]
            \tcbitem[add to width = 2cm, halign = left,]
            University\\ Faculty\\
            \exProgram
            \tcbitem[add to width =-2cm, halign = right]  \includegraphics[height=20 mm]{example-image}
        \end{tcbitemize}
    \end{tcolorbox}%
    %
    \vspace{5pt}\hrule\vspace{5pt}%
    %
    \begin{tcolorbox}[left=0pt,right=0pt]
        \exMidFinal\\
        \exSemester
    \end{tcolorbox}
    \begin{tcolorbox}[before upper*=\centering]
        Course Code: \textbf{\CourseCode}
    \end{tcolorbox}
    \begin{tcolorbox}[halign=right]
        1\\
        2
    \end{tcolorbox}%
    %
    \vspace{5pt}\hrule\vspace{5pt}%
    %
    \begin{tcolorbox}[
        before upper*=\centering, equal height group=A,
        interior engine = standard,
        colback = gray,
        raster multicolumn = 3,
        top = 5pt, bottom = 5pt
        ]
        \textbf{\CourseName}
    \end{tcolorbox}%
    %
    \vspace{5pt}\hrule\vspace{5pt}%
    %
    \begin{tcolorbox}[
        before upper*=\centering,
        equal height group=A,
        raster multicolumn = 3,
        ]
        This exam contains
    \end{tcolorbox}%
}

\newcommand\headerContents{%
    \begin{minipage}{\linewidth}%
        \begin{tcbraster}[
            raster columns=3, raster rows=3,
            raster equal height = rows,
            raster every box/.style={minimum for current equal height group = 8 mm},
            valign=center,
            raster equal skip = 0mm,
            top = 0mm, bottom = 0mm,
            blankest,
            nobeforeafter,
            ]
            \headerBody%
            \vspace*{5pt}%
            \hrule%
        \end{tcbraster}%
    \end{minipage}%
}

\newlength{\headerTotalHeight}
\settototalheight\headerTotalHeight{\headerContents}


\pagestyle{headandfoot}
\firstpageheader{}{\headerContents}{}

\usepackage[
a4paper,
includehead,
top = 0mm,
headheight = \headerTotalHeight,
showframe
]{geometry}

\begin{document}
    text
\end{document}

Odpowiedzi

5 egreg Nov 28 2020 at 17:06

Nigdy nie powinieneś mierzyć rzeczy w preambule. Ustawienia czcionek mogą być opóźnione na początku dokumentu.

Wykonaj ustawienie we właściwym miejscu:

\AtBeginDocument{\settototalheight\headerTotalHeight{\headerContents}}

Teraz, jeśli chcesz wiedzieć, dlaczego to działało, ale teraz się nie udaje? Wprowadzono zmianę tcolorbox.stymającą na celu wykorzystanie zarządzania kolorami LuaTeX, jeśli jest dostępna. Wymaga \tcb@lua@colorto odpowiedniego zdefiniowania, a autor pakietu wybrał to na początku dokumentu.

Oznacza to, że znaczenie \tcb@lua@colornie jest jeszcze dostępne w preambule dokumentu, skąd błąd.