短篇故事
如果某些文本无法全部放在当前行,我们希望全部文本移至下一行。我们该如何做呢?
中篇故事
假设我们有一串文本“banana banana”。将“banana [...]”的前几个字符放在当前行,将 banana 字符串的后半部分放在下一行,这是不理想的。
如果整个字符串适合当前行,那么就好,将字符串放在当前行。否则将字符串放在下一行。
不理想的情况:
apples apples apples banana
banana. cantaloupe cantaloupe
期望:
% a line break is inserted at the beginning
% of the bananas because they won't all fit
% on the current line.
apples apples apples
banana banana. cantaloupe cantaloupe
我们如何编写 LaTeX 代码来实现这一点?
长话短说
考虑以下测试文件。它不会编译,因为“ KEEP TOGETHER
”尚未定义。问题可以理解为:我们需要做什么才能使以下文件产生所需的行为?
\documentclass{minimal}
\begin{document}
apples apples apples apples
apples apples apples apples
apples apples apples apples
\begin{KEEP TOGETHER}
Banana tincidunt ante banana.
\end{KEEP TOGETHER}
cantaloupe cantaloupe cantaloupe
cantaloupe cantaloupe cantaloupe
cantaloupe cantaloupe.
\end{document}
假设这是被和STRYNG
包围的文本块。我们希望有以下行为:\begin{KEEP TOGETHER}
\end{KEEP TOGETHER}
SPACER = four character indent based on
current font size and other settings.
if (STRYNG will fit on what remains
of the current line) {
WILL_FIT_HERE = true;
}
if (STRYNG will fit on an almost empty
blank line, SPACER at the beginning) {
WILL_FIT_NEXT = true;
}
if [(not WILL_FIT_HERE) and (WILL_FIT_NEXT)] {
print a line break
print SPACER on the brand new empty line.
print all of STRYNG after the indent
print a line-break.
else {
print STRYNG in the output document as if STRYNG
were not inside of a "KEEP TOGETHER" block.
Exhibit the same behavior as if the
lines \begin{KEEP TOGETHER} and
\end{KEEP TOGETHER} were commented out.
This probably means that STRYNG (or at least
the beginning of string) will be printed on
the current line.
}
类似但不同的 Stack Exchange 问题
问题 1
有一个问题这与当前问题表达了同样的情感,但那问题太模糊了。不清楚想要什么。有些人将这个问题解释为“我们如何才能避免单词中间出现换行符?”他们认为将字符串的一半放在当前行,将另一半放在下一行是可以的。还有其他解释。
第二季度
提问者防止文本范围内换行对显示不包含空格字符的 URL 感兴趣。和我一样,他们希望在文本的最开头插入换行符,而不是在中间。但是,他们没有描述如果 URL 不能全部放在一行中,他们想要什么行为。在您正在阅读的问题中,我确实描述了在这种情况下需要什么行为。此外,对于其他询问者,也许 LaTeX 在到达右边界之前就将换行符插入 URL 中。也许他们希望 URL 中的字符一直运行到右边界,然后才插入换行符,而不是在此之前。我不确定他们想要什么。
第三季度
问题如何进行条件换行是关于\\
在没有后续文本的行上使用 LaTeX 代码:
blah blah \\ % no error
\\ % Error. no text proceeds `\\`
不可接受的解决方案
不可接受:总是在开头处换行
如果上面一行有足够的空间来容纳您想要保留的文本,那么总是插入换行符会显得很奇怪。
不可接受:不间断空格 ( ~
)
Cras~mattis~tincidunt~ante
出于一些原因,像这样的写法是不行的。首先,~
必须在任何地方插入,这很麻烦。其次,要“保持在一起”的字符串可能不包含任何空格字符,无法全部放在当前行中,但可以单独放在新行中。我们想要类似于的东西\begin{command}{BLOCK OF TEXT}\end{command}
。
不可接受:\nolinebreak
\nolinebreak
只在放置它的地方起作用一次,之后就不再起作用。插入\nolinebreak
十几个不同的地方会使源代码不可读。这个问题类似于使用~
。
答案1
可能满足你的需要
\documentclass{minimal}
\newcommand\zz[1]{\leavevmode
\hskip 0pt plus 1fill\penalty0 \hskip 0pt plus -1fill
\sbox0{#1}\ifdim\wd0>\linewidth\unhbox0\else\usebox0\fi\relax
}
\begin{document}
apples apples apples apples
apples apples apples apples
apples apples apples apples
appples apples appples apples
appples apples
\zz{Banana tincidunt ante banana.}
cantaloupe cantaloupe cantaloupe
cantaloupe cantaloupe cantaloupe
cantaloupe cantaloupe.
apples apples apples apples
apples apples apples apples
apples apples
appples apples
\zz{Banana tincidunt ante banana.}
cantaloupe cantaloupe cantaloupe
cantaloupe cantaloupe cantaloupe
cantaloupe cantaloupe.
apples apples apples apples
apples apples apples apples
apples apples apples apples
appples apples
\zz{Banana tincidunt ante banana.
Banana tincidunt ante banana.
Banana tincidunt ante banana.
Banana tincidunt ante banana.}
cantaloupe cantaloupe cantaloupe
cantaloupe cantaloupe cantaloupe
cantaloupe cantaloupe.
\end{document}