使用 时 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
将显示它从未在案例中执行beamer
。原因是csquotes
检查 TeX 是否处于“适当”模式以创建显示材料作为 的一部分\blockquote
。如果该测试失败,则将引用设置为文本引用。
使用的测试csquotes
是原始的\ifinner
,它在原始构造中为真,并且在或\hbox
中段落的开头(至关重要)为真。(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
使用“原始”时\vbox
,它现在可作为主垂直列表使用。
etoolbox
在等待更新时,可以用来修补有缺陷的代码:
\makeatletter
\patchcmd{\csq@bquote}{\ifbool{inner}}{\ifboolexpr{ bool {inner} and bool {hmode} }}
{}{}
\makeatother