
では 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
\vtop
beamer
csquotes
\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
に遭遇した場合は\ifinner
false となり、ブロック引用ルートが選択されます。
欠陥のあるコードは
\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