Комбинируйте метки и allowframebreaks в классе beamer

Для своих презентаций с использованием латексного луча я использовал систему маркировки с короткими, длинными и тем и другим, чтобы быстро переключаться между короткими и более длинными презентациями.

Для этого я использую код \includeonlyframes{both,short} (для короткой презентации и аналогично \includeonlyframes{both,long} для длинной) в преамбуле и помещаю метку для каждого слайда следующим образом:

\begin{frame}[label=both]

В прошлом эта система служила мне относительно хорошо, но она также создала некоторые проблемы. В частности, я пытаюсь решить, что мои ссылки превышают один слайд. Я попытался использовать allowframebreaks для решения этой проблемы, поэтому вот код для моего справочного слайда:

\begin{frame}[allowframebreaks,label=both]    
\frametitle{References}

\tiny    
    \bibliographystyle{apalike}    
    \bibliography{references}

\end{frame}

Что происходит сейчас, так это то, что первый справочный слайд отображается должным образом, но остальные не являются частью pdf. Я предполагаю, что происходит то, что метка применяется только к первому слайду, поэтому из-за моей команды \includeonlyframes в преамбуле остальные справочные слайды создаются, но не включаются в pdf. Есть ли у кого-нибудь идеи, как я могу обойти эту проблему?

Кроме того, это мой первый пост, поэтому, пожалуйста, дайте мне знать, если что-то неясно / плохо объяснено и т. Д.

Изменить: вот минимальный рабочий пример. Обычно я использую natbib, но это не работает с примером библиографии, который я использовал здесь. Проблема все еще возникает, поэтому я не думаю, что natbib имеет к ней какое-то отношение.

\documentclass{beamer} 
%\usepackage{natbib}
\includeonlyframes{both,short}

\begin{document}

\begin{frame}[label=both] 
\frametitle{Frametitle} 
Some content for both presentations 
\end{frame}

\begin{frame}[label=short] 
\frametitle{Frametitle}
Some content for a short presentation 
\end{frame}

\begin{frame}[label=long] 
\frametitle{Frametitle}
Some content for a long presentation 
\end{frame}

\begin{frame}[label=long] 
\frametitle{Frametitle}
Some more content for a long presentation 
\end{frame}

\begin{frame}[allowframebreaks,label=both] 
\frametitle{References}
 %\tiny 
\nocite{*}
\bibliographystyle{apalike}
%\bibliography{references} \bibliography{xampl}
\end{frame}

\end{document}

person Lukas Altermatt    schedule 13.09.2019    source источник
comment
Не могли бы вы сделать компилируемый минимальный рабочий пример вместо фрагментов кода?   -  person samcarter_is_at_topanswers.xyz    schedule 14.09.2019


Ответы (1)


Вы можете использовать аналогичный подход, как в https://tex.stackexchange.com/a/289637, и обновить его, чтобы использовать текущая реализация \beamer@@@@frame:

\documentclass{beamer}
\makeatletter
\def\beamer@@@@frame<#1>[#2]{%
  \framewidth\textwidth
  \beamer@savemode%
  \gdef\beamer@mode{\mode<all>}%
  \def\beamer@frametemplate{}%
  \def\beamer@againname{}%
  \def\beamer@undolabels{}%
  \def\beamer@cramped{}%
  \def\beamer@displaybreak{}%
  \setbox\beamer@footins=\box\voidb@x%
  \beamer@autobreakcount=0\relax%
  \beamer@autobreaklastheight=16000pt%
  \beamer@zoomcount=0\relax%
  \beamer@noframenumberingfalse%
  \beamer@containsverbatimfalse%
  \beamer@isfragilefalse%
  \beamer@autobreakfalse%
  \beamer@shrinkfalse%
  \beamer@plainframefalse%
  \global\advance\beamer@zoomframecount by1\relax%
  \csname beamer@dosecondmode\beamer@defaultdosecondmode\endcsname%
  \ifbeamer@centered\setkeys{beamerframe}{c}\else\setkeys{beamerframe}{t}\fi%
  \setkeys{beamerframe}{environment=frame}%
  \setkeys{beamerframe}{#2}%
  \beamer@frametemplate%
  \ifbeamer@noframenumbering%
    \ifbeamer@isfragile%Fragile frames will be processed twice
      \stepcounter{framenumber}%
    \fi%
  \else%
    \stepcounter{framenumber}%do not set \label here - it interferes with AtBegin*
  \fi%
  {\let\@elt\beamer@savecounter\beamer@overlaycounterresets}
  \gdef\beamer@framestartpage{}%
  \gdef\beamer@whichframes{#1}%
  \ifx\beamer@framerestriction\@undefined\else% restriction stuff
    \expandafter\beamer@checkifinlist\beamer@framerestriction\relax%
  \fi%
  \ifbeamer@inlecture%
  \else%
    \gdef\beamer@whichframes{all:0}%
  \fi%
  \ifx\beamer@againname\@empty%
    \beamer@slideinframe=0\relax%
    \beamer@anotherslidefalse%
    \beamer@masterdecode{\beamer@whichframes}%
    \ifbeamer@anotherslide%
        \let\beamer@howtotreatframe\beamer@doseveralframes%
      \ifbeamer@containsverbatim%
        \let\beamer@howtotreatframe\beamer@dosingleframe%
      \fi%
      \ifbeamer@autobreak%
        \let\beamer@howtotreatframe\beamer@autobreakframe%
      \fi%
      \ifbeamer@isfragile%
        \let\beamer@howtotreatframe\beamer@doexternalframe%
      \fi%
    \else% no slides in frame
      \let\beamer@howtotreatframe\beamer@donoframe%
    \fi%
  \else% again mode
    \let\beamer@howtotreatframe\beamer@doseveralframes%
    \ifbeamer@isfragile%
      \let\beamer@howtotreatframe\beamer@doexternalframe%
    \fi%
    \ifbeamer@containsverbatim
      \let\beamer@howtotreatframe\beamer@dosingleframe
    \fi
    \beamer@slideinframe=0\relax%
    \beamer@anotherslidefalse%
    {\beamer@masterdecode{\beamer@whichframes}}%
    \message{^^J^^J \beamer@againname:\beamer@whichframes ^^J^^J}
    \ifbeamer@anotherslide%
      \message{^^J^^J \beamer@againname:I am Here ^^J^^J}
      \ifbeamer@autobreak%
        \let\beamer@howtotreatframe\beamer@autobreakframe%
      \fi%
    \fi    
  \fi%
  \beamer@howtotreatframe}
\makeatother

\includeonlyframes{both,long}


\begin{document}

\begin{frame}[allowframebreaks,label=both]   
\nocite{*} 
\frametitle{References}

%\tiny    
    \bibliographystyle{apalike}    
    \bibliography{\jobname}

\end{frame}

\begin{frame}[label=long]
content...
\end{frame}

\end{document}

введите описание изображения здесь

person samcarter_is_at_topanswers.xyz    schedule 16.09.2019
comment
Это выглядит очень далеко от того, что я использую в настоящее время, поэтому, если есть исправление, которое включает меньше изменений, это было бы здорово. - person Lukas Altermatt; 16.09.2019
comment
@LukasAltermatt Можете уточнить, что вы имеете в виду под внешностью, действительно далекой от того, что я использую сейчас? Это слишком много кода или результат не такой, как вы ожидаете? - person samcarter_is_at_topanswers.xyz; 16.09.2019
comment
@LukasAltermatt Что ж, вы хотите изменить какой-то базовый механизм beamer, чтобы добавить то, что было отклонено сопровождающим beamer (github.com/josephwright/beamer/issues/265) Вы должны согласиться с тем, что для этого требуется немного кода. Кстати allowframebrakes это не команда, это ключ - person samcarter_is_at_topanswers.xyz; 17.09.2019
comment
Хорошо, я должен извиниться за то, что не рассмотрел ваш комментарий сегодня утром более внимательно. Я думал, что вы предлагали использовать другой пакет, но теперь я понимаю, что делает код. Я должен сказать, что нужно добавить много кода для чего-то, что в основном меня беспокоило стилистически (все равно никто никогда не смотрит на слайд со ссылками), но это помогает, так что большое спасибо! - person Lukas Altermatt; 17.09.2019
comment
@LukasAltermatt Не нужно извиняться :) По поводу проблемы слайда "никто никогда не смотрит на ссылку": Лично я бы не стал использовать такой слайд, а вместо этого использовал бы пакет biblatex. В нем есть очень полезные команды \footcite и \footfullcite, которые добавят ссылки в виде сноски на упомянутый слайд. - person samcarter_is_at_topanswers.xyz; 17.09.2019
comment
Спасибо за предложение. Я бегло просмотрел пакет biblatex, но, похоже, он требует ряда изменений по сравнению с моим подходом. В моей области (экономика) всегда используется формат "автор-год", иногда расширяемый сокращенным названием журнала, и люди в аудитории будут знать, по какой статье имеется в виду - таким образом, никто не смотрит на справочную страницу. . - person Lukas Altermatt; 17.09.2019