![通过提前中断来禁止长单词流入边距](https://linux22.com/image/330074/%E9%80%9A%E8%BF%87%E6%8F%90%E5%89%8D%E4%B8%AD%E6%96%AD%E6%9D%A5%E7%A6%81%E6%AD%A2%E9%95%BF%E5%8D%95%E8%AF%8D%E6%B5%81%E5%85%A5%E8%BE%B9%E8%B7%9D.png)
我有时会写一些无法拆分的长单词,最后它们会超出右边距。我意识到,没有什么神奇的方法可以解决这个问题,唯一真正的解决办法就是拆分它们或重写文本。
不过,我正在尝试改变最后手段行为,以便它在长单词之前断行并将其设置为自然间距,同时调整段落的其余部分。
我已经找到了tex.sx 上的答案它根据每个单词定义一个命令,但这不会改变默认行为。此外,\lword
链接答案中的命令会导致前一行略微拉伸,并在非必需的地方插入换行符。我试图在我的\Lword
命令中修复这些问题。
理想情况下,我还希望可以选择[draft]
突出显示这些紧急换行符。
以下是我迄今为止尝试过的一些示例:
\documentclass[draft]{article}
\usepackage{showframe}
\usepackage{ragged2e}
\usepackage{color}
% https://tex.stackexchange.com/a/62347/99343
\newcommand*\lword[1]{%
\leavevmode
\nobreak
\hskip0pt plus\linewidth
\penalty50
\hskip0pt plus-\linewidth
\nobreak
\textcolor{red}{#1}%
}
% same as above, but with higher penalty and infinite stetch
\newcommand*\Lword[1]{%
\leavevmode
\nobreak
\hskip0pt plus 1fil
\penalty9999
\hskip0pt plus -1fil
\nobreak
\textcolor{blue}{#1}%
}
\newcommand*\test[4]{{%
#2%
\strut\llap{\smash{\begin{minipage}[t]{8em}\RaggedLeft #1\end{minipage} }}%
Aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa
#3{bbbbbbbbbbbbbbbbbbbbbbbbbbbbb}
aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa
aaaa aaaa aaaa aaaa aaaa aaaa aaaaa
#4{bbbbbbbbbbbbbbbbbbbbbbbbbbbbb}
aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa aaaa.
\par
}}
\setlength\parindent{0pt}
\setlength\parskip{1ex}
\begin{document}
\test{default rendering} {}{}{}
\test{manually inserted linebreak (desired result)}{}{\\}{}
\test{lword macro} {}{\lword}{\lword}
\test{Lword macro (desired result)} {}{\Lword}{\Lword}
\test{sloppy} {\sloppy}{}{}
\test{emergencystretch} {\emergencystretch10em}{}{}
\test{RaggedRight} {\RaggedRight}{}{}
\test{sloppy and RaggedRight} {\sloppy\RaggedRight}{}{}
\end{document}
这是我的实际问题:
- 是否有可能在不将潜在问题词语包装在额外命令中的情况下实现这种换行行为,如果可以,如何实现?
- 如果不这样做,我的改变是否会
\lword
产生任何副作用?
答案1
在现实生活中,您只需将\usepackage{microtype}
其放入序言中,这将有助于解决您的大部分麻烦。