Часто цитаты оформляются с указанием источника, выровненным по правому краю:
Атрибуция находится на новой строке после цитаты. Предположим, однако, что на последней строке цитаты достаточно пустого места для размещения атрибуции. Тогда мы можем захотеть, чтобы она была на той же строке, чтобы избежать избыточного пробела.
Мы хотели бы определить команду (назовем ее quoteattr
), которая вычисляет, подойдет ли цитата, и автоматически размещает ее соответствующим образом.
Код без определения команды:
\documentclass[12pt]{book}
\begin{document}
\quoteattr{Early to bed and early to rise,\\
Makes a man healthy, wealthy, and wise.}{Benjamin Franklin, 1706--1790}
\quoteattr{Seek not the favor of the multitude; it is seldom got by honest and lawful means. But seek the testimony of few; and number not voices, but weigh them.}{Immanuel Kant, 1724--1804}
\end{document}
решение1
Похоже, что данный tabto
пакет может помочь в этом отношении.
\documentclass[12pt]{book}
\usepackage{tabto}
\def\quoteattr#1#2{\setbox0=\hbox{#2}#1\tabto{\dimexpr\linewidth-\wd0}\box0}
\parskip 1em
\begin{document}
\quoteattr{Early to bed and early to rise,\\
Makes a man healthy, wealthy, and wise.}{Benjamin Franklin, 1706--1790}
\quoteattr{Seek not the favor of the multitude; it is seldom got by honest and lawful means. But seek the testimony of few; and number not voices, but weigh them.}{Immanuel Kant, 1724--1804}
\quoteattr{In attempting to make this not give enough space... Seek not the favor of the multitude; it is seldom got by honest and lawful means. But seek the testimony of few; and number not voices, but weigh them.}{Immanuel Kant, 1724--1804}
\end{document}
решение2
Это можно сделать классическим способом TeX с помощью макросаTeXBook, стр. 106, просто играя со штрафами, пропусками и ящиками:
\def\signed #1 (#2){{\unskip\nobreak\hfil\penalty50
\hskip2em\hbox{}\nobreak\hfil\sl#1\/ \rm(#2)
\parfillskip=0pt \finalhyphendemerits=0 \par}}
Это позволит вам вводить ваши расценки следующим образом:
\begin{quote}Here is one way to solve the problem.
\signed Donald E. Knuth (Berkeley, CA)
\end{quote}
Если есть место для 2em и подписи на той же строке, то это так; в противном случае это переходит на новую строку. Конечно, возможно, вы просто хотите имя, а не имя и местоположение, или, возможно, вы просто хотите, чтобы это было немного больше в стиле LaTeX; в этом случае вы можете сделать что-то вроде этого:
\def\signed#1{{\unskip\nobreak\hfil\penalty50
\hskip2em\hbox{}\nobreak\hfil\sl#1
\parfillskip=0pt \finalhyphendemerits=0 \par}}
И вы вводите его так же, как и выше, но \signed{Donald E. Knuth}
вместо этого используйте .
решение3
Для реализации этого мы будем использовать \newsavebox
для поиска длины заполнения пустой строки. Мы не можем использовать \hfill
, так как это всегда имеет номинальную длину 0. Вместо этого мы будем использовать пакет linegoal
.
Мы также будем использовать , xifthen
чтобы записать условие.
Потребуется два прохода.
\documentclass[12pt]{book}
\usepackage{linegoal}
\usepackage{xifthen}
\newsavebox{\quotebox}
\newlength{\emptywidth}% To save the length of empty space
\newlength{\attrwidth}% To save the length of the attribution
% Define the new command
\newcommand{\quoteattr}[2]{
\begin{quote}#1%
\begin{lrbox}{\quotebox}\hspace{\linegoal}\end{lrbox}
\setlength{\emptywidth}{\linegoal}
\settowidth{\attrwidth}{\textit{#2}}
% The following line can be tweaked to force attributions
% onto a new line if it would be a very tight squeeze
\addtolength{\attrwidth}{0em}
% Compare the two widths.
\ifthenelse{\lengthtest{\emptywidth>\attrwidth}}
% If it fits:
{\null\hfill\textit{#2}}
% If it doesn't:
% We need to provide a stretch in this way because TeX
% might compress a slightly-too-long line to prevent
% a loose line followed by a lonely word. However, then
% on the next run, TeX won't compress it because of the
% following text on a new line.
{\hspace{0pt plus \textwidth minus 3pt}\null\nopagebreak\linebreak\null\hfill{\textit{#2}}}%
% For debugging, display the lengths.
Empty space: \the\emptywidth
\\Attribution space: \the\attrwidth
\end{quote}
}
\begin{document}
\quoteattr{Early to bed and early to rise,\\
Makes a man healthy, wealthy, and wise.}{Benjamin Franklin, 1706--1790}
\quoteattr{Seek not the favor of the multitude; it is seldom got by honest and lawful means. But seek the testimony of few; and number not voices, but weigh them.}{Immanuel Kant, 1724--1804}
\end{document}