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