怎样才能使codebox
(来自clrscode3e
包的)内容在文档中水平居中?
答案1
由于codebox
最终在环境中排版tabbing
,因此其宽度可能会有所不同。此外,它是在框中排版的,该框仅在环境末尾进行处理codebox
。因此,您需要稍微做一些工作才能使其水平居中。
这varwidth
包裹能够将其宽度缩小到其内容的自然宽度。因此,将codebox
环境包裹在varwidth
环境中可以实现居中功能:
\documentclass{article}
\usepackage[showframe]{geometry}% http://ctan.org/pkg/geometry
\usepackage{clrscode3e}% http://www.cs.dartmouth.edu/~thc/clrscode/
\usepackage{varwidth}% http://ctan.org/pkg/varwidth
\begin{document}
\begin{center}
\begin{varwidth}{\linewidth}
\begin{codebox}
\Procname{$\proc{Insertion-Sort}(A)$}
\li \For $j \gets 2$ \To $\attrib{A}{length}$
\li \Do $\id{key} \gets A[j]$
\li \Comment Insert $A[j]$ into the sorted sequence $A[1 \twodots j-1]$.
\li $i \gets j-1$
\li \While $i > 0$ and $A[i] > \id{key}$
\li \Do
$A[i+1] \gets A[i]$
\li $i \gets i-1$
\End
\li $A[i+1] \gets \id{key}$
\End
\end{codebox}
\end{varwidth}
\end{center}
\end{document}
环境varwidth
设置为最大值( ),因为如果不够宽,\linewidth
它将缩小到所需宽度。codebox
选择showframe
geometry
可以直观地看到文本块的边界。
savepos
我原来的方法是使用zref
包裹通过宏 标记代码中最左边和最右边的点\zsavepos{<label>}
。然后,使用\zposx{<ref>}
,可以提取标签的 x 坐标(以小点为sp
单位)。因此,使用 标记最左边的点\zsavepos{codeL}
,使用 标记最右边的点\zsavepos{codeR}
,
\dimexpr\zposx{codeR}sp-\zposx{codeL}sp\relax
给出 的水平宽度(或尺寸)codebox
。随后,将整个codebox
环境放在minipage
此宽度的 中,使我们能够限制水平跨度并使对象居中。正确的宽度还可以避免出现过满\hbox
警告(如果选择的minipage
宽度太小)或不正确的居中(如果选择的minipage
宽度太大)。
\documentclass{article}
\usepackage[showframe]{geometry}% http://ctan.org/pkg/geometry
\usepackage{clrscode3e}% http://www.cs.dartmouth.edu/~thc/clrscode/
\usepackage[savepos]{zref}% http://ctan.org/pkg/zref
\begin{document}
\begin{center}
\begin{minipage}{\dimexpr\zposx{codeR}sp-\zposx{codeL}sp\relax}
\begin{codebox}
\Procname{\zsavepos{codeL}$\proc{Insertion-Sort}(A)$}
\li \For $j \gets 2$ \To $\attrib{A}{length}$
\li \Do $\id{key} \gets A[j]$
\li \Comment Insert $A[j]$ into the sorted sequence $A[1 \twodots j-1]$.\zsavepos{codeR}
\li $i \gets j-1$
\li \While $i > 0$ and $A[i] > \id{key}$
\li \Do
$A[i+1] \gets A[i]$
\li $i \gets i-1$
\End
\li $A[i+1] \gets \id{key}$
\End
\end{codebox}
\end{minipage}
\end{center}
\end{document}
上述代码(或程序)直接取自clrscode3e
包裹 文档。最右边的标签取决于正在排版的代码段,而最左边的标签则排版在过程名称的左侧。但是,对于最终生产和居中功能而言,这并不是必需的。由于这使用了包zref
,因此至少需要两次编译才能获得标签/引用的正确定位。