通过挂接 \cite 来切换布尔值,有条件地打印参考书目

通过挂接 \cite 来切换布尔值,有条件地打印参考书目

我只希望在演示文稿中有引文时才打印参考书目幻灯片。为此,我重新定义了命令\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}

相关内容