小数点对齐,但没有小数点的数字居中

小数点对齐,但没有小数点的数字居中

我遇到了以下问题:我正在从 Stata 导出回归输出并将其输入到我的 LaTex 文档中。我的目标是在 latex 中编写页眉和页脚,然后简单地输入原始“表格数据” \input{}。我使用 tabularx 并在小数点处对齐。但我还想打印表格中的观察值数量。这些值大约在 250-1500 之间,可以说是在小数点处对齐,但由于它们没有小数,因此会产生小数点对齐的视觉效果。我宁愿将它们置于列的中心。我知道可以通过在\mulitcolumn{}{}{}它周围放置一个环境来实现这一点,但这需要在每次更新由 Stata 创建的表格时进行手动更改。我正在寻找一个可扩展的解决方案。是否可以以某种方式定义一个足够灵活的列类型,以将小数点 {-1,1} 之间的数字对齐,并将没有小数的数字置于中心。

这是我的表格的一个例子:

\newcolumntype{Y}{D..{1.5}}
\newcolumntype{L}[1]{>{\raggedright}p{#1}}
\begin{table}
\begin{minipage}{\textwidth}
{\footnotesize
\lipsum[5]}
\end{minipage}
\begin{tabularx}{\textwidth}{L{3.8cm} @{\extracolsep{\fill}}*{2}{Y}}
\toprule
\multicolumn{1}{l}{} & \multicolumn{1}{c}{(1)}  & \multicolumn{1}{c}{(2)}  \\
\midrule
\input{tab}
\midrule
Firm FE & \multicolumn{1}{c}{X}& \multicolumn{1}{c}{X}    \\
Time FE & \multicolumn{1}{c}{X}& \multicolumn{1}{c}{X} \\
\bottomrule
\end{tabularx}
\end{table}

其中文件 tab.tex 直接从 Stata 保存,包含以下代码:

Variable 1 & 0.012 & -0.542 \\
Variable 2 & 0.523 & 0.235 \\
\midrule
No. of Obs. & 1459 & 255 \\

答案1

我最近尝试做类似的事情,但没有找到从 LaTeX 方面解决它的方法。从 Stata 方面,可以通过稍微修改输出表来完成。这是使用 的 Stata 代码esttab

clear all
set more off
set obs 1000
gen x1 = rnormal()
gen x2 = rnormal()
gen y = 1+2*x1+3*x2+rnormal()
gen z = 1+3*x1+2*x2+rnormal()

eststo clear
eststo: reg y x1 x2
estadd local firm "\multicolumn{1}{c}{X}"
estadd local year "\multicolumn{1}{c}{X}"
estadd local obs "\multicolumn{1}{c}{`e(N)'}"
eststo: reg z x1 x2
estadd local firm "\multicolumn{1}{c}{X}"
estadd local year "\multicolumn{1}{c}{X}"
estadd local obs "\multicolumn{1}{c}{`e(N)'}"
esttab using table.tex, replace b(a3) nonum mtitles("y" "z") ///
       starlevels($^{*}$ .1 $^{**}$ .05  $^{***}$ 0.01) ///
       se label nonotes noobs booktabs align(S) ///
       scalars("obs No. of Obs." "firm Firm FE" "year Year FE") 

如您所见,它不仅报告观察次数,还发出所有代码\multicolumn。此外,它使用S对齐字符,假定使用siunitx。相应的 LaTeX 代码可以是以下(关键siunitx设置是input-symbols={()},没有它,标准错误就无法解析):

\documentclass[twocolumn]{article}
\usepackage{siunitx,booktabs}
\sisetup{group-digits=false,parse-numbers=true,input-symbols={()},table-align-text-post=false,
         table-number-alignment=center,table-figures-integer=3,table-figures-decimal=5}
\begin{document}
\begin{table}[ht]
\input{table}
\end{table}
\end{document}

为了供参考,我还展示了生成的table.tex

{
\def\sym#1{\ifmmode^{#1}\else\(^{#1}\)\fi}
\begin{tabular}{l*{2}{S}}
\toprule
                    &\multicolumn{1}{c}{y}&\multicolumn{1}{c}{z}\\
\midrule
x1                  &       1.952$^{***}$&       2.971$^{***}$\\
                    &    (0.0318)        &    (0.0314)        \\
\addlinespace
x2                  &       3.013$^{***}$&       1.992$^{***}$\\
                    &    (0.0308)        &    (0.0304)        \\
\addlinespace
Constant            &       1.067$^{***}$&       0.987$^{***}$\\
                    &    (0.0310)        &    (0.0306)        \\
\midrule
No. of Obs.         &\multicolumn{1}{c}{1000}        &\multicolumn{1}{c}{1000}        \\
Firm FE             &\multicolumn{1}{c}{X}        &\multicolumn{1}{c}{X}        \\
Year FE             &\multicolumn{1}{c}{X}        &\multicolumn{1}{c}{X}        \\
\bottomrule
\end{tabular}
}

另一个想法可能是使用某种后处理器并\multicolumn在表生成后添加内容。

结果是: 在此处输入图片描述

答案2

您可以使用siunitx。这需要对表格代码进行一些调整,但效果要好得多。

您希望条目在其S列中居中,只需将其括起来输入即可。

\documentclass[twocolumn]{article}
\usepackage{siunitx,booktabs}

\begin{document}

\begin{table}[ht]

\begin{tabular*}{\columnwidth}{
  @{\extracolsep{\fill}}
  l
  S[table-format=1.3]
  S[table-format=-1.3]
}
\toprule
 & {(1)} & {(2)}  \\
\midrule
Variable 1 & 0.012 & -0.542 \\
Variable 2 & 0.523 & 0.235 \\
\midrule
No. of Obs. & {1459} & {255} \\
\midrule
Firm FE & {X}& {X} \\
Time FE & {X}& {X} \\
\bottomrule
\end{tabular*}

\end{table}

\end{document}

我用了twocolum,希望你有一张两栏纸(三栏表格的宽度与全局文本宽度一样宽非常难以阅读)。

在此处输入图片描述

相关内容