Как можно выровнять ссылку на цитату по правому краю, на той же строке, что и сама цитата, если это возможно?

Как можно выровнять ссылку на цитату по правому краю, на той же строке, что и сама цитата, если это возможно?

Часто цитаты оформляются с указанием источника, выровненным по правому краю:

Цитата с указанием источника, выровненного по правому краю, на строке под цитатой

Атрибуция находится на новой строке после цитаты. Предположим, однако, что на последней строке цитаты достаточно пустого места для размещения атрибуции. Тогда мы можем захотеть, чтобы она была на той же строке, чтобы избежать избыточного пробела.

Цитата с выровненным по правому краю источником на той же строке

Мы хотели бы определить команду (назовем ее 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}

Связанный контент