csquotes y beamer: cita para blockquote al ras en una línea separada

csquotes y beamer: cita para blockquote al ras en una línea separada

Con csquotes, la cita (opcional) de un texto largo \blockquotese 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}

ingrese la descripción de la imagen aquí

Sin embargo, beameresto no funciona, la redefinición de \mkblockquoteno tiene ningún efecto por lo que puedo ver. ¿Hay alguna forma de hacer que esto funcione beamertambién en un marco?

MWE, nota la posición de(Algún tipo)comparado con el ejemplo articleanterior:

\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}

ingrese la descripción de la imagen aquí

(Por cierto, por supuesto sé que no necesito csquoteshacer una cita como esa, por lo que una respuesta que diga algo como"deshazte del \blockquotey úsalo \lipsum*[2]\par\hfill(Some Bloke)"no es tan interesante.)

Respuesta1

Esto se debió a un error csquotesque 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 \tracingallo colocación de un 'marcador' en el interior \mkblockquoterevelará que nunca se ejecuta en el beamercaso. La razón es que csquotesverifica 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 csquoteses la primitiva \ifinner, que es verdadera dentro de las construcciones primitivas \hboxy (crucialmente) al comienzo de un párrafo en a \vboxor \vtop. (TeX está en modo horizontal restringido y modo vertical restringido, respectivamente). Los marcos se crean beamercomo cuadros verticales, por lo que el primer material colocado en el marco tiene exactamente la última condición. Esto significa que csquotesve 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 articlecaso, TeX está enirrestrictoEl modo vertical (la lista vertical principal) cuando \blockquotese encuentra \ifinneres 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 \parboxy similar a medida que configuran el archivo csq@parbox, mientras que como beamerusa un formato "sin formato" \vboxpara los marcos, ahora funciona como para la lista vertical principal.

Se podría utilizar etoolboxpara parchear el código defectuoso mientras se espera una actualización:

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

información relacionada