我无法理解如何解决这个问题。
我有一个用于块引用的 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}