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

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

在一次聊天讨论中,有人建议\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=-1http://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}}

免责声明:我不明白这是如何运作的。

相关内容