如果没有空间,将右对齐的文本移至下一行

如果没有空间,将右对齐的文本移至下一行

我正在尝试编写一个简单的命令,将一些文本右对齐,但如果不太合适,则将其移到下一行。因为一张图片胜过千言万语:

例子

“正常”情况是正确的 - 这就是它应该做的。但如果行太长,我希望它跳到下一行,如“所需”所示。目前,我所拥有的是“失败”。以下是我目前想到的:

\newcommand{\when}[1]{\hfill\mbox{\textit{#1}}}

笔记:我不得不手动用 把“所需”推到右边\\ \strut,但我希望宏能自动执行此操作,而不必挑选出需要手动执行此操作的情况。(简单地添加\\ \strut到宏中会导致“正常”情况的输出错误。)

答案1

在某些情况下,Herbert 和 Thorsten Donig 的答案都可能存在问题。一种情况是,末尾的内容需要换行,但该行也会开始新的一页。这会造成特别尴尬的寡妇,因为它会开始一个向右对齐的页面。另一个潜在问题涉及连字。Herbert 的解决方案在以带连字的单词开头的行上无法正常工作(即使有足够的空间向右对齐,它也会开始新的一行),而 Thorsten Donig 的解决方案似乎会破坏前一个单词的连字。

\documentclass{article}
\usepackage[papersize={10cm,5cm},textwidth=5cm,vmargin=5mm]{geometry}
\usepackage{calc,parskip}
\newcommand{\atend}{\makebox[2em][l]{\leaders\hbox{b}\hfill}}
\newcommand{\fillpage}{\vspace*{\textheight}\vspace*{-2\baselineskip}\vspace{-\parskip}}
\overfullrule=2pt
\pagestyle{empty}

\begin{document}
\fillpage

\newcommand\comfyfill[1]{{% = Herbert's \When
  \leftskip=0ptplus1fil\rightskip=-\leftskip\parfillskip=\leftskip
  \hfill \phantom{ } \textit{\mbox{#1}}\par}}

\makebox[\textwidth-2em]{\hrulefill a}\comfyfill{\atend}

\makebox[\textwidth-\widthof{charac- }]{\hrulefill} characterisation \comfyfill{\atend}

\makebox[\textwidth-\widthof{charac- }]{\hrulefill} charac- terisation \comfyfill{\atend}

\newpage
\fillpage

\renewcommand*{\comfyfill}[1]{% = Thorsten Donig's \signed
  \unskip\hspace*{1em plus 1fill}
  \nolinebreak[3]%
  \hspace*{\fill}\mbox{\emph{#1}}
  \parfillskip0pt\par
}

\makebox[\textwidth-2em]{\hrulefill a}\comfyfill{\atend}

\makebox[\textwidth-\widthof{charac- }]{\hrulefill} characterisation \comfyfill{\atend}

\makebox[\textwidth-\widthof{charac- }]{\hrulefill} charac- terisation \comfyfill{\atend}

\end{document}

以下是 Herbert 解决方案的输出: 赫伯特的\当

以下是 Thorsten Donig 的输出: 在此处输入图片描述

答案2

\documentclass[a5paper]{article}

\newcommand\When[1]{{%
  \leftskip=0ptplus1fil\rightskip=-\leftskip\parfillskip=\leftskip
  \hfill \phantom{ } \textit{\mbox{#1}}\par}}

\parindent=0pt

\begin{document}
\hrulefill

long long long long long long blub bla bla \When{2002--2010}
long long long long long long blub bla bla blaaah \When{2002--2010}
long long long long long long blub bla bla bla bla blaaaah \When{2002--2010}

long long long long long long blub bla bla bla bla blaaaah 
long long long long long long blub bla bla bla bla blaaaah 

\end{document}

替代文本

答案3

一个可能的解决方案可能是这样的。(我不知道宏名的其他名称,所以我选择了这个)。

\documentclass[11pt,a4paper,english]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{babel}

\newcommand*{\signed}[1]{%
  \unskip\hspace*{1em plus 1fill}
  \nolinebreak[3]%
  \hspace*{\fill}\mbox{\emph{#1}}
  \parfillskip0pt\par
}

\begin{document}
  The quick brown fox jumps over the lazy dog. \signed{2001--2002}

  With the new command the signature text should be shifted to the new line. \signed{2001--2002}
\end{document}

替代文本

答案4

您的原始代码几乎可以做到这一点。您只需在左侧添加一个空的\hbox{}(或更短的\null)即可使其在一行上独立工作。\hfill宏不能直接在行首工作。

这对于与您提供的一些类似的示例文本来说效果很好:

\documentclass{article}
\newcommand{\when}[1]{\hbox{}\hfill\mbox{\textit{#1}}}
\begin{document}
\subsubsection*{Headline}
text text text text text text text text text text text text text text text text text \when{2001-2002}
\subsubsection*{Headline}
text text text text text text text text text text text text text \when{2001-2002}
\end{document}

相关内容