此代码
\documentclass{article}
\usepackage{bytefield}
\begin{document}
\begin{bytefield}[leftcurly=.,leftcurlyspace=0pt]{32}
\begin{leftwordgroup}{0}
\wordbox{1}{\the\height}
\end{leftwordgroup} \\
\begin{leftwordgroup}{\raisebox{\totalheight}4}
\wordbox{2}{\the\height}
\end{leftwordgroup} \\
\begin{leftwordgroup}{\raisebox{6ex}{12}}
\wordbox{2}{\the\height}
\end{leftwordgroup}
\end{bytefield}
\end{document}
结果是
我想让 0 和 4 个左字组与它们对应的字框的顶部垂直对齐。但是,我发现实现此目的的唯一方法是使用 \raisebox{6ex} 反复试验。 \height 和 \totalheight 似乎是指组中文本的高度。leftwordgroup 不会像 wordbox 和 bitbox 那样使 \height 可用。
有没有更精确的方法来指定左词组的垂直对齐方式?
更新
感谢您花时间帮助我解决这个问题。
当将其应用于更复杂的字节场用法时,它就有点偏离了。
\documentclass{standalone}
\usepackage{bytefield}
\usepackage{stackengine}
\newcommand\topwg[2]{%
\makebox[3ex][l]{\makebox[2ex][r]{\tiny{#1}}}\belowbaseline[-.3\ht\strutbox]{#2}
}
\begin{document}
\begin{bytefield}[leftcurly=.,leftcurlyspace=0pt]{32}
\bitheader{0,8,16,24} \\
\topwg{0}{\begin{leftwordgroup}{}
\begin{rightwordgroup}{Standard Header}
\wordbox{1}{\the\height}
\end{rightwordgroup}
\end{leftwordgroup}} \\
\topwg{4}{\begin{leftwordgroup}{}
\wordbox{2}{\the\height}
\end{leftwordgroup}} \\
\topwg{12}{\begin{leftwordgroup}{}
\wordbox{2}{\the\height}
\end{leftwordgroup}}
\end{bytefield}
\end{document}
再次非常感谢您的帮助。
答案1
这里,我引入了\topwg
一个接受两个参数的宏。第一个是本来会作为 的第一个参数的标签leftwordgroup
,第二个是leftwordgroup
第一个参数为空的环境。
这样做的目的是垂直移动单词组,这样,它的基线就不会与中心文本对齐,而是将框的顶部放在 的wordgroup
高度\strutbox
。
已编辑以解决 OP 指出的一些缺陷。我相信盒子之间的间隙是由位于分数基线高度的盒子引入的一些胶水造成的。因此,我恢复了\ht\strutbox
的偏移\belowbaseline
并调整了左标签相对于 的偏移\raisebox
。这也纠正了右侧标签的垂直位置问题。此外,我\vspace
在 的末尾添加了一个小的负片\topwg
,以避免盒子之间的双倍厚度规则。
\documentclass{article}
\usepackage{bytefield}
\usepackage{stackengine}
\newcommand\topwg[2]{%
\raisebox{.7\ht\strutbox}{\makebox[3ex][l]{\makebox[2ex][r]{%
\tiny{#1}}}}\belowbaseline[-\ht\strutbox]{#2}\vspace{-.65pt}%
}
%\renewcommand\topwg[2]{#2}
\begin{document}
\begin{bytefield}[leftcurly=.,leftcurlyspace=0pt]{32}
\bitheader{0,8,16,24} \\
\topwg{0}{\begin{leftwordgroup}{}
\begin{rightwordgroup}{Standard Header}
\wordbox{1}{\the\height}
\end{rightwordgroup}
\end{leftwordgroup}} \\
\topwg{4}{\begin{leftwordgroup}{}
\wordbox{2}{\the\height}
\end{leftwordgroup}} \\
\topwg{12}{\begin{leftwordgroup}{}
\wordbox{2}{\the\height}
\end{leftwordgroup}}
\end{bytefield}
\end{document}
如果您计划在框左侧的标签中使用超过两位数字,则可以扩展\makebox
中定义的两个 es的\topwg
宽度。第一个数字(3ex)确定左侧标签的宽度,而第二个数字(2ex)指定这些标签的左侧填充。
\raisebox
要更改左标签的高度,请更改开头的数量\topwg
。
我还将改为\documentclass
而article
不是,standalone
以防止底部规则被剪裁(我不确定为什么)。