csquotes 和 beamer:blockquote 的引用在单独的行上向右对齐

csquotes 和 beamer:blockquote 的引用在单独的行上向右对齐

使用 时 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\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遇到时\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

相关内容