使用 tabularray 包将数据文件包含在 LaTeX 表中时出现问题

使用 tabularray 包将数据文件包含在 LaTeX 表中时出现问题

我在使用 tabularray 包将外部文件的内容包含到 LaTeX 表中时遇到困难。我正在使用以下 LaTeX 代码:

\documentclass{article}
\usepackage{pythontex}
\usepackage{tabularray}
\usepackage{siunitx}

\begin{document}

\begin{pycode}
from scipy.constants import physical_constants

constants = physical_constants.keys()

table = []
for constant in constants:
    value, unit, uncertainty = physical_constants[constant]
    table.append([constant, value, unit, uncertainty])

# Função para formatar um valor com unidade
def format_value_with_unit(value, unit):
    formatted_value = r'\num{' + str(value) + r'}'
    formatted_unit = r'\unit{' + unit + r'}'
    return formatted_value, formatted_unit

# Gravar o output em um arquivo LaTeX
with open('output.tex', 'w') as f:
    # f.write(r'\begin{tabular}{cccc}' + '\n')
    f.write(r'\textbf{Constante} & \textbf{Valor} & \textbf{Unidade} & \textbf{Incerteza} \\ \hline' + '\n')
    
    # Escrever as constantes com seus valores e unidades
    for row in table:
        constant = row[0]
        value = row[1]
        unit = row[2]
        uncertainty = row[3]

        formatted_value, formatted_unit = format_value_with_unit(value, unit)

        line = constant + ' & ' + formatted_value + ' & ' + formatted_unit + ' & ' + r'\num{' + str(uncertainty) + r'}' + r' \\'
        f.write(line + '\n')
    
    # f.write(r'\end{tabular}')
\end{pycode}

\begin{longtblr}[
caption = {Constantes da Física.},
label = {constantes},
]{
colspec = {XXXX}, 
width = \linewidth,
}
\input{output.tex}
\end{longtblr}

\end{document}

文件 output.tex 包含常量列表及其各自的值、单位和不确定性。但是,当我编译代码时,我收到以下错误:

(./pythontex-files-stack-overflow/stack-overflow.pytxpyg) (./output.tex
! Misplaced alignment tab character &.
l.1 \textbf{Constante} &
                         \textbf{Valor} & \textbf{Unidade} & \textbf{Incerte...

有人可以帮助我找出我做错的地方或提供替代解决方案以将 output.tex 文件的内容包含在表中吗?

我感谢您提供的任何帮助!

谢谢你,路易斯·费雷拉

答案1

根据包的文档tabularray,添加

\UseTblrLibrary{functional}

序言

并使用

\begin{longtblr}[
evaluate = \fileInput,
caption = {Constantes da Física.},
label = {constantes},
]{
colspec = {XXXX}, 
width = \linewidth,
}
\fileInput{output}
\end{longtblr}

或者,使其output.tex包含整个内容,即不仅包含数据,还包含longtblr环境。

附注:这给出了一个 30 页的文档,其构建时间非常长。如果我是你,我不会使用tabularray包,而是使用一些longtable具有合适的传统p列和适当宽度的包。看来这种tabularray方法对这种示例的开销太大了。除非你有一个非常快的 CPU。我承认我的材料相当过时。

此外,第一列“Constante”显示效果不佳。您可以\usepackage{ragged2e}在文档前言中包含并>{\RaggedRight}在表格前言规范中插入以进行改进(即如果坚持tabularray使用colspec = {>{\RaggedRight}XXXX},)。

更新:

我得到了一个合理的结果(并且构建速度更快,但需要 2 次编译)

\renewcommand{\arraystretch}{1.2}
\begin{longtable}{>{\RaggedRight}p{2.5cm}SSS}
\input{output}
\end{longtable}

编辑:这里更加完善,但最好从output.tex标题行中删除

\renewcommand{\arraystretch}{1.2}
\begin{longtable}{>{\RaggedRight}p{2.5cm}SSS}
\endfirsthead
\multicolumn{4}{c}{\textbf{Table of physical constants (cont.)}}\\\hline\noalign{\vskip2\jot}
\endhead
\input{output}
\end{longtable}

但是你可以(应该?)考虑使用说明符的可选参数对此进行改进S,请参阅siunitx文档(语法等内容S[table-column-width = 2cm] 似乎相关)。然后整个\num\unit标记output.tex可能是多余的,也可能不是(我不太熟悉siunitx)。

旁注

负指数的标记output.tex是错误的。而且单位之间缺少一个点。诸如 之类的东西\unit{C^4 m^4 J^-3}应该是\unit{C^4.m^4.J^{-3}}\unit{C^4.m^4/J^3}。请参阅siunitx文档部分3.3 Units

相关内容