csquotes und beamer: Zitat für Blockzitat rechtsbündig in separater Zeile

csquotes und beamer: Zitat für Blockzitat rechtsbündig in separater Zeile

Mit wird csquotesdas (optionale) Zitat eines langen Textes \blockquotestandardmäßig direkt nach dem Zitat selbst platziert. Wenn Sie das Zitat in der nächsten Zeile und rechtsbündig haben möchten, können Sie Folgendes tun:

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

was in den Standardklassen gut funktioniert:

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

Bildbeschreibung hier eingeben

beamerDies funktioniert jedoch nicht, die Neudefinition \mkblockquotehat meines Erachtens keine Auswirkungen. Gibt es eine Möglichkeit, dies beamerauch in einem Frame zum Laufen zu bringen?

MWE, notieren Sie die Position von(Irgendein Typ)im Vergleich zum articleobigen Beispiel:

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

Bildbeschreibung hier eingeben

(Übrigens weiß ich natürlich, dass ich csquotesso ein Zitat nicht machen muss, also eine Antwort, die so etwas sagt wie"verschwinde \blockquoteund benutze \lipsum*[2]\par\hfill(Some Bloke)"ist nicht so interessant.)

Antwort1

Dies war auf einen Fehler zurückzuführen, csquotesder behoben wurde inVersion 5.2a(Veröffentlichungsdatum 03.02.2017). Es folgen Analyse und Workaround für die Version vor 5.2a.


Eine Anwendung von \tracingalloder das Platzieren eines „Markers“ darin \mkblockquotezeigt, dass es in diesem beamerFall nie ausgeführt wird. Der Grund dafür ist, dass csquotesüberprüft wird, ob sich TeX im Rahmen von in einem „geeigneten“ Modus zum Erstellen von Anzeigematerial befindet \blockquote. Wenn dieser Test fehlschlägt, wird das Zitat als Textzitat festgelegt.

Der von verwendete Test csquotesist das primitive \ifinner, das innerhalb der primitiven Konstrukte \hboxund (entscheidend) am Anfang eines Absatzes in einem \vboxoder zutrifft \vtop. (TeX befindet sich im eingeschränkten horizontalen bzw. eingeschränkten vertikalen Modus.) Rahmen werden in beamerals vertikale Kästen erstellt, sodass das erste im Rahmen platzierte Material genau die letztere Bedingung erfüllt. Dies bedeutet, dass csquotesden Kontext als „nicht geeignet“ für die Anzeige ansieht und den Textweg wählt.

Wir können den vertikalen Modus mithilfe von \leavevmode(oder einer Reihe anderer Befehle für den horizontalen Modus) verlassen und in den uneingeschränkten horizontalen Modus wechseln. Dadurch wird das Problem behoben.

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

In diesem articleFall ist TeX inuneingeschränktDer vertikale Modus (die wichtigste vertikale Liste) ist, wenn \blockquoteer angetroffen wird, \ifinnerfalsch und die Blockzitatroute wird gewählt.


Der fehlerhafte Code war

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

wo die fehlerhafte Linie ist \ifbool{inner}. Wie bereits erwähnt, gilt dies sowohl für horizontale als auch für vertikale Boxen. Ersetzen durch

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

behebt dies, da es jetzt nur innerhalb eines zutrifft \hbox. Der Fix macht das dokumentierte Verhalten innerhalb \parboxund ähnlich aktiv, wenn sie das festlegen csq@parbox, während as beamerein „Raw“ \vboxfür Frames verwendet, funktioniert es jetzt als - für die vertikale Hauptliste.

Man könnte etoolboxden defekten Code patchen, während man auf ein Update wartet:

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

verwandte Informationen