
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}
Porém, beamer
nisso não funciona, a redefinição de \mkblockquote
não tem efeito, pelo que posso ver. Existe alguma maneira de fazer isso funcionar em um beamer
quadro também?
MWE, observe a posição de(Algum cara)em comparação com o exemplo article
acima:
\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}
(A propósito, é claro que sei que não preciso csquotes
fazer uma citação como essa, então uma resposta que diga algo como"livre-se do \blockquote
e use \lipsum*[2]\par\hfill(Some Bloke)
"não é tão interessante.)
Responder1
Isto ocorreu devido a um bug csquotes
que 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 \tracingall
ou colocação de um 'marcador' dentro dele \mkblockquote
revelará que ele nunca é executado no beamer
caso. A razão é que csquotes
verifica 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 \hbox
e (crucialmente) no início de um parágrafo em um \vbox
ou \vtop
. (TeX está no modo horizontal restrito e no modo vertical restrito, respectivamente.) Os quadros são criados beamer
como caixas verticais, portanto o primeiro material colocado no quadro tem exatamente a última condição. Isso significa que ele csquotes
vê 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 article
caso, TeX está emirrestritomodo vertical (a lista vertical principal) quando \blockquote
encontrado \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 \parbox
e semelhante ativo conforme definido no csq@parbox
, enquanto beamer
usa um 'bruto' \vbox
para quadros, agora funciona como para a lista vertical principal.
Pode-se usar etoolbox
para corrigir o código defeituoso enquanto aguarda uma atualização:
\makeatletter
\patchcmd{\csq@bquote}{\ifbool{inner}}{\ifboolexpr{ bool {inner} and bool {hmode} }}
{}{}
\makeatother