我正在尝试从 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
:我只是使用了一些无意义的代码,通常不会启动页面。\sbox
in 是一个想法,但在我的实际代码中,我在代码中还有一个,\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 更改。但我不知道如何检查页面是否由\leavevmode
cite 命令启动(因此可以丢弃)或者页面上是否有一些“正常”文本。
答案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
。