
Con csquotes
, la cita (opcional) de un texto largo \blockquote
se coloca de forma predeterminada inmediatamente después de la cita misma. Si desea tener la cita en la siguiente línea y al ras a la derecha, puede hacerlo
\renewcommand{\mkblockquote}[4]{#1#2\par\hfill#4#3}
que funciona bien en las clases estándar:
\documentclass{article}
\usepackage{csquotes,lipsum}
\renewcommand{\mkblockquote}[4]{#1#2\par\hfill#4#3}
\begin{document}
\blockquote[Some Bloke][]{\lipsum*[2]}
\end{document}
Sin embargo, beamer
esto no funciona, la redefinición de \mkblockquote
no tiene ningún efecto por lo que puedo ver. ¿Hay alguna forma de hacer que esto funcione beamer
también en un marco?
MWE, nota la posición de(Algún tipo)comparado con el ejemplo article
anterior:
\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}
(Por cierto, por supuesto sé que no necesito csquotes
hacer una cita como esa, por lo que una respuesta que diga algo como"deshazte del \blockquote
y úsalo \lipsum*[2]\par\hfill(Some Bloke)
"no es tan interesante.)
Respuesta1
Esto se debió a un error csquotes
que se solucionó enversión 5.2a(fecha de lanzamiento 2017-02-03). A continuación se incluye un análisis y una solución alternativa para la versión anterior a 5.2a.
Una aplicación \tracingall
o colocación de un 'marcador' en el interior \mkblockquote
revelará que nunca se ejecuta en el beamer
caso. La razón es que csquotes
verifica que TeX esté en un modo "apropiado" para crear material de visualización como parte de \blockquote
. Si esa prueba falla, la cita se establece como una cita textual.
La prueba utilizada por csquotes
es la primitiva \ifinner
, que es verdadera dentro de las construcciones primitivas \hbox
y (crucialmente) al comienzo de un párrafo en a \vbox
or \vtop
. (TeX está en modo horizontal restringido y modo vertical restringido, respectivamente). Los marcos se crean beamer
como cuadros verticales, por lo que el primer material colocado en el marco tiene exactamente la última condición. Esto significa que csquotes
ve el contexto como "no apropiado" para su visualización y sigue la ruta textual.
Podemos salir del modo vertical al modo horizontal sin restricciones usando \leavevmode
(o una variedad de otros comandos del modo horizontal), lo que solucionará el 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}
En el article
caso, TeX está enirrestrictoEl modo vertical (la lista vertical principal) cuando \blockquote
se encuentra \ifinner
es falso y se elige la ruta de cotización en bloque.
El código defectuoso fue
\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}}}}
donde está la línea defectuosa \ifbool{inner}
. Como se señaló, esto será cierto tanto en los cuadros del modo horizontal como en el del modo vertical. Reemplazando con
\ifboolexpr{ bool {inner} and bool {hmode} }
soluciona este problema ya que ahora solo es cierto dentro de un archivo \hbox
. La solución activa el comportamiento documentado interno \parbox
y similar a medida que configuran el archivo csq@parbox
, mientras que como beamer
usa un formato "sin formato" \vbox
para los marcos, ahora funciona como para la lista vertical principal.
Se podría utilizar etoolbox
para parchear el código defectuoso mientras se espera una actualización:
\makeatletter
\patchcmd{\csq@bquote}{\ifbool{inner}}{\ifboolexpr{ bool {inner} and bool {hmode} }}
{}{}
\makeatother