我只希望在演示文稿中有引文时才打印参考书目幻灯片。为此,我重新定义了命令\cite
以包含布尔值的切换。我尝试了多个版本来重新定义命令以及定义布尔值的不同方法。重新定义的命令版本包含一个\typeout
用于调试目的的命令,并且如 pdflatex 日志所示触发。尽管如此,下面的 MWE 确实会打印showbib false
,我可能遗漏了一些显而易见的东西,但无法弄清楚。:(如果我在文本中手动切换布尔值,\showbibtrue
它实际上会起作用。
为什么不在\showbibtrue
内部工作\cite
?
值得一提的是,我已经测试过它与 beamer 无关(欢迎随意测试/提供解决方案article
)。
\documentclass{beamer}
\usepackage[utf8]{inputenc}
\usepackage{filecontents}
\begin{filecontents*}{bib.bib}
@misc{foo,
author="foo bar",
title="getting things done",
}
\end{filecontents*}
\let\oldcite\cite
\newif\ifshowbib
\showbibfalse
\renewcommand{\cite}{\showbibtrue\typeout{within cite}\oldcite}
\begin{document}
\begin{frame}{sigh}
\cite{foo}
\end{frame}
\ifshowbib
\begin{frame}[c,allowframebreaks]{Bibliography}
\typeout{showbib true}
showbib true
\bibliography{bib}
\end{frame}
\else
\typeout{showbib false}
showbib false
\fi
\end{document}
答案1
这里的麻烦在于至少在frame
示例的环境中隐含的分组
\renewcommand{\cite}{\global\showbibtrue\typeout{within cite}\oldcite}
作品。
一个基于article
类的非常简单的例子可以避免分组,并且可以不用\global
。
\documentclass{article}
\bibliographystyle{plain}
\let\oldcite\cite
\newif\ifshowbib
\showbibfalse
\renewcommand{\cite}{\showbibtrue\typeout{within cite}\oldcite}
\begin{document}
\cite{doody}
\ifshowbib
showbib true
\bibliography{biblatex-examples}
\else
showbib false
\fi
\end{document}
这是避免修补的替代方法\cite
(与修补的版本相比,它可能需要多运行一次 LaTeX 才能显示参考书目\cite
)。\global
仍然是必需的,因为命令\citation
是从中读取.aux
并在组中执行的。
\documentclass{beamer}
\usepackage[utf8]{inputenc}
\bibliographystyle{plain}
\newif\ifshowbib
\showbibfalse
\def\citation#1{\global\showbibtrue}
\begin{document}
\begin{frame}{sigh}
\cite{doody}
\end{frame}
\ifshowbib
\begin{frame}[c,allowframebreaks]{Bibliography}
\typeout{showbib true}
showbib true
\bibliography{biblatex-examples}
\end{frame}
\else
\typeout{showbib false}
showbib false
\fi
\end{document}