我试图从一个例子开始LaTeX 中的引用表格行为行创建标签,但我还没有在环境中成功实现longtblr
。我目前的代码是:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{array}
\usepackage{float}
\usepackage{makecell}
\usepackage{nameref}
\usepackage{setspace}
\usepackage{tabularray}
\usepackage[absolute,overlay]{textpos}
\usepackage{xcolor}
\newcounter{rowcntr}[table]
\renewcommand{\therowcntr}{\thetable.\arabic{rowcntr}}
\NewColumnType{N}[1][]{>{\refstepcounter{rowcntr}\therowcntr}c}
\AtBeginEnvironment{tblr}{\setcounter{rowcntr}{0}}
\begin{document}
\begin{longtblr}[
caption = {Long Table 1},
label = {tblr:long-table-1},
]{
colspec = {N[3]|X[5]},
width = \linewidth,
rowhead = 1,
rowfoot = 1,
row{even} = {azure9},
row{1,Z} = {c,font=\sffamily\bfseries,bg=azure5,fg=white}
}
Col 1 & Col 2 \\
\label{row:long-table-1-a} & Ipsum \\
\label{row:long-table-1-b} & Ipsum \\
Col 1 & Col 2 \\
\end{longtblr}
\begin{longtblr}[
caption = {Long Table 2},
label = {tblr:long-table-2},
]{
colspec = {N[3]|X[5]},
width = \linewidth,
rowhead = 1,
rowfoot = 1,
row{even} = {azure9},
row{1,Z} = {c,font=\sffamily\bfseries,bg=azure5,fg=white}
}
Col 1 & Col 2 \\
\label{row:long-table-2-a} & Ipsum \\
\label{row:long-table-2-b} & Ipsum \\
Col 1 & Col 2 \\
\end{longtblr}
\end{document}
有几个问题,编号不对,索引包含在标题中
- 页眉和页脚中包含(错误的)编号。
- 行索引已关闭,它从 2 开始,然后按 2 跳转。
- 第一个表格的标题高度不正确。
- 表格的宽度不一致。
我真正想要的是省略数字/索引列并使用\nameref
第二列的值,这样每次引用标签时,我都会提取相应的单元格值。通过这种方法,我可以检测任何错误的引用(即当有人更新表格并破坏引用时)。
我发现引用与长表行链接的标签作为一种可能的替代方法,但这需要在文档的所有地方复制实际的单元格值。
如有任何指导我将不胜感激。
答案1
编号错误是由于 s 中的计数器在未加载库的情况下tblr
无法正常工作(手册,§5.3)。对我来说,这还修复了整个表格宽度和第一个表格第一行的额外高度。tblr
counter
tabularray
\UseTblrLibrary{counter}
宽度不一致是因为您基于 确定了N
列类型c
,而 不支持宽度系数X
。暂时不考虑其他问题,您可以通过将列定义更改为以下内容来修复此问题:
\NewColumnType{N}[1][]{>{\refstepcounter{rowcntr}\therowcntr}X[#1]}
这里我已将 替换c
为X[#1]
。#1
它会用 的可选参数填充。 如果没有它,无论你给 什么参数,N
你实际上都会得到。X[1]
N
剩下的更困难的问题是您的页眉和页脚已编号(此时仍然是错误的)。我认为这里发生的是旧样式的列类型array
与引入的新语法之间的混淆tabularray
。当您执行时row{1,Z} = {c,...}
,c
不是将替换您上面已经分配的列类型的列类型colspec
;它是 key 的值halign
(请参阅tabularray
手册§2.4--5)。此外,即使将preto={}
相当于添加tabularray
到此>{}
选项集也不会起作用,因为您正在修改排而不是柱子。
我的建议是放弃 NewColumnType,而是将编号指定为您想要编号的单元格范围的属性。您的表格规范将如下所示:
colspec = {X[3]|X[5]},
width = \linewidth,
rowhead = 1,
rowfoot = 1,
row{even} = {azure9},
row{1,Z} = {c,font=\sffamily\bfseries,bg=azure5,fg=white},
cell{2-Y}{1} = {preto={\refstepcounter{rowcntr}\therowcntr}},
如果您想避免为多个表复制相同的定义,您可以使用 \NewTblrEnviron 来创建新的表类型:
\NewTblrEnviron{mytblr}
\SetTblrOuter[mytblr]{long}
\SetTblrInner[mytblr]{
colspec = {X[3]|X[5]},
width = \linewidth,
rowhead = 1,
rowfoot = 1,
row{even} = {azure9},
row{1,Z} = {c,font=\sffamily\bfseries,bg=azure5,fg=white},
cell{2-Y}{1} = {preto={\refstepcounter{rowcntr}\therowcntr}},
}
最后,您不需要,\AtBeginEnvironment{tblr}{\setcounter{rowcntr}{0}}
因为[table]
in\newcounter{rowcntr}[table]
已经这样做了。您也不需要array
or,makecell
因为您正在使用tabularray
。
不用多说,以下是我对你的 MWE 的理解:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
%\usepackage{float} ¬ relevant for longtblr
\usepackage{nameref}
%\usepackage{setspace} %not used here
\usepackage{tabularray}
\UseTblrLibrary{counter}
%\usepackage[absolute,overlay]{textpos} %not used here
\usepackage{xcolor}
\newcounter{rowcntr}[table]
\renewcommand{\therowcntr}{\thetable.\arabic{rowcntr}}
\NewTblrEnviron{mytblr}
\SetTblrOuter[mytblr]{long}
\SetTblrInner[mytblr]{
colspec = {X[3]|X[5]},
width = \linewidth,
rowhead = 1,
rowfoot = 1,
row{even} = {azure9},
row{1,Z} = {c,font=\sffamily\bfseries,bg=azure5,fg=white},
cell{2-Y}{1} = {preto={\refstepcounter{rowcntr}\therowcntr}},
}
\begin{document}
\begin{mytblr}[
caption = {Long Table 1},
label = {tblr:long-table-1},
]{}
Col 1 & Col 2 \\
\label{row:long-table-1-a} & Ipsum \\
\label{row:long-table-1-b} & Ipsum \\
Col 1 & Col 2 \\
\end{mytblr}
\begin{mytblr}[
caption = {Long Table 2},
label = {tblr:long-table-2},
]{}
Col 1 & Col 2 \\
\label{row:long-table-2-a} & Ipsum \\
\label{row:long-table-2-b} & Ipsum \\
Col 1 & Col 2 \\
\end{mytblr}
\end{document}
编辑以回应您的评论:
奇怪的是,如果不定义新环境,行编号将不起作用tabularray
。此代码对我而言按预期工作:
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{nameref}
\usepackage{tabularray}
\UseTblrLibrary{counter}
\usepackage{xcolor}
\newcounter{rowcntr}[table]
\renewcommand{\therowcntr}{\thetable.\arabic{rowcntr}}
\begin{document}
\begin{longtblr}[
caption = {Long Table 1},
label = {tblr:long-table-1},
]{
colspec = {X[3]|X[5]},
width = \linewidth,
rowhead = 1,
rowfoot = 1,
row{even} = {azure9},
row{1,Z} = {c,font=\sffamily\bfseries,bg=azure5,fg=white},
cell{2-Y}{1} = {preto={\refstepcounter{rowcntr}\therowcntr}},
}
Col 1 & Col 2 \\
\label{row:long-table-1-a} & Ipsum \\
\label{row:long-table-1-b} & Ipsum \\
Col 1 & Col 2 \\
\end{longtblr}
\begin{longtblr}[
caption = {Long Table 2},
label = {tblr:long-table-2},
]{
colspec = {X[3]|X[5]},
width = \linewidth,
rowhead = 1,
rowfoot = 1,
row{even} = {azure9},
row{1,Z} = {c,font=\sffamily\bfseries,bg=azure5,fg=white},
cell{2-Y}{1} = {preto={\refstepcounter{rowcntr}\therowcntr}},
}
Col 1 & Col 2 \\
\label{row:long-table-2-a} & Ipsum \\
\label{row:long-table-2-b} & Ipsum \\
Col 1 & Col 2 \\
\end{longtblr}
\end{document}