几何包正在拉伸我的引用块

几何包正在拉伸我的引用块

我无法理解如何解决这个问题。

我有一个用于块引用的 latex 命令,是我在这个网站的其他地方找到的。但是,我想引用的句子被拉长到两行。我发现 geometry 包在这方面发挥了一定作用。

\documentclass [10.5pt]{book}

\usepackage{geometry}

\usepackage{csquotes}
\usepackage{xcolor}


% https://tex.stackexchange.com/questions/16964/block-quote-with-big-quotation-marks
\newcommand{\quotebox}[2]{
    \begin{center}\fcolorbox{white}{blue!15!gray!15}{
        \begin{minipage}{0.95\linewidth}\vspace{10pt}
            \center
            \begin{minipage}{0.95\linewidth}
                {\space\Huge``}{#1}{\hspace{1.5em}\break\null\Huge\hfill''}
            \end{minipage}
            \smallbreak {#2}
        \end{minipage}}
    \end{center}
}

\begin{document}

\quotebox{Usually one approaches an optimization problem presupposing that $x^\star$ exists, is unique, and is located by the method to be used.}{R. Fletcher, \textit{Practical optimization methods}}


\end{document}

输出为:

在此处输入图片描述

我希望得到类似这样的内容(我可以在此代码片段中不使用几何包来获得它,但我希望能够使用几何包强制执行这样的输出。

在此处输入图片描述

如何避免这种拉伸?

答案1

首先,诊断

你认为geometry应该受到指责的想法不是完全正确。这样geometry做只会加剧问题,而这个问题在原始代码中已经存在。

考虑以下代码

\documentclass{book}

%\usepackage{geometry}

\usepackage{csquotes}
\usepackage{xcolor}


% https://tex.stackexchange.com/questions/16964/block-quote-with-big-quotation-marks
\newcommand{\quotebox}[2]{
    \begin{center}\fcolorbox{white}{blue!15!gray!15}{
        \begin{minipage}{0.95\linewidth}\vspace{10pt}
            \center
            \begin{minipage}{0.95\linewidth}
                {\space\Huge``}{#1}{\hspace{1.5em}\break\null\Huge\hfill''}
            \end{minipage}
            \smallbreak {#2}
        \end{minipage}}
    \end{center}
}

\begin{document}

\quotebox{Cogito ergo sum.}{R. Descartes}

\quotebox{Usually one approaches an optimization problem presupposing that $x^\star$ exists, is unique, and is located by the method to be used.}{R. Fletcher, \textit{Practical optimization methods}}


\end{document}

这里,geometry是无效的,但是你仍然会看到第一个引号中可怕的拉伸。

在此处输入图片描述

所做geometry的就是改变边距大小(加载的默认值geometry显然与标准类中的默认值不同book),因此有的值比没有的值\linewidth更长geometry。因此,虽然您的引用恰好有一个很好的长度当使用标准book线宽显示时,使用 给出的新线宽看起来很糟糕geometry

那么实际问题是什么?

\break问题在于你的 定义中的调用。我认为quotebox的使用是\break故意的, 作为它的功能之一是插入换行符强制其前面的行对齐,插入单词间空格。现在,如果你引用了一段较长的文本,比如你抄袭的答案,通常有足够多的单词,因此在这里或那里插入一点点胶水就可以使强制对齐看起来不错。

(在代码中,它强制 [连同对 的调用\hspace{1.5em}],“引用段落”的最后一行在距右侧恰好 1.5em 处结束。)

然而,当你有一个较短的段落或句子时,这种强制的对齐方式会看起来很糟糕。

如果你不介意结束引号符号可能离引号本身的末尾稍远,那么一个选择是用 替换\break\par例如

\newcommand{\quotebox}[2]{
    \begin{center}\fcolorbox{white}{blue!15!gray!15}{
        \begin{minipage}{0.95\linewidth}\vspace{10pt}
            \center
            \begin{minipage}{0.95\linewidth}
                    {\space\Huge``}{#1}{\hspace{1.5em}\par\vspace{-0.5em} ~\Huge\hfill''}
            \end{minipage}
            \smallbreak {#2}
        \end{minipage}}
    \end{center}
}

这会产生更像 在此处输入图片描述 通过在末尾用空格替换它来“解决”拉伸问题。

替代

现在,我恰好喜欢您展示的原始代码所提供的“平衡”外观。解决此问题的一种方法是使引文的宽度和阴影框的宽度可配置。

这显然需要对最佳宽度进行一些手动调整(如果您省略可选参数,则使用您共享的代码中的原始默认值)。但如果你喜欢平衡的外观,这种调整可能是值得的。(这仅适用于较短的引文。)

\documentclass{book}

\usepackage{geometry}

\usepackage{csquotes}
\usepackage{xcolor}


\makeatletter
\newlength\@OuterQuoteBoxWidth
\newlength\@InnerQuoteBoxWidth
% Replace the old version with configurable widths
\NewDocumentCommand{\@quotebox}{+m m}{%
        \begin{center}\fcolorbox{white}{blue!15!gray!15}{
                \begin{minipage}{\@OuterQuoteBoxWidth}\vspace{10pt}
                        \center
                        \begin{minipage}{\@InnerQuoteBoxWidth}
                                {\space\Huge``}{#1}{\hspace{1.5em}\break\null\Huge\hfill''}
                        \end{minipage}
                        \smallbreak {#2}
                \end{minipage}}
        \end{center}
}
% Version to use: 4 arguements
% 1 - width of outerbox (optional: default to 0.95 linewidth)
% 2 - width of quote (optional: default to 0.95 of #1)
% 3 - quote    4 - source
\NewDocumentCommand{\quotebox}{O{0.95\linewidth} o +m m}{
        \setlength\@OuterQuoteBoxWidth{#1}
        \IfNoValueTF{#2}
        {\setlength\@InnerQuoteBoxWidth{0.95\@OuterQuoteBoxWidth}}
        {\setlength\@InnerQuoteBoxWidth{#2}}
        \@quotebox{#3}{#4}
}
\makeatother

\begin{document}

\quotebox[1.5in]{Cogito ergo sum.}{R. Descartes}

\quotebox[2.5in][1.4in]{Cogito ergo sum.}{R. Descartes, \textit{Discourse on Method}}

\quotebox[0.8\linewidth]{Usually one approaches an optimization problem presupposing that $x^\star$ exists, is unique, and is located by the method to be used.}{R. Fletcher, \textit{Practical optimization methods}}


\quotebox[0.95\linewidth][0.8\linewidth]{Usually one approaches an optimization problem presupposing that $x^\star$ exists, is unique, and is located by the method to be used.}{R. Fletcher, \textit{Practical optimization methods}}
\end{document}

在此处输入图片描述

其他的建议

  • 请注意,[10.5pt]对于标准文档类来说毫无意义:唯一有意义的字体大小是 10pt、11pt 和 12pt。

答案2

对于长文本,可以使用或类似的方法在视觉上平衡引号与文本tabular;短文本可以切换到其自然宽度。

这里,以 expl3 为例:

我思

ETC。

Expl3 可以使用键,因此几乎任何事物都可以成为选项设置参数,但在某些时候,它们相互作用的组合和排列的数量变得如此之大,以至于普通人的头脑无法轻易地一次性掌握它们。

tcolorbox但是,由于它使用了 TikZ,因此功能更强大。

平均能量损失

\documentclass{book}

\usepackage{geometry}

\usepackage{csquotes}
\usepackage{xcolor}
\usepackage{xparse}
\usepackage{fontspec}
\newfontfamily\fnserif{Noto Serif}


\ExplSyntaxOn

\keys_define:nn { pdqb }
{
framecolour .tl_set:c = { l_pd_framecolour_tl },
framecolour .default:n = { blue }, % name only is given
framecolour .initial:n = { blue },   % no key
%
frameboxcolour .tl_set:c = { l_pd_frameboxcolour_tl },
frameboxcolour .default:n = { blue!15!green!5 }, 
frameboxcolour .initial:n = { blue!15!green!5 },  
%
outermpwidth .dim_set:c = { l_pd_outermpwidth_dim },
outermpwidth .default:n = { 0.95\linewidth }, 
outermpwidth .initial:n = { 0.95\linewidth },  
%
innermpwidth .dim_set:c = { l_pd_innermpwidth_dim },
innermpwidth .default:n = { 0.95\linewidth }, 
innermpwidth .initial:n = { 0.95\linewidth },  
%
usephrasewidth .bool_set:c = { l_pd_usephrasewidth_bool },
usephrasewidth .default:n = { false }, 
usephrasewidth .initial:n = { false },  
%
usephraseouterwidth .bool_set:c = { l_pd_usephraseouterwidth_bool },
usephraseouterwidth .default:n = { false }, 
usephraseouterwidth .initial:n = { false },  
%
topmargin .dim_set:c = { l_pd_topmargin_dim },
topmargin .default:n = { 10pt }, 
topmargin .initial:n = { 10pt },  
%
bottommargin .dim_set:c = { l_pd_bottommargin_dim },
bottommargin .default:n = { 10pt }, 
bottommargin .initial:n = { 10pt },  
%
middlemargin .dim_set:c = { l_pd_middlemargin_dim },
middlemargin .default:n = { 10pt }, 
middlemargin .initial:n = { 10pt },  
%
middlebreak .tl_set:c = { l_pd_middlebreak_tl },
middlebreak .default:n = { \smallbreak }, 
middlebreak .initial:n = { \smallbreak },  
%
lqformat .tl_set:c = { l_pd_lqformat_tl },
lqformat .default:n = { \Huge }, 
lqformat .initial:n = { \Huge },  
%
rqformat .tl_set:c = { l_pd_rqformat_tl },
rqformat .default:n = { \Huge }, 
rqformat .initial:n = { \Huge },  
%
lqmark .tl_set:c = { l_pd_lqmark_tl },
lqmark .default:n = { `` }, 
lqmark .initial:n = { `` },  
%
rqmark .tl_set:c = { l_pd_rqmark_tl },
rqmark .default:n = { '' }, 
rqmark .initial:n = { '' },  
%
leftouterformat .tl_set:c = { l_pd_leftouterformat_tl },
leftouterformat .default:n = { \begin{center} }, 
leftouterformat .initial:n = { \begin{center} },  
%
rightouterformat .tl_set:c = { l_pd_rightouterformat_tl },
rightouterformat .default:n = { \end{center} }, 
rightouterformat .initial:n = { \end{center} },  
%
leftinnerformat .tl_set:c = { l_pd_leftinnerformat_tl },
leftinnerformat .default:n = { \center }, 
leftinnerformat .initial:n = { \center },  
%
rightinnerformat .tl_set:c = { l_pd_rightinnerformat_tl },
rightinnerformat .default:n = {  }, 
rightinnerformat .initial:n = {  },  
%
leftsourceformat .tl_set:c = { l_pd_leftsourceformat_tl },
leftsourceformat .default:n = {  }, 
leftsourceformat .initial:n = {  },  
%
rightsourceformat .tl_set:c = { l_pd_rightsourceformat_tl },
rightsourceformat .default:n = {  }, 
rightsourceformat .initial:n = {  },  
%
boxrule .dim_set:c = { l_pd_boxrule_dim },
boxrule .default:n = { 0.2pt }, 
boxrule .initial:n = { 0.2pt },  
%
boxsep .dim_set:c = { l_pd_boxsep_dim },
boxsep .default:n = { 3pt }, 
boxsep .initial:n = { 3pt },  
%
leftquoteformat .tl_set:c = { l_pd_leftquoteformat_tl },
leftquoteformat .default:n = {  }, 
leftquoteformat .initial:n = {  },  
%
rightquoteformat .tl_set:c = { l_pd_rightquoteformat_tl },
rightquoteformat .default:n = {  }, 
rightquoteformat .initial:n = {  },  
}


\tl_new:N \l_pd_thequote_tl
%-----------------------------
    \cs_set:Npn \pd_funcqbox:nn #1#2 { 
                \bool_if:cTF
                            { l_pd_usephrasewidth_bool }
                            {
                \tl_set:Nn 
                        \l_pd_thequote_tl
                        {
%                            \begin{tabular}{ccc}
                                {
                                    \tl_use:c { l_pd_lqformat_tl }
                                    \tl_use:c { l_pd_lqmark_tl }
                                    }
%                           &       
                                { 
%                                \begin{minipage}{0.82\linewidth}
                                \tl_use:c { l_pd_leftquoteformat_tl }   
                                { #1 }
                                \tl_use:c { l_pd_rightquoteformat_tl }  
%                                    \end{minipage} 
                                 }
%                           &     
                                {
                                        \tl_use:c { l_pd_rqformat_tl }
                                        \tl_use:c { l_pd_rqmark_tl }
                                }
%                          \\ 
%                          \end{tabular}      
                        }
                        }%T bool
                        {
                \tl_set:Nn 
                        \l_pd_thequote_tl
                        {
                             \begin{tabular}{ccc}
                                {
                                    \tl_use:c { l_pd_lqformat_tl }
                                    \tl_use:c { l_pd_lqmark_tl }
                                    }
                           &        
                                { 
                                \begin{minipage}{0.82\linewidth}
                                \tl_use:c { l_pd_leftquoteformat_tl }   
                                { #1 }
                                \tl_use:c { l_pd_rightquoteformat_tl }  
                                 \end{minipage} 
                                 }
                           &     
                                {
                                        \tl_use:c { l_pd_rqformat_tl }
                                        \tl_use:c { l_pd_rqmark_tl }
                                }
                          \\ 
                          \end{tabular}      
                        }
                        }%F bool


                %--- inner
                \bool_if:cT
                            { l_pd_usephrasewidth_bool }
                            {
                                \tl_set:Nn 
                                        \l_tmpa_tl
                                        { 
                                                \tl_use:N 
                                                        \l_pd_thequote_tl
                                         }
                                \hbox_set:Nn 
                                        \l_tmpa_box
                                        { \l_tmpa_tl }
                                \dim_set:cn 
                                        { l_pd_innermpwidth_dim }
                                        {
                                            \box_wd:N \l_tmpa_box
                                        }
                            }
                %--- outer
                \bool_if:cT
                            { l_pd_usephraseouterwidth_bool }
                            {
                                \tl_set:Nn 
                                        \l_tmpa_tl
                                        { 
                                                \tl_use:N 
                                                        \l_pd_thequote_tl
                                         }
                                \hbox_set:Nn 
                                        \l_tmpa_box
                                        { \l_tmpa_tl }
                                \dim_set:cn 
                                        { l_pd_outermpwidth_dim }
                                        {
                                            \box_wd:N \l_tmpa_box
                                            + 4em
                                        }
                            }
                %===            
                \group_begin:
                
                        \setlength{\fboxrule}{ \dim_use:c { l_pd_boxrule_dim } }
                        \setlength{\fboxsep}{ \dim_use:c { l_pd_boxsep_dim } }

        \tl_use:c { l_pd_leftouterformat_tl }
                    \fcolorbox
                                { \tl_use:c { l_pd_framecolour_tl } }
                                { \tl_use:c { l_pd_frameboxcolour_tl } }
                                {
                \begin{minipage}
                        { \dim_use:c { l_pd_outermpwidth_dim } }
                        \vspace{ \dim_use:c { l_pd_topmargin_dim } }
                        \tl_use:c { l_pd_leftinnerformat_tl }
                        \begin{minipage}
                                    { \dim_use:c { l_pd_innermpwidth_dim } }
                                                                        \tl_use:N
                                                                                    \l_pd_thequote_tl
                        \end{minipage}
                        \tl_use:c { l_pd_rightinnerformat_tl }
                        
                                                    \tl_use:c { l_pd_middlebreak_tl }
                                                    
                                                            \tl_use:c { l_pd_leftsourceformat_tl }
                        {#2}
                       \tl_use:c { l_pd_rightsourceformat_tl } 
                        
                        \vspace{ \dim_use:c { l_pd_bottommargin_dim } }
                \end{minipage}}
        \tl_use:c { l_pd_rightouterformat_tl }
        \group_end:
}

\NewDocumentCommand{\pdquotebox}{ o +m +m  }{
        %---
        
        \group_begin:
      \IfNoValueF { #1 }
    {
        \keys_set:nn { pdqb } { #1 } 
        }

            \pd_funcqbox:nn { #2 } { #3 }
            \group_end:     
}


\ExplSyntaxOff



\begin{document}

\pdquotebox[
usephrasewidth=true,
usephraseouterwidth=true,
%middlebreak={\\ \vspace{0pt}},
%rqformat={\color{red}},
%rqmark={ \ xxx },
%leftouterformat={\itshape\Large},
%rightouterformat={\upshape\normalsize},
leftinnerformat={\Large\itshape},
rightinnerformat={\upshape\normalsize},
leftsourceformat={\hfill\fnserif\bfseries\scshape\colorbox{yellow}},
leftquoteformat={\colorbox{red!5}},
boxrule={4pt},
frameboxcolour={green!32!yellow!10!red!2},
%outermpwidth={0.45\linewidth},
]{Cogito ergo sum.}{Descartes}



\pdquotebox[innermpwidth={0.72\linewidth}]{Usually one approaches an optimization problem presupposing that $x^\star$ exists, is unique, and is located by the method to be used.}{R. Fletcher, \textit{Practical optimization methods}}

\pdquotebox[
usephrasewidth=true,
leftsourceformat={\hfill},
leftquoteformat={\color{blue}},
leftinnerformat={},
framecolour={white},
]{Cogito ergo sum.}{Descartes}


\end{document}

相关内容