csquotes e beamer: citação para blockquote flush em linha separada

csquotes e beamer: citação para blockquote flush em linha separada

Com csquotes, a citação (opcional) de um longo \blockquoteé, por padrão, colocada imediatamente após a própria citação. Se você quiser ter a citação na próxima linha e alinhada à direita, você pode fazer

\renewcommand{\mkblockquote}[4]{#1#2\par\hfill#4#3}

que funciona bem nas classes padrão:

\documentclass{article}
\usepackage{csquotes,lipsum}
\renewcommand{\mkblockquote}[4]{#1#2\par\hfill#4#3}
\begin{document}
\blockquote[Some Bloke][]{\lipsum*[2]}
\end{document}

insira a descrição da imagem aqui

Porém, beamernisso não funciona, a redefinição de \mkblockquotenão tem efeito, pelo que posso ver. Existe alguma maneira de fazer isso funcionar em um beamerquadro também?

MWE, observe a posição de(Algum cara)em comparação com o exemplo articleacima:

\documentclass{beamer}
\usepackage{csquotes,lipsum}
\renewcommand{\mkblockquote}[4]{#1#2\par\hfill#4#3}
\begin{document}
\begin{frame}
\blockquote[Some Bloke][]{\lipsum*[2]}
\end{frame}
\end{document}

insira a descrição da imagem aqui

(A propósito, é claro que sei que não preciso csquotesfazer uma citação como essa, então uma resposta que diga algo como"livre-se do \blockquotee use \lipsum*[2]\par\hfill(Some Bloke)"não é tão interessante.)

Responder1

Isto ocorreu devido a um bug csquotesque foi corrigido emversão 5.2a(data de lançamento 03/02/2017). Seguem análises e soluções alternativas para a versão anterior à 5.2a.


Uma aplicação \tracingallou colocação de um 'marcador' dentro dele \mkblockquoterevelará que ele nunca é executado no beamercaso. A razão é que csquotesverifica se o TeX está em um modo 'apropriado' para criar material de exibição como parte do \blockquote. Se esse teste falhar, a citação será definida como uma citação textual.

O teste usado por csquotesé o primitivo \ifinner, que é verdadeiro dentro das construções primitivas \hboxe (crucialmente) no início de um parágrafo em um \vboxou \vtop. (TeX está no modo horizontal restrito e no modo vertical restrito, respectivamente.) Os quadros são criados beamercomo caixas verticais, portanto o primeiro material colocado no quadro tem exatamente a última condição. Isso significa que ele csquotesvê o contexto como “não apropriado” para exibição e segue o caminho textual.

Podemos sair do modo vertical para o modo horizontal irrestrito usando \leavevmode(ou uma série de outros comandos do modo horizontal), o que resolverá o problema.

\documentclass{beamer}
\usepackage{csquotes,lipsum}
\renewcommand{\mkblockquote}[4]{#1#2\par\hfill#4#3}
\begin{document}
\begin{frame}
\leavevmode
\blockquote[Some Bloke][]{\lipsum*[2]}
\end{frame}
\end{document}

No articlecaso, TeX está emirrestritomodo vertical (a lista vertical principal) quando \blockquoteencontrado \ifinneré falso e a rota de cotação em bloco é escolhida.


O código defeituoso foi

\long\def\csq@bquote#1#2#3#4#5#6{%
  \csq@ifnested
    {\csq@err@nbquote}
    {\csq@getpunct{%
       \ifbool{inner}
         {\csq@bquote@ii}
     {\ifbool{csdisplay}
        {\csq@bquote@i}
        {\iftoggle{csq@parbox}\csq@bquote@ii\csq@bquote@i}}%
     {#1}{#2}{#3}{#4}{#5}{#6}}}}

onde está a linha com defeito \ifbool{inner}. Conforme observado, isso será verdade tanto nas caixas do modo horizontal quanto no modo vertical. Substituindo por

\ifboolexpr{ bool {inner} and bool {hmode} }

corrige isso, pois agora só é verdade dentro de um arquivo \hbox. A correção torna o comportamento documentado interno \parboxe semelhante ativo conforme definido no csq@parbox, enquanto beamerusa um 'bruto' \vboxpara quadros, agora funciona como para a lista vertical principal.

Pode-se usar etoolboxpara corrigir o código defeituoso enquanto aguarda uma atualização:

\makeatletter
\patchcmd{\csq@bquote}{\ifbool{inner}}{\ifboolexpr{ bool {inner} and bool {hmode} }}
  {}{}
\makeatother

informação relacionada