我正在尝试编写一个简单的命令,将一些文本右对齐,但如果不太合适,则将其移到下一行。因为一张图片胜过千言万语:
“正常”情况是正确的 - 这就是它应该做的。但如果行太长,我希望它跳到下一行,如“所需”所示。目前,我所拥有的是“失败”。以下是我目前想到的:
\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}