将列内容视为数字,而不是框

将列内容视为数字,而不是框

我正在为数据通信协议制作文档,并尝试制作一个表格列,该表格列显示消息字段的偏移量,为每个字段(表格行)计算,并采用字段宽度。对于偏移量计算,我制作了一个计数器,它保留当前偏移量,并定义新命令:

\newcounter{bytepos}
\newcommand{\fieldwidth}[1]{%
\ifnumcomp{#1}{=}{1}%
{\thebytepos\stepcounter{bytepos}}
{\thebytepos--\the\numexpr\value{bytepos} + #1 - 1\relax\addtocounter{bytepos}{#1}}%
}

我还定义了新的列类型,它应该为列中的每个项目调用我的命令:

\newsavebox{\byteposbox}
\newcolumntype{B}{>{\begin{lrbox}{\byteposbox}}%
l%
<{\end{lrbox}%
\fieldwidth{\usebox{\byteposbox}}%
}}

为了填充表格,我使用下一个示例代码:

\begin{tabular}{Bl}
  2 & Start mark   \\
  8 & Message data \\
  4 & Service info \\
  1 & Checksum     \\
  1 & End mark
 \end{tabular}

它应该像编译一样

\begin{tabular}{ll}
   0-- 1 & Start mark   \\
   2-- 9 & Message data \\
  10--13 & Service info \\
  14     & Checksum     \\
  15     & End mark
\end{tabular}

但我给出的是“缺失数字,视为零”。在网上搜索后,我发现 LaTeX 中的数字很特殊,而且 \usebox 似乎返回的是完整的粘贴框,而不是文本,无法将其转换回原始文本。

我如何才能从每一行获取原始文本?或者我的理解有误,我遗漏了一些简单而重要的东西?

答案1

操作计数寄存器比操作盒子更容易

在此处输入图片描述

\documentclass{article}

\usepackage{array}
\newcount\zzthis
\newcount\zztotal
\newcommand\zzrange{%
\the\zztotal
\global\zztotal=\numexpr\zztotal+\zzthis-1\relax
\ifnum\zzthis>1--\the\zztotal\fi
\global\advance\zztotal1
}
\newcolumntype{B}{>{\let\ignorespaces\empty\afterassignment\zzrange\zzthis=}l}
\begin{document}

\begin{tabular}{Bl}
  2 & Start mark   \\
  8 & Message data \\
  4 & Service info \\
  1 & Checksum     \\
  1 & End mark
 \end{tabular}

\end{document}

相关内容