csquotes と beamer: 引用ブロックを別の行に右揃えで表示する

csquotes と beamer: 引用ブロックを別の行に右揃えで表示する

では csquotes、(オプションの)引用は、\blockquoteデフォルトでは引用文の直後に配置されます。引用文を次の行に右詰めで配置したい場合は、次のようにします。

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

これは標準クラスでは問題なく動作します:

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

ここに画像の説明を入力してください

しかし、 ではbeamerこれは機能せず、 の再定義は、\mkblockquote私が見る限り効果がありません。 これをフレームでbeamerも機能させる方法はありますか?

MWE、位置に注意(ある男)上記の例と比較するとarticle:

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

ここに画像の説明を入力してください

(ところで、もちろん私はcsquotesそのような引用をする必要がないことはわかっているので、「捨てて\blockquote使う\lipsum*[2]\par\hfill(Some Bloke)それほど面白くないです。

答え1

csquotesこれは、で修正されたバグによるものです。バージョン 5.2a(リリース日 2017-02-03)。5.2a より前のリリースの分析と回避策は次のとおりです。


を適用する\tracingallか、内部に「マーカー」を配置すると、\mkblockquoteこのケースでは実行されないことがわかります。これは、 が、TeX が の一部として表示資料を作成するための「適切な」モードであるかどうかを確認するbeamerためです。このテストが失敗すると、引用はテキスト引用として設定されます。csquotes\blockquote

で使用されるテストはcsquotesプリミティブ であり\ifinner、これはプリミティブ構造の内部および (重要な点として)または\hboxの段落の先頭でtrue になります。(TeX はそれぞれ制限された水平モードと制限された垂直モードです。) フレームは垂直ボックスとして作成されるため、フレームに配置される最初のマテリアルはまさに後者の条件になります。つまり、 はコンテキストを表示に「不適切」と見なし、テキスト ルートに進みます。\vbox\vtopbeamercsquotes

\leavevmode(または他のさまざまな水平モード コマンド)を使用して垂直モードを終了し、制限のない水平モードに切り替えると、問題が解決します。

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

このarticle場合、TeXは無制限垂直モード (メインの垂直リスト)\blockquoteに遭遇した場合は\ifinnerfalse となり、ブロック引用ルートが選択されます。


欠陥のあるコードは

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

ここで、欠陥のある線は です\ifbool{inner}。前述のように、これは水平モードと垂直モードの両方のボックスで当てはまります。 を に置き換えます。

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

これは、 の内部でのみ当てはまるため、修正されました\hbox。この修正により、 と の内部で文書化された動作が\parbox、 を設定するのと同様にアクティブになりcsq@parbox、 はフレームにbeamer「raw」を使用する\vboxため、メインの垂直リストの場合と同様に機能するようになりました。

etoolboxアップデートを待つ間に欠陥のあるコードを修正するには、次の方法を使用できます。

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

関連情報