拯救亚里士多德:如何使 Biblatex 重新定义根据所选的风格而定(或使其更加万无一失)?

拯救亚里士多德:如何使 Biblatex 重新定义根据所选的风格而定(或使其更加万无一失)?

一般来说

\Citeauthor{aristotle:rhetoric,aristotle:poetics}

会排版,Aristotle; Aristotle而不是简单地Aristotle。为了避免这种情况,我向\citeauthor朋友寻求帮助,让他们表现得更像他们的\textcite同行。作为回应,我得到了一份出色的来自 moewe 的回答这成为我的一大块代码biblatex.cfg

这对于样式来说非常有效authoryear。然而,在其他情况下效果并不好。这是完全可以理解的,但我想让它更能防止人为错误(尤其是我的错误)。

在理想情况下,代码显然适用于所有样式。但是,我希望以下问题可能更加现实:

是否可以检查当前样式,以便仅在已加载已知兼容样式时执行更改?例如,(引用)样式是否存储在我可以检查的宏中?

显然,我会回到Aristotle; Aristotle,但我可以接受。我想避免的是更险恶的情况,即亚里士多德没有被克隆,而是被消灭或消失了。

\documentclass{article}
\usepackage[backend=biber,style=verbose]{biblatex}
\bibliography{biblatex-examples}
\makeatletter
% ateb moewe: http://tex.stackexchange.com/a/352471/ addaswyd o gôd Biblatex am \textcite et al.
% BEGIN redefine \citeauthor et al. to behave more like \textcite et al.
\providebibmacro*{cite:reinit}{%
  \global\undef\cbx@lasthash
  \global\undef\cbx@lastyear
}
\providebibmacro*{cite:init}{\usebibmacro{cite:reinit}}

\newbibmacro*{citeauthor}{%
  \ifnameundef{labelname}
  {\usebibmacro{cite:reinit}}
  {%
    \iffieldequals{namehash}{%
      \cbx@lasthash
    }{}{%
      \printnames{labelname}%
      \stepcounter{textcitecount}%
      \savefield{namehash}{\cbx@lasthash}%
    }%
  }%
  \setunit{\textcitedelim}%
}

\DeclareCiteCommand{\cbx@citeauthor}
{%
  \usebibmacro{cite:init}%
}{%
  \usebibmacro{citeindex}%
  \usebibmacro{citeauthor}%
}{}{%
  \usebibmacro{postnote}%
}

\providerobustcmd{\cbx@textcite@init}[2]{%
  \setcounter{textcitetotal}{0}%
  \setcounter{textcitecount}{0}%
  \def\cbx@savedcites{#1}#2\cbx@savedcites\empty}

\DeclareCiteCommand{\citeauthor}[\cbx@textcite@init\cbx@citeauthor]{%
  \gdef\cbx@savedkeys{}%
  \citetrackerfalse
  \pagetrackerfalse
  \DeferNextCitekeyHook
  \usebibmacro{cite:init}%
}{%
  \ifthenelse{%
    \iffirstcitekey\AND\value{multicitetotal}>0%
  }{%
    \protected@xappto\cbx@savedcites{()(\thefield{multipostnote})}%
    \global\clearfield{multipostnote}%
  }{}%
  \xappto\cbx@savedkeys{\thefield{entrykey},}%
  \iffieldequals{namehash}{%
    \cbx@lasthash
  }{}{%
    \stepcounter{textcitetotal}%
    \savefield{namehash}{\cbx@lasthash}%
  }%
}{}
{%
  \protected@xappto\cbx@savedcites{%
    [\thefield{prenote}][\thefield{postnote}]{\cbx@savedkeys}%
  }%
}

\DeclareDelimcontextAlias{cbx@citeauthor}{textcite}

% END redefine \citeauthor et al
\makeatother
\begin{document}
  \Citeauthor{aristotle:rhetoric,aristotle:poetics}
\end{document}

答案1

当前样式存储在内部宏\blx@bbxfile和中\blx@cbxfile。祝您分支愉快!

\documentclass{article}

\usepackage[style=authoryear,citestyle=verbose]{biblatex}

\begin{document}

\csname blx@bbxfile\endcsname

\csname blx@cbxfile\endcsname

\end{document}

在此处输入图片描述

答案2

这是对Henri Menke 的回答,以防其他人需要类似的东西。基于该答案,以下是我在中设置条件的方法biblatex.cfg

% ateb Henri Menke: https://tex.stackexchange.com/a/365438/
% bibstyle name: \csname blx@bbxfile\endcsname
% citestyle name: \csname blx@cbxfile\endcsname

\newif\ifcfr@biblatex@authorcomp
\cfr@biblatex@authorcompfalse
\def\cfr@blx@splitfile#1-#2\@null{#1}
\edef\tempa{\expandafter\cfr@blx@splitfile\blx@cbxfile-x\@null}
\edef\tempb{authoryear}
\edef\tempc{authortitle}
\edef\tempd{alphabetic}
\edef\tempe{numeric}
\edef\tempf{reading}
\ifx\tempa\tempb
  \cfr@biblatex@authorcomptrue
  \else\ifx\tempa\tempc
    \cfr@biblatex@authorcomptrue
    \else\ifx\tempa\tempd
      \cfr@biblatex@authorcomptrue
      \else\ifx\tempa\tempe
        \cfr@biblatex@authorcomptrue
        \else\ifx\tempa\tempf
          \cfr@biblatex@authorcomptrue
        \fi
      \fi
    \fi
  \fi
\fi

\ifcfr@biblatex@authorcomp

  ...

\else

  ...

\fi

事实证明,moewe 提供的重新定义几乎可以满足任何样式的verbose要求。但为了保险起见,我进行了更冗长的检查,以查看哪些样式可以正常工作,但不包括不正常工作的样式verbose,以及draft特殊debug情况的样式。

相关内容