我正在创建一个程序,该程序通过带有 .tex 文件的 .py GUI 根据 .xlsx 输入生成 .pdf 文件。
到目前为止,为了创建相应的 .tex 文件,我一直使用 Overleaf。但是,现在我想让这个程序在本地运行,我首先切换到 MiKTeX,现在又切换到 TeX Live。
在使用运行 TeX Live 版本 2021 的 XeLaTex 在 Overleaf 上进行编译时,我的 .tex 文件运行顺畅且完美。
但是,如果我使用 MiKTeX 或 TeX Live,报告中就会出现各种“[0]”。
我能够追踪问题的原因,它显示在以下代码中:
\documentclass{report}
\usepackage[style=apa, natbib=false]{biblatex}
\usepackage{tabularray}
\usepackage{csquotes}
\usepackage{tcolorbox}
\begin{document}
\begin{tblr}{h{4cm}h{4cm}h{4cm}}
\begin{tcolorbox}[width=3.5cm,colback=white,colframe=black] test \end{tcolorbox}
& \begin{tcolorbox}[width=3.5cm,colback=white,colframe=black] test \end{tcolorbox}
& \begin{tcolorbox}[width=3.5cm,colback=white,colframe=black] test \end{tcolorbox}
\end{tblr}
\end{document}
似乎 tabularray 环境中的 tcolorbox 创建了这些随机的“[0]”。
有效的解决方案 - 但不适合我
- 使用 tabular、tabularx 或 tabulary。(我无法确保在用户输入不同的情况下实现完美的垂直对齐。我的文档非常庞大 - 无论如何都不可能更改实际的 latex 代码并摸索每个表格的 tabular 环境。该文件在 Overleaf 上运行良好,花几天时间更改一个完美运行的文件会非常令人沮丧);
- 不使用 tcolorboxes。(-> 颜色框是程序目的的必要组成部分)。
我尝试过但无效的解决方案
- 从 MiKTeX 更改为 Overleaf 的编译器 TeX Live;
- 使用 Overleaf 使用的 tabularray 包版本;
- 任何与箱子过满/未满错误有关的事情,这是我最初的怀疑。
我正在寻找的解决方案
- 使 Tex Live 的编译结果与 Overleaf 完全一样的方法;
- 使 tabularray 环境以支持 tcolorboxes 的方式运行的方法。
不久前我下载了 Tex Live。因此它运行的是最新版本。我注意到,Overleaf 上的 Tex Live 运行的是旧版本:
XeTeX, Version 3.141592653-2.6-0.999993 (TeX Live 2021) (preloaded format=xelatex 2021.9.30)
与本地 Tex Live 对比:
XeTeX, Version 3.141592653-2.6-0.999994 (TeX Live 2022) (preloaded format=xelatex 2022.5.27)
我尝试下载旧版本的 Tex Live,以使其像在 Overleaf 中一样运行,但是官方网站不提供旧版本的下载。
希望有人能帮忙。提前谢谢。
答案1
使用nobeforeafter
键来抑制 tcolorbox 前后的代码。(我个人更喜欢使用 tcolorbox 的栅格库来对齐 tcolorbox)。
\documentclass{report}
\usepackage{tabularray}
\usepackage{tcolorbox}
\begin{document}
\begin{tblr}{h{4cm}h{4cm}h{4cm}}
\begin{tcolorbox}[nobeforeafter,width=3.5cm,colback=white,colframe=black] test \end{tcolorbox}
& \begin{tcolorbox}[nobeforeafter,width=3.5cm,colback=white,colframe=black] test \end{tcolorbox}
& \begin{tcolorbox}[nobeforeafter,width=3.5cm,colback=white,colframe=black] test \end{tcolorbox}
\end{tblr}
\end{document}
答案2
更新: tabularray
2022C(于 2022-07-01 发布)已修复此问题,请参阅CTAN-安。
但在 Overleaf 上使用它时,你仍然需要做一些工作,才能让 Overleaf 支持 texlive 2022 甚至 2023,这取决于 Overleaf 的 texlive 2022 是否包含tabularray
2022C。这是因为 Overleaf 使用静态年度 texlive“镜像”。
原始答案:
tabularray
重新定义\pagebreak
,\nopagebreak
当它们在环境中被看到时tblr
,但忘记允许可选参数。- 默认情况下
tcolorbox
传递\pagebreak[0]
给其选项before
,如\tcbset{before={<code that contains \pagebreak[0]>}}
。 - 因此,当
tcolorbox
环境内部tblr
使用的价值before
并遇到时\pagebreak[0]
,[0]
就会剩下剩余。
我已经向 报告了此事tabularray
,请参阅https://github.com/lvjr/tabularray/issues/259。
有关临时解决方法tcolorbox
,请参阅@Ulrike Fischer 的回答这表明tcolorbox
选项nobeforeafter
.nobeforeafter
将清除before
和的值after
。请注意,这不仅可以避免多余的[0]
,还可以删除tcolorbox
环境上方和下方添加的垂直空间。表格单元格中可能首先不需要这样的空间。
有关从侧面的临时解决方法tabularray
,请参见下面的示例,其中重新定义了表命令\pagebreak
和\nopagebreak
。
\documentclass{article}
\usepackage{tabularray}
\usepackage{tcolorbox}
\ExplSyntaxOn
\msg_new:nnn { tabularray } { undefined-table-command }
{ Table ~ commnad ~ #1 has ~ not ~ been ~ defined! }
\NewDocumentCommand \RenewTableCommand { m O{0} o m }
{
\clist_if_in:NnTF \g__tblr_table_commands_clist { #1 }
{
\__tblr_make_xparse_arg_spec:nnN { #2 } { #3 } \l__tblr_a_tl
\exp_args:NcV \RenewDocumentCommand
{ __tblr_table_command_ \cs_to_str:N #1 :w } \l__tblr_a_tl { #4 }
\exp_args:NcV \RenewDocumentCommand
{ __tblr_table_command_ \cs_to_str:N #1 _gobble :w } \l__tblr_a_tl { }
\IfValueTF { #3 }
{
\tl_gset:cn { g__tblr_table_cmd_ \cs_to_str:N #1 _arg_numb_tl } {-#2}
}
{
\tl_gset:cn { g__tblr_table_cmd_ \cs_to_str:N #1 _arg_numb_tl } {#2}
}
}
{
\msg_error:nnn { tabularray } { undefined-table-command } { #1 }
}
}
\RenewTableCommand \pagebreak [1] [4]
{
\hborder { pagebreak = yes }
}
\RenewTableCommand \nopagebreak [1] [4]
{
\hborder { pagebreak = no }
}
\ExplSyntaxOff
\begin{document}
\begin{tblr}{h{4cm}h{4cm}h{4cm}}
\begin{tcolorbox}[width=3.5cm,colback=white,colframe=black] test \end{tcolorbox}
& \begin{tcolorbox}[width=3.5cm,colback=white,colframe=black] test \end{tcolorbox}
& \begin{tcolorbox}[width=3.5cm,colback=white,colframe=black] test \end{tcolorbox}
\end{tblr}
\end{document}