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