如何利用宏命令判断编译Bib文件使用的是BibTex还是Biber?

如何利用宏命令判断编译Bib文件使用的是BibTex还是Biber?

如题, 自动检测当前编辑器用什么来编译bib文件,比如我用的是Texstudio,如何用宏命令知道我用的是Biber还是BibTex

例如:

\ifbiber
    %% writing
\fi


\ifbibtex
    %% writing
\fi

答案1

如果您的编辑器设置为运行 BibTeX 或 Biber ,我认为您无法实际使用.tex文档中的 TeX 代码进行查询(如果您的编辑器在某些配置文件中公开了此信息,您可能能够使用某些 shell 转义读取此配置文件并解析信息,但这似乎非常非常困难,并且 shell 转义本身也存在安全风险)。

以下是您可以尝试使用 LaTeX 执行的操作。

您可以检查文档的最后一次运行是否使用了 Biber 或 BibTeX。为此,我们查看文件.blg,看看它是否开始告诉

This is BibTeX, Version 0.99d

或者

[0] Config.pm:311> INFO - This is Biber 2.16

事情变得有点混乱,因为我们必须在读取时考虑正确的类别代码,但以下内容应该是可用的。问题是,你只能检测到事后运行了哪个书目引擎。您无法检测将/应该运行哪个引擎。

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage{etoolbox}
\makeatletter
\newread\cbe@blgin

\begingroup
\gundef\cbe@firstline
\openin\cbe@blgin\jobname.blg\relax
\ifeof\cbe@blgin
\else
  \endlinechar\m@ne
  \global\readline\cbe@blgin to \cbe@firstline
\fi
\closein\cbe@blgin

\gdef\ecb@expandfirsttwo#1#2#3{%
  \edef\reserved@a{\noexpand#1#2#3}\reserved@a}

\xdef\ecb@thisisbiber{\detokenize{This is Biber}}
\expandafter\gdef
\expandafter\IfBiberUsedTF@i
\expandafter#\expandafter1
\ecb@thisisbiber #2\biberteststop{\notblank{#2}}
\gdef\IfBiberUsedTF{%
  \ifundef\cbe@firstline
    {\@secondoftwo}
    {\ecb@expandfirsttwo\IfBiberUsedTF@i\cbe@firstline\ecb@thisisbiber\biberteststop}}

\xdef\ecb@thisisbibtex{\detokenize{This is BibTeX}}
\expandafter\gdef
\expandafter\IfBibTeXUsedTF@i
\expandafter#\expandafter1
\ecb@thisisbibtex #2\bibtexteststop{\notblank{#2}}
\gdef\IfBibTeXUsedTF{%
  \ifundef\cbe@firstline
    {\@secondoftwo}
    {\ecb@expandfirsttwo\IfBibTeXUsedTF@i\cbe@firstline\ecb@thisisbibtex\bibtexteststop}}
\endgroup
\makeatother


\begin{document}
\IfBiberUsedTF{Biber}{No Biber}

\IfBibTeXUsedTF{BibTeX}{No BibTeX}
\end{document}

biblatex如果您想检查应该运行哪个引擎(由于您加载的软件包),您可以使用 Biber只能在用户未指定的情况下使用backend=bibtex,。所以我们可以检查这些条件

\documentclass[british]{article}
\usepackage[T1]{fontenc}
\usepackage{babel}
\usepackage{csquotes}

\usepackage[backend=biber, style=authoryear]{biblatex}

\usepackage{etoolbox}
\makeatletter
\let\ecb@ifbibtex\@firstoftwo
\let\ecb@ifbiber\@secondoftwo

\AtBeginDocument{%
  \@ifpackageloaded{biblatex}
    {\iftoggle{blx@bibtex}
       {}
       {\let\ecb@ifbibtex\@secondoftwo
        \let\ecb@ifbiber\@firstoftwo}}
    {}}

\newcommand*{\IfBiberTF}{\ecb@ifbiber}
\newcommand*{\IfBibTeXTF}{\ecb@ifbibtex}
\makeatother

\begin{document}
\IfBiberTF{Use Biber}{Do not use Biber}

\IfBibTeXTF{Use BibTeX}{Do not use BibTeX}
\end{document}

相关内容