在一次聊天讨论中,有人建议\hspace*{\fill}
(在前面留一个空格以允许换行)足以始终使后面的文本右对齐。事实上,它确实右对齐了。
但是,在一种情况下,它会插入一个额外的换行符,而这里不应该有换行符,如这里最后一个例子所示。我希望文本移动到下一行,当且仅当(当且仅当)没有房间:
如果我删除 之前的空格\hspace*{\fill}
,则会出现应该插入新行但却没有插入的情况(第二种和第三种情况):
相关问题:
我已经尝试了相关问题中的建议:
- Martin Scharrer 建议使用
\hbox{}\hfill
文本中最后一种情况的左侧结果。 - 赫伯特的
\When
宏在最后一种情况下也表现出类似的问题。 - Thorsten Donig 的
\signed
宏确实产生了正确的行数,但是中间两种情况的文件名部分出现在第二行,而它们很容易放在第一行。
笔记:
我相信这是无关这个问题,因为我可以在没有它的情况下重现这个问题。但是,我在这里提到它,以防它导致建议的解决方案出现问题。
我使用的\texttt
文件名。这导致了额外的复杂性,我最初认为这是问题的原因。因此,我的实际用例在下面被注释掉,它采用了来自
代码:
\documentclass{article}
\usepackage[paperwidth=7.0cm,showframe]{geometry}
\usepackage{xcolor}
\usepackage{xparse}
\newcommand*{\FillLine}[2]{%
\noindent\parbox{\linewidth}{%
\raggedright
File:~#2 % <-- Need space here
%Space before \hspace* allows for a break before it
\hspace*{\fill}\texttt{\small CONFIDENTIAL}%
}%
}
%\newcommand*{\EnableHyphenationInTexttt}{\hyphenchar\font=45\relax}
%
%\newcommand*{\FillLine}[2]{%
% \noindent\parbox{\linewidth}{%
% \raggedright
% File:~\texttt{\EnableHyphenationInTexttt#2} % <-- Need space here
% %Space before \hspace* allows for a break before it
% \hspace*{\fill}\texttt{\small CONFIDENTIAL}%
% }%
%}
\begin{document}
\FillLine{Name}{Value}
\bigskip
\FillLine{Name}{A-Long-Value}
\bigskip
\FillLine{Name}{iiiiiii-iiiii-iiiiiii}
\bigskip
\FillLine{Name}{Some-Really-Really-Long-Value}
\end{document}
答案1
你可以使用以下方法让 TeX 不要断行\linepenalty
\newcommand*{\FillLine}[2]{%
\noindent\parbox{\linewidth}{%
\rightskip\fill\parfillskip-\rightskip
\linepenalty100
\exhyphenpenalty0
File:~#2\linebreak[0] % <-- Need space here
%Space before \hspace* allows for a break before it
\hspace*{\fill}\texttt{\small CONFIDENTIAL}%
}%
}
答案2
在一些内部圈子里,这被称为布尔巴基问题。以下是根据您的需要做出的调整:
\documentclass{article}
\usepackage[paperwidth=7.0cm,showframe]{geometry}
\newcommand*{\FillLine}[2]{%
\noindent\parbox{\linewidth}{%
\raggedright
File:~#2%
{\nobreak\hfill\penalty50\hskip1em\null\nobreak
\hfill\texttt{\small CONFIDENTIAL}%
\parfillskip=0pt \finalhyphendemerits=0 \par}
}% End of \parbox
}
\begin{document}
\FillLine{Name}{Value}
\bigskip
\FillLine{Name}{A-Long-Value}
\bigskip
\FillLine{Name}{A-Long-Valu}
\bigskip
\FillLine{Name}{A-Long-Val}
\bigskip
\FillLine{Name}{A-Long-Va}
\bigskip
\FillLine{Name}{A-Long-V}
\bigskip
\FillLine{Name}{iiiiiii-iiiii-iiiiiii}
\bigskip
\FillLine{Name}{Some-Really-Really-Long-Value}
\end{document}
这是如何工作的?在 TeXbook 的源文件中查找“Bourbaki”。
答案3
我猜你的朋友是\looseness=-1
:http://www.tug.org/utilities/plain/cseq.html#looseness-rp
它没有提供理想的结果(最后一个例子中的中断被修改了),但它似乎运行得很好。
\documentclass{article}
\usepackage[paperwidth=7.0cm,showframe]{geometry}
\usepackage{xcolor}
\usepackage{xparse}
\newcommand*{\FillLine}[2]{%
\noindent\parbox{\linewidth}{%
\raggedright
\parfillskip-\rightskip
\looseness=-1
File:~#2\ % <-- Need space here
%Space before \hspace* allows for a break before it
\hspace*{0pt plus 1fil}%
\texttt{\small CONFIDENTIAL}%
}%
}
%\newcommand*{\EnableHyphenationInTexttt}{\hyphenchar\font=45\relax}
%
%\newcommand*{\FillLine}[2]{%
% \noindent\parbox{\linewidth}{%
% \raggedright
% File:~\texttt{\EnableHyphenationInTexttt#2} % <-- Need space here
% %Space before \hspace* allows for a break before it
% \hspace*{\fill}\texttt{\small CONFIDENTIAL}%
% }%
%}
\begin{document}
\FillLine{Name}{Value}
\bigskip
\FillLine{Name}{A-Long-Value}
\bigskip
\FillLine{Name}{iiiiiii-iiiii-iiiiiii}
\bigskip
\FillLine{Name}{Some-Really-Really-Long-Value}
\end{document}
答案4
这是来自这个问题这就满足了你的要求。将你想要右对齐的文本放入 中\signed{CONFIDENTIAL}
。
% Make author name appear right.
\def\signed #1{{\leavevmode\unskip\nobreak\hfil\penalty50\hskip2em
\hbox{}\nobreak\hfil#1%
\parfillskip=0pt \finalhyphendemerits=0 \endgraf}}
免责声明:我不明白这是如何运作的。