我在使用 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
。