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年2月3日)。 5.2a 之前版本的分析和解決方法如下。


應用\tracingall或在內部放置“標記”\mkblockquote將表明它從未在該beamer情況下執行。原因是csquotes檢查 TeX 是否處於“適當”模式來創建顯示材料作為\blockquote.如果該測試失敗,則引用將設定為文字引用。

使用的測試csquotes是原語\ifinner,在原語構造內部以及(至關重要的) a或\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

相關內容