我有一张表格,我想将部分内容置于单元格的中心,其余内容则根据此进行调整。最小(非)工作示例:
\documentclass{standalone}
\begin{document}
\begin{tabular}{c}
Reference \\
CenterThisPartButNotThisPart
\end{tabular}
\end{document}
在这个特定的例子中,我想要实现的是让“CenterThisPart”居中,就像它是唯一的内容一样,而让其余文本(“ButNotThisPart”)继续向右。
为了提供一些背景信息,我想尝试这样做:我将数字放在一个表中,其中一些数字带有星号以表示显著的 p 值。我希望所有数字都排成一行,无论它们是否带有星号。
答案1
编辑:@Wipet 的答案结构更好,并且可以在更复杂的情况中发挥作用。此解决方案不考虑相邻单元格的内容。
那么,如果只制作一个不占用水平空间的星号怎么样?
代码:
\documentclass{article}
\newcommand{\rhangstar}{\makebox[0pt][r]{*}}
\newcommand{\lhangstar}{\makebox[0pt][l]{*}}
\begin{document}
\begin{tabular}{c}
1234567890\lhangstar \\
12347890\lhangstar \\
0654321 \\
321645789\lhangstar \\
\rhangstar321645789
\end{tabular}
\end{document}
输出:
这可以很容易地实现为宏来处理(我猜)任何类型的文本。
代码:
\documentclass{article}
\newcommand{\rhang}[1]{\makebox[0pt][r]{#1}}
\newcommand{\lhang}[1]{\makebox[0pt][l]{#1}}
\begin{document}
\begin{tabular}{c}
CenterThisPart\lhang{ButNotThisPart} \\
CenterThis\lhang{ButNotThis} \\
0654321 \\
321645789CenterThisPart\lhang{ButNotThisPart} \\
\rhang{ThisPart}321645789
\end{tabular}
\end{document}
答案2
从一般角度来看,这是一个非常有趣的问题(即使您的应用程序中可能不需要这样的通用解决方案)。
我们需要的是:表格中的居中列,有时在项目的右侧有一个智能\rlap
(在我的示例中)。当项目居中时(即忽略其宽度),这表现正常,但在创建表格的下一列时,不能忽略其宽度。\rl
\rl
\rlap
我们不能将最大的\rl
数据视为相关数据(这是在此处的另一个答案中完成的),因为这个最大的数据\rl
可能用于非常小的中心项目上下文中。有两种情况:
| CCxxxxxx| | CCxxx |
|CCCCCCxx | ... first line wins |CCCCCCxx| ... second line wins
问题是,在排版表格项时,我们不知道哪一行获胜。只有在创建表格的最后一行后才知道这一点。因此,我们需要在表格的最后一行进行一些框计算。\fin
在我的示例中,这是通过宏完成的。
\newbox\boxA \newbox\boxB \newbox\boxC
\def\addbox#1#2{\global\setbox#1=\vbox{\unvbox#1\lastbox\box#2}}
\def\fin{\splittopskip=10pt plus 2pt \setbox0=\vsplit\boxA to0pt \setbox0=\vsplit\boxB to0pt
\setbox\boxC=\vbox{}\dimen0=\wd\boxA
\loop
\setbox0=\vsplit\boxA to\baselineskip
\dimen1=\dimen0 \advance\dimen1 by-\wd0 \divide\dimen1 by2
\setbox\boxC=\vbox{\unvbox\boxC\hbox{\kern\dimen1\box0 \vsplit\boxB to\baselineskip}}%
\unless\ifvoid\boxA \repeat
\advance\dimen0 by-\wd\boxC
\kern-\dimen0
}
\def\rl#1{\rlap{#1}\global\setbox\boxC=\hbox{#1}}
\setbox\boxA=\vbox{\penalty-10000} \setbox\boxB=\vbox{\penalty-10000}
\setbox\boxC=\hbox{}
\halign{#\unskip
&\hfil\global\setbox\boxC=\hbox{}\setbox0=\hbox{#\unskip}\copy0\addbox\boxA0\hfil
&\addbox\boxB\boxC#\unskip\hfil&#\unskip\cr
%
L & Reference && R \cr
L & CenterThisPart\rl{*ButNot} && R \cr
L & CenterThis\rl{*ButNotThisPartPartPart} && R \cr
L & CenterThisP\rl{*ButNotThisPart} && R \cr
L & CenterThisPa\rl{*ButNotThisPart} &\fin& R \cr
}
\bye
L
和列R
在这里只是为了确保我们的列的总尺寸计算正确。您可以使用此示例进行实验(pdftex test
当然,使用命令)。例如,您可以更改此示例中居中或 r 搭接部分的字符串长度。
工作原理:创建表格后,其\rl
行为类似于\rlap
,但居中部分复制到\boxA
,而右搭接部分复制到\boxB
。在最后一行和下面的空列中,我们使用\fin
宏开始框计算。\boxA
和\boxB
重新框定,以模拟居中列的情况,但具有\rl
零件的实际尺寸。结果保存到\boxC
。最后,我们执行\kern d
,其中是和的d
宽度之差。\boxA
\boxC
编辑请注意,接受的解决方案(分配了 250 分)不能解决原始任务。这里使用的是简单的\llap
和,而不是智能的,。当您尝试时,您会看到不良影响:\rlap
\llap
\rlap
\documentclass{article}
\newcommand{\rhang}[1]{\makebox[0pt][r]{#1}}
\newcommand{\lhang}[1]{\makebox[0pt][l]{#1}}
\begin{document}
\begin{tabular}{c|c|c}
L&CenterThisPart\lhang{ButNotThisPart} & R \\
L&CenterThis\lhang{ButNotThis} & R \\
L&0654321 & R \\
L&321645789CenterThisPart\lhang{ButNotThisPart} & R \\
L&\rhang{thisthisThisPart}321645789 & R
\end{tabular}
\end{document}
答案3
也许是这样的?
\documentclass{standalone}
\begin{document}
\newlength\mylength
\settowidth\mylength{ButNotThisPart}% longest "ButNotThisPart"
\begin{tabular}{c@{}p{\mylength}}
Reference & \\
CenterThisPart\makebox[0pt][l]{ButNotThisPart}\\
CenterThisPart\makebox[0pt][l]{ButNot}\\
Center\makebox[0pt][l]{ButNotThisPart}\\
Center\makebox[0pt][l]{ButNot}\\
\end{tabular}
\end{document}
请注意&
后面的参考。