
Mit wird csquotes
das (optionale) Zitat eines langen Textes \blockquote
standardmäß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}
beamer
Dies funktioniert jedoch nicht, die Neudefinition \mkblockquote
hat meines Erachtens keine Auswirkungen. Gibt es eine Möglichkeit, dies beamer
auch in einem Frame zum Laufen zu bringen?
MWE, notieren Sie die Position von(Irgendein Typ)im Vergleich zum article
obigen 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}
(Übrigens weiß ich natürlich, dass ich csquotes
so ein Zitat nicht machen muss, also eine Antwort, die so etwas sagt wie"verschwinde \blockquote
und benutze \lipsum*[2]\par\hfill(Some Bloke)
"ist nicht so interessant.)
Antwort1
Dies war auf einen Fehler zurückzuführen, csquotes
der 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 \tracingall
oder das Platzieren eines „Markers“ darin \mkblockquote
zeigt, dass es in diesem beamer
Fall 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 csquotes
ist das primitive \ifinner
, das innerhalb der primitiven Konstrukte \hbox
und (entscheidend) am Anfang eines Absatzes in einem \vbox
oder zutrifft \vtop
. (TeX befindet sich im eingeschränkten horizontalen bzw. eingeschränkten vertikalen Modus.) Rahmen werden in beamer
als vertikale Kästen erstellt, sodass das erste im Rahmen platzierte Material genau die letztere Bedingung erfüllt. Dies bedeutet, dass csquotes
den 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 article
Fall ist TeX inuneingeschränktDer vertikale Modus (die wichtigste vertikale Liste) ist, wenn \blockquote
er angetroffen wird, \ifinner
falsch 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 \parbox
und ähnlich aktiv, wenn sie das festlegen csq@parbox
, während as beamer
ein „Raw“ \vbox
für Frames verwendet, funktioniert es jetzt als - für die vertikale Hauptliste.
Man könnte etoolbox
den defekten Code patchen, während man auf ein Update wartet:
\makeatletter
\patchcmd{\csq@bquote}{\ifbool{inner}}{\ifboolexpr{ bool {inner} and bool {hmode} }}
{}{}
\makeatother