我使用soul
包进行突出显示。我注意到,\hl
如果单词太长,它将超出边距:
\hl{Loremipsumdolorsitamet,consetetursadipscingelitr,seddiamnonumyeirmodtemporinviduntutlaboreetdoloremagnaaliquyamerat,seddiamvoluptua.Atveroeosetaccusametjustoduodoloresetearebum.Stetclitakasdgubergren,noseatakimatasanctusestLoremipsumdolorsitamet}
我怎样才能让它自动换行?
答案1
从您的评论中,我了解到您想要自动断开行尾的长任意字符串而不使用连字符,此外这些字符串应该放在包\hl
提供的命令中soul
。
实际上,在不使用连字符的情况下自动断开行末的长字符串并不是一个大问题,并且已在这个很好的答案,您可以将其用作起点。但是,由于soul
包提供的宏会使用它们所输入的标记列表执行复杂的操作,因此我们需要谨慎处理此问题。
以下代码创建一个宏\hlautosplit
,该宏会在行尾自动断开字符串而不使用连字符,并将所有内容包装在\hl
命令中。
\documentclass{article}
\usepackage{soul}
\ExplSyntaxOn
\tl_new:N \l_hlautosplit_hlsplitstring_tl
\NewDocumentCommand{\hlautosplit} { m } {
\tl_clear:N \l_hlautosplit_hlsplitstring_tl
\str_map_inline:nn { #1 } {
\tl_put_right:Nn \l_hlautosplit_hlsplitstring_tl { ##1 \soulomit{\hspace{0pt plus 0.1pt}} }
}
\exp_args:No \hl { \l_hlautosplit_hlsplitstring_tl }
}
\ExplSyntaxOff
\begin{document}
\hlautosplit{Loremipsumdolorsitamet,consetetursadipscingelitr,seddiamnonumyeirmodtemporinviduntutlaboreetdoloremagnaaliquyamerat,seddiamvoluptua.Atveroeosetaccusametjustoduodoloresetearebum.Stetclitakasdgubergren,noseatakimatasanctusestLoremipsumdolorsitamet}
\end{document}
这里重要的是,您不能将任何\discretionary
连字符放入参数中\hl
或包提供的任何其他宏中soul
。但我们这里不需要这样做:相反,我们只需在每个字母后添加一个小空格,这样 TeX 就可以在任何字符处断开字符串。但是,我们需要使用 来屏蔽这个小空格,\soulomit
因为我们不想用soul
这个来打扰机制(如果我们不屏蔽它,它会抱怨)。最后,我们需要扩展我们刚刚创建的整个标记列表,然后才能在宏soul
中看到它\hl
。
结果为\sethlcolor{yellow}
: