标记一个 longtblr 行并引用特定的列

标记一个 longtblr 行并引用特定的列

我试图从一个例子开始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)。对我来说,这还修复了整个表格宽度和第一个表格第一行的额外高度。tblrcountertabularray

\UseTblrLibrary{counter}

宽度不一致是因为您基于 确定了N列类型c,而 不支持宽度系数X。暂时不考虑其他问题,您可以通过将列定义更改为以下内容来修复此问题:

\NewColumnType{N}[1][]{>{\refstepcounter{rowcntr}\therowcntr}X[#1]}

这里我已将 替换cX[#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]已经这样做了。您也不需要arrayor,makecell因为您正在使用tabularray

不用多说,以下是我对你的 MWE 的理解:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
%\usepackage{float} &not 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}

相关内容