calc 包和 tabularx 中的全局长度问题

calc 包和 tabularx 中的全局长度问题

calc无论是否包含包,以下代码的输出都会受到影响:

\documentclass{article}

\usepackage{tabularx}
% \usepackage{calc}
\newsavebox{\testbox}
\newlength{\testlen}

\newcommand{\boxx}[1]{%
 \savebox{\testbox}{#1}%
 \ifdim\wd\testbox>\testlen \global\setlength{\testlen}{\wd\testbox}\fi
 \parbox{\testlen}{#1}}%

\begin{document}
\begin{tabularx}{10cm}{|c|X|c|}
col 1 & col 2 & col 3 \\
\boxx{\mbox{}\hfill aaaaaaa\hfill\mbox{}} & xxxxxxxxxxxxx \par testlen value: \the\testlen & \boxx{bbbbbbbbbb} \\
\boxx{\mbox{}\hfill 50\hfill\mbox{}} & yyyyyyyyyyyy & \boxx{A\hfill1} \\
 90 & zzzzzzzzz & B\hfill2
\end{tabularx}
\end{document}

我利用三遍来tabularx确定哪个单元格的文本最宽,以此值设置全局长度。在第二次传递时,所有单元格都将使用parbox此长度。

如果没有calc,一切都会按预期进行。如果使用calc长度,则不会进行全局化,也不会对parbox在其他单元格上打开 es 产生影响。

该怎么办?我需要calc

所有这些的应用是1。我正在解决这个问题。

答案1

我使用了 中的宏calc。但是,我会使用\dimexpr不带包的calc

\documentclass{article}    
\usepackage{tabularx}
 \usepackage{calc}
\newlength\testA
\newlength\testB

\newcommand\boxx[1]{%
    \settowidth{\testA}{#1}%
    \ifdim\testA>\testB \global\testB=\testA\fi
    \parbox{\testB}{#1}}%

\begin{document}
    \begin{tabularx}{10cm}{|c|X|c|}
        col 1 & col 2 & col 3 \\
        \boxx{\mbox{}\hfill aaaaaaa\hfill\mbox{}} & xxxxxxxxxxxxx \par testlen value: \the\testB & \boxx{bbbbbbbbbb} \\
        \boxx{\mbox{}\hfill 50\hfill\mbox{}} & yyyyyyyyyyyy & \boxx{A\hfill1} \\
        90 & zzzzzzzzz & B\hfill2
    \end{tabularx}
\end{document}

答案2

\global\setlength{\testlen}{\wd\testbox}

从未被支持的语法。

如果没有这个calc包,它只是偶然工作,只是\setlength 扩展到,\testlength=\wd\testbox\relax所以构造是\global\testlength=\wd\testbox\relax

使用\calc包,\setlength是一个复杂的宏,它必须解析中缀calc语法,并进行许多中间定义。因此,取决于您的运气如何,最终可能根本没有为赋值添加前缀,因此会出错,或者最终为一些内部临时赋值添加前缀。无论哪种情况,\global它都不会将赋值设置为全局的。\testlength

相关内容