使用 LaTeX hbox 对齐

使用 LaTeX hbox 对齐

有人能解释一下是否有可能在 TeX hbox 中获得居中文本或右对齐文本吗?我正在尝试使用我找到的一些代码这里为了转置 LaTeX 表。

这是我的代码供参考。请注意,我使用的是 booktabs 和 array 包。

\def\Midrule{\midrule[\heavyrulewidth]}
\newcount\rowc

\makeatletter
\def\ttabular{%
~
\hbox\bgroup
\let\\\cr
\def\rulea{\ifnum\rowc=\@ne \hrule height 1.3pt \fi}
\def\ruleb{
\ifnum\rowc=1\hrule height 0pt \else%
\ifnum\rowc=2\hrule height 1.3pt \else%
\ifnum\rowc=6\hrule height \heavyrulewidth
   \else \hrule height \lightrulewidth\fi\fi\fi}
\valign\bgroup
\global\rowc\@ne
\rulea
\hbox to 10cm{\strut~~\hfill##\hfill}%
\ruleb
&&%
\global\advance\rowc\@ne
\hbox to 10cm{\strut~~\hfill##\hfill}%
\ruleb
\cr}
\def\endttabular{%
\crcr\egroup\egroup}

不过,我不喜欢“hbox to 1cm”的效果,因为它会硬编码我表格的列宽。我尝试用“hbox spread 1cm”或仅用“hbox”替换,但在这两种情况下,列中的文本都是左对齐的。有没有办法在没有固定宽度列的情况下获得居中或右对齐的文本?

提前致谢!

编辑:

好的,这是一个最小的工作示例:

\documentclass{article}

\usepackage{booktabs,array}

\def\Midrule{\midrule[\heavyrulewidth]}
\newcount\rowc

\makeatletter
\def\ttabular{%
~
\hbox\bgroup
\let\\\cr
\def\rulea{\ifnum\rowc=\@ne \hrule height 1.3pt \fi}
\def\ruleb{
\ifnum\rowc=1\hrule height 0pt \else%
\ifnum\rowc=2\hrule height 1.3pt \else%
\ifnum\rowc=6\hrule height \heavyrulewidth
   \else \hrule height \lightrulewidth\fi\fi\fi}
\valign\bgroup
\global\rowc\@ne
\rulea
\hbox{\strut~~\hfill##\hfill}%
\ruleb
&&%
\global\advance\rowc\@ne
\hbox{\strut~~\hfill##\hfill}%
\ruleb
\cr}
\def\endttabular{%
\crcr\egroup\egroup}

\begin{document}

\begin{ttabular}
                    &   Item                &   Very very very very very long item  & Short item\\
Price at Original   &   Location (\$)       &   \$3.95                                  & \$9.95\\
Price at New        &   Location (\$)       &   \$3.99                                  & \$10.63 \\
\end{ttabular}

\end{document}

这将产生以下内容:

在此处输入图片描述

我认为这些评论是正确的,这不是我的水平框的问题,而是水平框本身的大小合适,然后在每列中左对齐。但是,我仍然想知道如何生成转置表,并使最终结果的列居中或右对齐。

对于任何感兴趣的人,原因我想这样做,因为我正在使用 R markdown 生成表格。每列的条目由数组的元素给出,并且数组的大小可能会因表格的生成而发生变化。所以我的 R markdown 代码如下所示:

\begin{ttabular}
                    &   Item                &   \Sexpr{paste(items, collapse=" & ")} \\
Price at Original   &   Location (\$)       &   \Sexpr{paste(site1price, collapse=" & ")} \\
Price at New        &   Location (\$)       &   \Sexpr{paste(site2price, collapse=" & ")} \\
\end{ttabular}

在上文中,item、site1price 和 site2price 是 R 数组。

任何帮助都将不胜感激!

答案1

居中、左、右对齐“xxx”:

\documentclass{article}
\begin{document}
\hbox to 5cm{\hfil xxx \hfil}\par
\hbox to 5cm{\hfil xxx}\par
\hbox to 5cm{xxx \hfil}\par
\end{document}

但更好的是:

\documentclass{article}
\begin{document}
\makebox[5cm][c]{x x x}\par
\makebox[5cm][r]{x x x}\par
\makebox[5cm][l]{x x x}\par
\makebox[5cm][s]{x x x}\par
\end{document}

答案2

我接受了上述答案,因为它从技术上回答了有关水平盒内对齐的问题,尽管它并没有真正帮助我完成我想做的事情。

对于任何感兴趣的人,我确实找到了一个相当丑陋的解决方法来解决我的问题。我没有使用 \valign 从数组构建转置表,而是使用了 minipages。当然,这只在我知道我想要的列数并且对这些列的大致宽度有一个相对不错的猜测时才有效。这是我最终得到的代码:

\begin{minipage}{.5\textwidth}
\centering
\hrule height 1.3pt
\strut ~\\
\strut Item\\
\hrule height 1.3pt
\strut \Sexpr{paste(items, collapse="\\\\strut \\\\\\\\ \\\\hrule ")}\strut
\hrule height 1.3pt
\end{minipage}%
\begin{minipage}{.2\textwidth}
\centering
\hrule height 1.3pt
\strut\hfill Price at Original\\
\strut\hfill Location (\$)\\
\hrule height 1.3pt
\strut \hfill \Sexpr{paste(site1price, collapse="\\\\strut \\\\\\\\ \\\\hrule \\\\hfill")}\strut
\hrule height 1.3pt
\end{minipage}%
\begin{minipage}{.2\textwidth}
\centering
\hrule height 1.3pt
\strut\hfill Price at New\\
\strut\hfill Location (\$)\\
\hrule height 1.3pt
\strut \hfill \Sexpr{paste(site2price, collapse="\\\\strut \\\\\\\\ \\\\hrule \\\\hfill")}\strut
\hrule height 1.3pt
\end{minipage}

这会产生类似这样的结果: 在此处输入图片描述

相关内容