tabularx 和 defernumbers=true 中引用的参考书目仅打印

tabularx 和 defernumbers=true 中引用的参考书目仅打印

在我的文档中,我需要大量引用。但是,我的参考书目突然停止工作。文档和参考书目中的所有引用都是 [0](而不是预期的 [1]、[2] 等)。

我似乎已经发现如果我有超过 100 个引用键就会发生这种情况(请不要因为我的过度引用而评判我)。

另一个问题似乎是延迟数字=真,就像我将其设置为延迟数字=false,即使使用 101+ citekeys,引用和参考书目也能正常工作。

我导入 biblatex 包如下:

\usepackage[hyperref=true, style=numeric, citestyle=numeric, sorting=none, defernumbers=true, backend=biber, backref=false]{biblatex}

在这里 MWE 没有多大意义,因为在我到达第 101 个 citekey 之前一切都运行正常。

我的问题是:

  1. 我是否可以正确地假设 101+ citekeys 可能是一个问题?
  2. 有解决方法吗?我将参考书目分为不同的主题,因此我想使用 defernumbers=true。但如果没有其他选择,我将不得不放弃它。

谢谢!=)

更新: 显然,100 次引用是巧合。问题似乎出在 tabularx 中的引用上。删除表格中的引用或设置 defernumbers=false 可以解决问题。我也更新了这个问题的标题。

主文本

\documentclass[a4paper, 12pt]{scrbook}

\usepackage{tabularx}

%---Bibliography---%
\usepackage[hyperref=true, style=numeric, citestyle=numeric, sorting=none, 
defernumbers=true, backend=biber, backref=false]{biblatex}
\addbibresource{bibliographyTable.bib}

\defbibfilter{bib:filter:literatur}{( type=book or type=incollection or type=inproceedings or type=article or type=thesis )}
\defbibfilter{bib:filter:report}{( type=report or type=techreport )}

\begin{document}

\input{mweTable.tex}

\newpage
\printbibheading[heading=bibintoc, title={Bibliography}]
\printbibliography[heading=subbibintoc, filter=bib:filter:literatur, title={Literature}]
\printbibliography[heading=subbibintoc, type=online, title={Online}] 
\printbibliography[heading=subbibintoc, filter=bib:filter:report, title={Reports}] 

\end{document}

表格.tex

\begin{table}[htbp]
    \begin{tabularx}{1.0\textwidth}{ | X | X | X | }
        \hline
        \textbf{A} 
        \cite{bib:1}\cite{bib:2}    

        & \textbf{B}
        \cite{bib:3}\cite{bib:4}\cite{bib:5}    

        & \textbf{C}
        \cite{bib:6}\cite{bib:7}

        \tabularnewline 
        \hline

        a 
        \cite{bib:1}\cite{bib:2} 

        & b 
        \cite{bib:9} 

        & c 
        \cite{bib:8}

        \tabularnewline \hline

    \end{tabularx}
\end{table}

 \cite{bib:10} 
 \cite{bib:11}
 \cite{bib:12}
 \cite{bib:13}
 \cite{bib:14}
 \cite{bib:15}

书目表.bib

@Report{bib:1,
    author      =   {Author 1},
    title       =   {Title 1},
    institution =   {Institution 1},
    year        =   {2016},
    month       =   {9},
    day         =   {19},
    url         =   {https://www.mwe.com},
    urldate     =   {2018-12-18}
}

@article{bib:2,
    author = {Author 2},
    year = {2010},
    month = {05},
    pages = {},
    title = {Title 2},
    volume = {10},
    journal = {Journal 2},
    doi = {10.21334}
}

@incollection{bib:3,
author  = {Author 3},
title       = {Title 3},
booktitle   = {Booktitle 3},
publisher   = {Publisher 3},
address     = {Address 3},
year        = {2018},
editor      = {Editor 4},
chapter     = {1},
doi         = {10.577889},
url         = {www.mwe.com}
}


@online{bib:4,
    title           = {Title},
    author          = {Author},     
    url             = {www.mwe.com}, 
    urldate         = {2018-12-29}
}

@online{bib:5,
    title           = {Title},
    author          = {Author}, 
    url             = {www.mwe.com},
    urldate         = {2018-12-29}
}

@online{bib:6,
    title           = {Title}, 
    author          = {Author}, 
    url             = {www.mwe.com}, 
    urldate         = {2018-12-29}
}

@online{bib:7,
    title           = {Title}, 
    author          = {Author}, 
    url             = {www.mwe.com}, 
    urldate         = {2018-10-29}
}

@online{bib:8,
    title           = {Title}, 
    author          = {Author}, 
    url             = {www.mwe.com}, 
    urldate         = {2018-10-29}
}

@online{bib:9,
    title           = {Title}, 
    author          = {Author}, 
    url             = {www.mwe.com}, 
    urldate         = {2018-10-29}
}

@online{bib:10,
    title           = {Title}, 
    author          = {Author}, 
    url             = {www.mwe.com}, 
    urldate         = {2018-12-29}
}

@online{bib:11,
    title           = {Title}, 
    author          = {Author}, 
    url             = {www.mwe.com}, 
    urldate         = {2018-10-29}
}

@online{bib:12,
    title           = {Title}, 
    author          = {Author}, 
    url             = {www.mwe.com}, 
    urldate         = {2018-10-29}
}

@online{bib:13,
    title           = {Title}, 
    author          = {Author}, 
    url             = {www.mwe.com}, 
    urldate         = {2018-10-29}
}

@online{bib:14,
    title           = {Title}, 
    author          = {Author}, 
    url             = {www.mwe.com}, 
    urldate         = {2018-10-29}
}

@online{bib:15,
    title           = {Title}, 
    author          = {Author}, 
    url             = {www.mwe.com}, 
    urldate         = {2018-10-29}
}

答案1

biblatex3.13 已更新,在这种情况下更加强大。使用biblatex3.13 或更高版本,引用将按预期工作tabularx

如果可能的话,请更新您的 TeX 系统。

一些背景信息 https://github.com/plk/biblatex/issues/242

下面的答案是为了历史兴趣而保留的。这里描述的修复应该不是适用于biblatex3.13或以上版本。

这确实是一个类似的问题tabularx 中的引用导致所有参考书目条目没有编号David 的解决方法在这里也有效。

tabularx需要测量表格内容以找到正确的单元格宽度,在这些测量运行期间,TeX 会执行单元格中的代码,但不会打印结果。测量运行后,结果将使用计算的长度进行排版。

tabularx采取一些措施来避免在实际排版步骤之前多次运行代码而产生不必要的副作用(所有全局分配都可能存在问题,尤其是推进计数器之类的事情)。特别是用于测量运行的tabularx块。\write

biblatex的引用命令.aux在第一次引用条目时将一些辅助数据写入文件。如果条目的第一次引用是在上下文中tabularx,则全局分配(biblatex保留所有引用条目的全局列表:)\blx@cites\write(在第一次引用条目时,由于该条目尚未在中\blx@cites,因此biblatex将一些引用信息写入.aux文件)之间的相互作用意味着测量运行执行全局分配但不执行\write。后续排版运行将不会\write再次执行,因为根据其中的数据,\blx@cites它应该已经发生了。

此问题已跟踪至https://github.com/plk/biblatex/issues/242。目前正在考虑的解决方法(可能会成为 的未来版本biblatex)将信息写入.aux文件的时间延迟到文档末尾。这意味着可以避免全局分配和单元格\write之间的相互作用。tabularx

\documentclass{article}
\usepackage{tabularx}
\usepackage[style=numeric, sorting=none, defernumbers=true, backend=biber]{biblatex}

\addbibresource{biblatex-examples.bib}

\makeatletter
\def\blx@citation@entry#1#2{%
  \blx@bibreq{#1}%
  \ifinlist{#1}\blx@cites
    {}
    {\listgadd{\blx@cites}{#1}}%
  \ifinlistcs{#1}{blx@segm@\the\c@refsection @\the\c@refsegment}
    {}
    {\listcsgadd{blx@segm@\the\c@refsection @\the\c@refsegment}{#1}}%
  \blx@auxwrite\@mainaux{}{\string\abx@aux@segm{\the\c@refsection}{\the\c@refsegment}{\detokenize{#1}}}%
  \blx@ifdata{#1}
    {}
    {\ifcsdef{blx@miss@\the\c@refsection}
       {\ifinlistcs{#1}{blx@miss@\the\c@refsection}
          {}
          {\blx@logreq@active{#2{#1}}}}
       {\blx@logreq@active{#2{#1}}}}}

\AtEndDocument{%
  \begingroup
  \def\do#1{\blx@auxwrite\@mainaux{}{\string\abx@aux@cite{#1}}}%
  \dolistloop\blx@cites
  \endgroup
}
\makeatother

\begin{document}
\cite{geer}

\begin{table}[htbp]
  \begin{tabularx}{\textwidth}{X}
    \cite{sigfridsson} \cite{geer,nussbaum}
  \end{tabularx}
\end{table}

\cite{worman,nussbaum}

\printbibliography
\end{document}

表前文中引用显示为 [1],表内引用显示为 [2] [1, 3],表后引用显示为 [4, 3]。

相关内容