编辑

编辑

我正在尝试从 bib 条目中提取一些数据以进行进一步处理。遗憾的是,如果我使用 cite 命令,它会启动一个页面:

\documentclass{article}
\usepackage{biblatex}
\addbibresource{biblatex-examples.bib}

\DeclareCiteCommand{\gettitle}
 {}
 {\gdef\currenttitle{\thefield{title}}}%
 {}{}


\begin{document}
abc
\clearpage
\gettitle{gillies}%
\end{document}

这是一个问题,因为它会导致我的真实文档(涉及includepdf)中出现空白页。有人知道我如何在不干扰发货的情况下获取数据吗?

编辑

很抱歉造成混淆\gdef:我只是使用了一些无意义的代码,通常不会启动页面。\sboxin 是一个想法,但在我的实际代码中,我在代码中还有一个,\includepdf所以我不想丢弃所有内容,我只想阻止启动代码启动页面,以便以下内容\includepdf(使用其中一个字段作为文件名)不会强制空白页。

Egreg 的参考文献将\leavevmode带来解决方案

 {\makeatletter
  \let\blx@leavevmode\relax\let\blx@leavevmode@cite\relax
  \gettitle{gillies}}

\blx@leavevmode@cite执行得很早,因此无法将代码合并到的定义中\gettitle)。

另一个想法\AtBeginShipoutDiscard来自这个atbegshi包:

\DeclareCiteCommand{\gettitle}
 {\AtBeginShipoutNext{%
  \AtBeginShipoutDiscard}}
 {\gdef\currenttitle{\thefield{title}}}%
 {}{}

这样就不再需要使用某些包装器命令来隐藏 leavevmode 更改。但我不知道如何检查页面是否由\leavevmodecite 命令启动(因此可以丢弃)或者页面上是否有一些“正常”文本。

答案1

cite 命令发出\leavevmode;在框中评估 cite 命令。

\documentclass{article}
\usepackage{biblatex}
\addbibresource{biblatex-examples.bib}

\makeatletter
\DeclareCiteCommand{\gettitle}
 {}
 {\protected@xdef\currenttitle{\thefield{title}}}%
 {}{}
\makeatother

\begin{document}
abc
\clearpage
\sbox0{\gettitle{gillies}}
\end{document}

我使用了\protected@xdef而不是\gdef,原因应该很明显。

确实,如果我在答案\show\currenttitle之前加上\end{document}

> \currenttitle=macro:
->\thefield {title}.

如果\gdef使用(这是显而易见的)。如果\currenttitle使用,则会引发错误:

! Undefined control sequence.
\currenttitle ->\thefield
                          {title}

如果\protected@xdef使用,终端上的输出是

> \currenttitle=macro:
->Herder and the Preparation of Goethe's Idea of World Literature.

这可能是预期的结果,因为\thefield当它a 含义,使用当前参考键。

围绕的宏\sbox0将是

\documentclass{article}
\usepackage{biblatex}
\addbibresource{biblatex-examples.bib}

\makeatletter
\DeclareCiteCommand{\gettitle@aux}
 {}
 {\protected@xdef\currenttitle{\thefield{title}}}%
 {}{}
\newcommand\gettitle[1]{{\sbox0{\gettitle@aux{#1}}}}
\makeatother

\begin{document}
abc
\clearpage
\gettitle{gillies}
\end{document}

额外的括号可以避免\gettitle干扰使用宏的可能性\box0

相关内容