水平居中 clrscode3e 代码框

水平居中 clrscode3e 代码框

怎样才能使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

选择showframegeometry可以直观地看到文本块的边界。


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,因此至少需要两次编译才能获得标签/引用的正确定位。

相关内容